From 7a2dfe2098b1122c340862552601e77bbcd9cbb0 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 19 May 2022 17:56:20 -0400 Subject: [PATCH 001/147] Initial commit --- shared/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 shared/LICENSE diff --git a/shared/LICENSE b/shared/LICENSE new file mode 100644 index 000000000..8904471e4 --- /dev/null +++ b/shared/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Ulixee + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 9472adcb79f51e6aa5729c4e3cf36aee2d5663f2 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 19 May 2022 18:21:29 -0400 Subject: [PATCH 002/147] chore: import from ulixee monorepo --- shared/.eslintignore | 3 + shared/.eslintrc.js | 3 + shared/.gitignore | 12 + shared/.husky/commit-msg | 4 + shared/.husky/pre-commit | 4 + shared/.husky/pre-push | 4 + shared/.npmignore | 4 + shared/CHANGELOG.md | 100 + shared/LICENSE | 2 +- shared/README.md | 68 + shared/commitlint.config.js | 1 + shared/config/index.ts | 119 + shared/config/servers.ts | 68 + shared/interfaces/ILog.ts | 17 + shared/interfaces/IPendingWaitEvent.ts | 18 + shared/interfaces/IRegisteredEventListener.ts | 48 + shared/interfaces/IResolvablePromise.ts | 9 + shared/interfaces/ISourceCodeLocation.ts | 5 + shared/interfaces/ITypedEventEmitter.ts | 49 + shared/interfaces/SameSiteContext.ts | 9 + shared/interfaces/TimeoutError.ts | 10 + shared/jest.config.js | 9 + shared/lib/EventSubscriber.ts | 76 + shared/lib/IpcUtils.ts | 8 + shared/lib/Logger.ts | 287 + shared/lib/Queue.ts | 125 + shared/lib/Resolvable.ts | 87 + shared/lib/SessionClosedOrMissingError.ts | 11 + shared/lib/ShutdownHandler.ts | 73 + shared/lib/SourceLoader.ts | 59 + shared/lib/SourceMapSupport.ts | 259 + shared/lib/SqliteTable.ts | 130 + shared/lib/Timer.ts | 87 + shared/lib/TypeSerializer.ts | 238 + shared/lib/VersionUtils.ts | 8 + shared/lib/decodeBuffer.ts | 34 + shared/lib/dirUtils.ts | 18 + shared/lib/downloadFile.ts | 84 + shared/lib/eventUtils.ts | 252 + shared/lib/fileUtils.ts | 35 + shared/lib/getProxyForUrl.ts | 87 + shared/lib/utils.ts | 147 + shared/package.build.json | 3 + shared/package.dist.json | 4 + shared/package.json | 45 + shared/test/SourceLoader.test.ts | 15 + shared/test/SourceMapSupport.test.ts | 297 + shared/test/TypeSerializer.test.ts | 31 + shared/test/utils.test.ts | 58 + shared/tsconfig.dist.json | 8 + shared/tsconfig.json | 17 + shared/yarn.lock | 5002 +++++++++++++++++ 52 files changed, 8150 insertions(+), 1 deletion(-) create mode 100644 shared/.eslintignore create mode 100644 shared/.eslintrc.js create mode 100644 shared/.gitignore create mode 100755 shared/.husky/commit-msg create mode 100755 shared/.husky/pre-commit create mode 100755 shared/.husky/pre-push create mode 100644 shared/.npmignore create mode 100644 shared/CHANGELOG.md create mode 100644 shared/README.md create mode 100644 shared/commitlint.config.js create mode 100644 shared/config/index.ts create mode 100644 shared/config/servers.ts create mode 100644 shared/interfaces/ILog.ts create mode 100644 shared/interfaces/IPendingWaitEvent.ts create mode 100644 shared/interfaces/IRegisteredEventListener.ts create mode 100644 shared/interfaces/IResolvablePromise.ts create mode 100644 shared/interfaces/ISourceCodeLocation.ts create mode 100644 shared/interfaces/ITypedEventEmitter.ts create mode 100644 shared/interfaces/SameSiteContext.ts create mode 100644 shared/interfaces/TimeoutError.ts create mode 100644 shared/jest.config.js create mode 100644 shared/lib/EventSubscriber.ts create mode 100644 shared/lib/IpcUtils.ts create mode 100644 shared/lib/Logger.ts create mode 100644 shared/lib/Queue.ts create mode 100644 shared/lib/Resolvable.ts create mode 100644 shared/lib/SessionClosedOrMissingError.ts create mode 100644 shared/lib/ShutdownHandler.ts create mode 100644 shared/lib/SourceLoader.ts create mode 100644 shared/lib/SourceMapSupport.ts create mode 100644 shared/lib/SqliteTable.ts create mode 100644 shared/lib/Timer.ts create mode 100644 shared/lib/TypeSerializer.ts create mode 100644 shared/lib/VersionUtils.ts create mode 100644 shared/lib/decodeBuffer.ts create mode 100644 shared/lib/dirUtils.ts create mode 100644 shared/lib/downloadFile.ts create mode 100644 shared/lib/eventUtils.ts create mode 100644 shared/lib/fileUtils.ts create mode 100644 shared/lib/getProxyForUrl.ts create mode 100644 shared/lib/utils.ts create mode 100644 shared/package.build.json create mode 100644 shared/package.dist.json create mode 100644 shared/package.json create mode 100644 shared/test/SourceLoader.test.ts create mode 100644 shared/test/SourceMapSupport.test.ts create mode 100644 shared/test/TypeSerializer.test.ts create mode 100644 shared/test/utils.test.ts create mode 100644 shared/tsconfig.dist.json create mode 100644 shared/tsconfig.json create mode 100644 shared/yarn.lock diff --git a/shared/.eslintignore b/shared/.eslintignore new file mode 100644 index 000000000..fd4fd720f --- /dev/null +++ b/shared/.eslintignore @@ -0,0 +1,3 @@ +.eslintrc.js +*.config.js +tsconfig*.json diff --git a/shared/.eslintrc.js b/shared/.eslintrc.js new file mode 100644 index 000000000..fffea6192 --- /dev/null +++ b/shared/.eslintrc.js @@ -0,0 +1,3 @@ +const { monorepo } = require('@ulixee/repo-tools/eslint'); + +module.exports = monorepo(__dirname); diff --git a/shared/.gitignore b/shared/.gitignore new file mode 100644 index 000000000..1365d38eb --- /dev/null +++ b/shared/.gitignore @@ -0,0 +1,12 @@ +node_modules +*yarn-error.log +npm-debug.log +lerna-debug.log +.DS_Store + +.idea/ +.history/ + +build +build-dist +/.eslintcache diff --git a/shared/.husky/commit-msg b/shared/.husky/commit-msg new file mode 100755 index 000000000..5426a9320 --- /dev/null +++ b/shared/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx commitlint --edit $1 diff --git a/shared/.husky/pre-commit b/shared/.husky/pre-commit new file mode 100755 index 000000000..36af21989 --- /dev/null +++ b/shared/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx lint-staged diff --git a/shared/.husky/pre-push b/shared/.husky/pre-push new file mode 100755 index 000000000..449fcdee1 --- /dev/null +++ b/shared/.husky/pre-push @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm test diff --git a/shared/.npmignore b/shared/.npmignore new file mode 100644 index 000000000..721ffc8e5 --- /dev/null +++ b/shared/.npmignore @@ -0,0 +1,4 @@ +.eslint* +.gitignore +package.build.json +tsconfig* diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md new file mode 100644 index 000000000..f8019dd1a --- /dev/null +++ b/shared/CHANGELOG.md @@ -0,0 +1,100 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [2.0.0-alpha.3](https://github.com/ulixee/ulixee/compare/v2.0.0-alpha.2...v2.0.0-alpha.3) (2022-05-19) + +**Note:** Version bump only for package @ulixee/commons + + + + + +# [2.0.0-alpha.2](https://github.com/ulixee/ulixee/compare/v2.0.0-alpha.1...v2.0.0-alpha.2) (2022-05-17) + +**Note:** Version bump only for package @ulixee/commons + + + + + +# 2.0.0-alpha.1 (2022-05-16) + + +### Bug Fixes + +* **chromealive:** fix bar positioning and focus ([d47d805](https://github.com/ulixee/ulixee/commit/d47d80514f78f1f92c3bcdcdde6094c1eab28a50)) +* **chromealive:** launch from boss ([dc7ad0d](https://github.com/ulixee/ulixee/commit/dc7ad0d4247052d937cbfbb5e6f85c6f1dcd0424)) +* **chromealive:** support multiple page states ([2e98ef6](https://github.com/ulixee/ulixee/commit/2e98ef6f1bbc4de3962aec4022435d9e7e1e8500)) +* **commons:** move typeserializer test ([a5aa1b8](https://github.com/ulixee/ulixee/commit/a5aa1b8173a897338896e2bf48bae73397d62d76)) +* **commons:** tweak small commons features ([14c7c5f](https://github.com/ulixee/ulixee/commit/14c7c5fcf30f3357298c313a6259e2e3bf87437a)) +* **commons:** windows logger package formatting ([8590b08](https://github.com/ulixee/ulixee/commit/8590b08d1fcdf735d37cf92ae60636cf43f9c6bf)) +* lint ([f7407ac](https://github.com/ulixee/ulixee/commit/f7407ac4e9ea5f5b95643a9e76fd25a26cba0ddf)) +* lint require return types ([a829f3f](https://github.com/ulixee/ulixee/commit/a829f3f150e788618f273c7ccfea0a3088ee41d5)) +* **pagestate:** service worker dying ([9611927](https://github.com/ulixee/ulixee/commit/9611927eedc6e70321ab0f02c083504a47d203bb)) +* sourceLoader test broken ([f68fba8](https://github.com/ulixee/ulixee/commit/f68fba842321b675454fb28300c618b0d394e788)) +* **stacks:** don't undo stack traces ([5e72271](https://github.com/ulixee/ulixee/commit/5e7227102d6fe3f58807db1b04de3531d891bead)) + + +### Features + +* add logs to boss ([af1905f](https://github.com/ulixee/ulixee/commit/af1905f408df9e1d071ec3cd9e360f1867e413a5)) +* added a working databox ([53628c5](https://github.com/ulixee/ulixee/commit/53628c56103c59c962d9d3a76eb51c682e06244b)) +* added submodules ([6f97e86](https://github.com/ulixee/ulixee/commit/6f97e86bd876bddc9fe8cab0a3ebdf08913c8dae)) +* **apps:** add version to boot ([43cc0db](https://github.com/ulixee/ulixee/commit/43cc0db17fe1ba955ef51cdda5dcc30d0bcfc9de)) +* **chromealive:** add a mode ([52b70f7](https://github.com/ulixee/ulixee/commit/52b70f7bbd94f1045a89a13d8933af15dcbbeaf2)) +* **chromealive:** add pagestate to ui ([d3b428d](https://github.com/ulixee/ulixee/commit/d3b428d5d1cf1711e396d9e9a1b34ffa537292dc)) +* **chromealive:** autoupdate ([b95f86d](https://github.com/ulixee/ulixee/commit/b95f86d1592dac0d73f38cd9032e9c845d79b255)) +* **chromealive:** custom message for kept-alive ([fcec203](https://github.com/ulixee/ulixee/commit/fcec203663287245a12c9caf94be1e907b5804fa)) +* **chromealive:** hero script ([c3d093c](https://github.com/ulixee/ulixee/commit/c3d093cd6cb50919f4fe4a882e37b0784b418cf1)) +* **chromealive:** move timeline over chrome ([f7992ad](https://github.com/ulixee/ulixee/commit/f7992ade9004afc6a36af914d7851154869152b7)) +* **chromealive:** nav using hero script lines ([82f9f1b](https://github.com/ulixee/ulixee/commit/82f9f1bde103192b945d116790579d0ecf59b198)) +* **chromealive:** new menubar + features ([0131927](https://github.com/ulixee/ulixee/commit/01319278c4a1adf2cc022c6c86b05712fa0f55bc)) +* **chromealive:** pause/resume script ([2d99aa1](https://github.com/ulixee/ulixee/commit/2d99aa12bb68d7cfd5e1949f696afc5805fb9b4b)) +* collected snippets ([7ecd540](https://github.com/ulixee/ulixee/commit/7ecd5405b7aec12815d0efc4258a0aa3efdac48a)) +* **commons:** source map + code loading support ([ec0bb70](https://github.com/ulixee/ulixee/commit/ec0bb70ff0656535cf4be37db9615d2987909e69)) +* **commons:** ulixee config ([b02d3ce](https://github.com/ulixee/ulixee/commit/b02d3ce4dfd04f12f7686711a9ab95c08f02e96b)) +* convert secret-agent to browser only ([968208f](https://github.com/ulixee/ulixee/commit/968208f0690900dfc641ad4c8fd47b51eef6fa11)) +* databox and herobox and merged... working with errors ([2d72035](https://github.com/ulixee/ulixee/commit/2d720353f4c442ac03a41b290c1e25bb501cf94a)) +* **finder:** added infrastructure needed for the chromealive finder window ([068fae6](https://github.com/ulixee/ulixee/commit/068fae6f7eda4ebc936cd95caa28e33a29a46e39)) +* get collected asset names ([559c4cb](https://github.com/ulixee/ulixee/commit/559c4cb5fb7ae7c349da0c95ba005b8fb551558e)) +* **herobox:** add herobox ([785f801](https://github.com/ulixee/ulixee/commit/785f80128370c7dd40711ab58c1366919af3efb6)) +* **herobox:** convert collect to by async get ([8e52752](https://github.com/ulixee/ulixee/commit/8e52752c07156de91bf0fd9c676da55b135c9c88)) +* **herobox:** synchronous fragments ([2e46083](https://github.com/ulixee/ulixee/commit/2e46083432fd60dfef5f3c5b93e1ff1380329f39)) +* merge devtools submodules ([a27ea33](https://github.com/ulixee/ulixee/commit/a27ea339784f0a5a969517571f0d6e21d5dfb52f)) +* **pagestate:** storage tracking ([1abaf29](https://github.com/ulixee/ulixee/commit/1abaf29e8d88fe37dd956b2c0b1b2b858bb97368)) +* **server:** automatically track server host ([aa42f4d](https://github.com/ulixee/ulixee/commit/aa42f4df27414928f04c4bd6d074bb17fd23213c)) +* unify plugin structure ([ac6c30a](https://github.com/ulixee/ulixee/commit/ac6c30afd518c67b3230ff2109c90d381e21aaec)) +* unify typescript for ulixee project ([697dc2f](https://github.com/ulixee/ulixee/commit/697dc2fa5e4cc9a3064f7bb17253d7ec88f1793c)) +* update deps to chromealive ([dcf9aaa](https://github.com/ulixee/ulixee/commit/dcf9aaa653fec6aadc5878dd7a8d3565e151dc26)) +* update testing ([aaf339c](https://github.com/ulixee/ulixee/commit/aaf339c2aa810c8303c948c872a03486e8f76396)) +* updated hero submodule to use new @ulixee/hero ([32edb90](https://github.com/ulixee/ulixee/commit/32edb90f0abeef99170817aa676f141a26f986ee)) + + + + + +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +### [1.5.5](https://github.com/ulixee/commons/compare/v1.5.4...v1.5.5) (2021-07-25) + + +### Bug Fixes + +* lint ([f886e24](https://github.com/ulixee/commons/commit/f886e242a58f078399285a12c557a42f873001a3)) + +### 1.5.4 (2021-07-25) + + +### Features + +* added code from hero ([e2d9d8d](https://github.com/ulixee/commons/commit/e2d9d8df959a242fd4c306cd568f2010181279bc)) +* moved code to lib folder + added prettier/lint/etc ([3401a82](https://github.com/ulixee/commons/commit/3401a8258f9811777226f723ab2aa9c25f84455b)) + + +### Bug Fixes + +* added some fixes per Blake's feedback ([832a6c1](https://github.com/ulixee/commons/commit/832a6c1a109d7b8c45ce99e361241ac172f2906b)) diff --git a/shared/LICENSE b/shared/LICENSE index 8904471e4..012aec614 100644 --- a/shared/LICENSE +++ b/shared/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Ulixee +Copyright (c) 2022 The Unblocked Project, a Ulixee Production Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/shared/README.md b/shared/README.md new file mode 100644 index 000000000..d1a6d176f --- /dev/null +++ b/shared/README.md @@ -0,0 +1,68 @@ +# JsPath + +JsPath is a serializable specification for referencing a path to a DOM node, property or method. + +This library was created as a way to create paths to methods and properties of the DOM remotely. Breaking a path into individual steps allows a library to create references to nested objects (eg, passing a Node into a function) without AST parsing a string of code. It also provides a mechanism for creating "references" to nodes (NodePointer.id), dynamically inspecting properties (appending internal state methods), and more without requiring any parsing. + +For a fully-typed implementation of accessing a remote DOM, refer to the [AwaitedDOM](https://docs.ulixee.org/docs/hero/basic-interfaces/awaited-dom). + +### IJsPath + +IJsPath is an array of "steps" to locate (or re-locate) a node. Steps can be the following: + +- An [INodePointer](#inodepointer) id `number`. eg: `[1]`. +- A Function `Array`. `[MethodName, ...arguments]`, eg: `['document', ['querySelector','p']]`. +- A Property name `string`. eg: `[1, 'innerText']` will get the innerText of node with NodePointer id = 1. + +### INodePointer + +INodePointer is a persisted reference to a DOM Node. It includes extra details about a node. An iterable Node type will serialize the properties as well. + +NOTE: A DOM Node could also be a querySelector, and can be used to re-retrieve instance properties. + +- id: `number`. The Id that can be used in future references to this DOM Node. +- type: `string`. The type of DOM Node. eg, `HTMLDivElement`. +- preview?: `string`. A string preview of the HTML Element or DOM Node. +- iterableIsNodePointers?: `boolean`. If iterableItems are provided, returns `true` if the items are `INodePointers`. +- iterableItems?: `(string | number | boolean | object | INodePointer)[]`. The serialized iterable properties if this result set is iterable. eg, HTMLCollection, NodeList, Attributes, etc. + +### INodeVisibility + +INodeVisibility interface represents the various attributes of visibility a DOM Node possesses. It can be used to determine if a Node can be interacted with on a Webpage. + +NOTE: It is up to an implementation library to create the mechanism for requesting the visibility of a node. + +The returned properties will be calculated and returned as follows: + +- isVisible `boolean`. The node is visible (`nodeExists`, `hasContainingElement`, `isConnected`, `hasCssOpacity`,`hasCssDisplay`,`hasCssVisibility` `hasDimensions`). +- isClickable `boolean`. The node is visible, in the viewport and unobstructed (`isVisible`, `isOnscreenVertical`, `isOnscreenHorizontal` and `isUnobstructedByOtherElements`). +- nodeExists `boolean`. Was the node found in the DOM. +- isOnscreenVertical `boolean`. The node is on-screen vertically. +- isOnscreenHorizontal `boolean`. The node is on-screen horizontally. +- hasContainingElement `boolean`. The node is an Element or has a containing Element providing layout. +- isConnected `boolean`. The node is connected to the DOM. +- hasCssOpacity `boolean`. The display `opacity` property is not "0". +- hasCssDisplay `boolean`. The display `display` property is not "none". +- hasCssVisibility `boolean`. The visibility `style` property is not "hidden". +- hasDimensions `boolean`. The node has width and height. +- isUnobstructedByOtherElements `boolean`. The node is not hidden or obscured > 50% by another element. + +## Installation + +```shell script +npm i --save @unblocked-web/js-path +``` + +or + +```shell script +yarn add @unblocked-web/js-path +``` + +## Contributing + +Contributions are welcome. + +## License + +[MIT](LICENSE) diff --git a/shared/commitlint.config.js b/shared/commitlint.config.js new file mode 100644 index 000000000..422b19445 --- /dev/null +++ b/shared/commitlint.config.js @@ -0,0 +1 @@ +module.exports = { extends: ['@commitlint/config-conventional'] }; diff --git a/shared/config/index.ts b/shared/config/index.ts new file mode 100644 index 000000000..2de9b200d --- /dev/null +++ b/shared/config/index.ts @@ -0,0 +1,119 @@ +import * as Fs from 'fs'; +import * as Path from 'path'; +import { getCacheDirectory } from '../lib/dirUtils'; +import { safeOverwriteFile } from '../lib/fileUtils'; + +export default class UlixeeConfig { + public static get global(): UlixeeConfig { + this.globalConfig ??= new UlixeeConfig(this.globalConfigDirectory); + return this.globalConfig; + } + + public static isCacheEnabled = process.env.NODE_END === 'production'; + + private static globalConfigDirectory = Path.join(getCacheDirectory(), 'ulixee'); + private static globalConfig: UlixeeConfig; + + private static configDirectoryName = '.ulixee'; + private static cachedConfigLocations: { [cwd_entrypoint: string]: string } = {}; + private static cachedConfigObjects: { [cwd_entrypoint: string]: UlixeeConfig } = {}; + + public serverHost?: string; + + private get configPath(): string { + return Path.join(this.directoryPath, 'config.json'); + } + + constructor(readonly directoryPath: string) { + if (Fs.existsSync(this.configPath)) { + const data = JSON.parse(Fs.readFileSync(this.configPath, 'utf8')); + this.serverHost = data.serverHost; + } + } + + public async setGlobalDefaults(): Promise { + this.serverHost ??= 'localhost:1337'; + await this.save(); + } + + public save(): Promise { + return safeOverwriteFile(this.configPath, JSON.stringify(this.getData(), null, 2)); + } + + private getData(): IUlixeeConfig { + return { + serverHost: this.serverHost, + }; + } + + public static load(runtimeLocation?: IRuntimeLocation): UlixeeConfig { + runtimeLocation = this.useRuntimeLocationDefaults(runtimeLocation); + const key = this.getLocationKey(runtimeLocation); + if (!this.cachedConfigObjects[key]) { + const directory = this.findConfigDirectory(runtimeLocation); + if (directory === this.globalConfigDirectory) return UlixeeConfig.global; + if (!this.isCacheEnabled) return new UlixeeConfig(directory); + + this.cachedConfigObjects[key] = new UlixeeConfig(directory); + } + return this.cachedConfigObjects[key]; + } + + public static findConfigDirectory(runtimeLocation?: IRuntimeLocation): string { + runtimeLocation = this.useRuntimeLocationDefaults(runtimeLocation); + const key = this.getLocationKey(runtimeLocation); + if (!this.cachedConfigLocations[key]) { + const configDirectory = this.traverseDirectories(runtimeLocation); + if (!this.isCacheEnabled) return configDirectory; + + this.cachedConfigLocations[key] = configDirectory; + } + + return this.cachedConfigLocations[key]; + } + + private static useRuntimeLocationDefaults(runtimeLocation?: IRuntimeLocation): IRuntimeLocation { + return { + entrypoint: runtimeLocation?.entrypoint ?? require.main?.filename ?? process.argv[1], + workingDirectory: runtimeLocation?.workingDirectory ?? process.cwd(), + }; + } + + private static getLocationKey(runtimeLocation: IRuntimeLocation): string { + return `${runtimeLocation.workingDirectory}_${runtimeLocation.entrypoint}`; + } + + private static traverseDirectories(runtimeLocation: IRuntimeLocation): string { + const { entrypoint, workingDirectory } = runtimeLocation; + // look up hierarchy from the entrypoint of the script + let currentPath = Path.dirname(entrypoint); + do { + const upDirectory = Path.normalize(Path.join(currentPath, '..')); + if (upDirectory === currentPath) break; + currentPath = upDirectory; + + const configPath = this.hasConfigDirectory(currentPath); + if (configPath) return configPath; + } while (currentPath.length && Fs.existsSync(currentPath)); + + const configPath = this.hasConfigDirectory(workingDirectory); + if (configPath) return configPath; + + // global directory is the working directory + return this.globalConfigDirectory; + } + + private static hasConfigDirectory(path: string): string { + const pathToCheck = Path.normalize(Path.join(path, this.configDirectoryName)); + if (Fs.existsSync(pathToCheck) && Fs.statSync(pathToCheck).isDirectory()) return pathToCheck; + } +} + +export interface IUlixeeConfig { + serverHost: string; +} + +export interface IRuntimeLocation { + workingDirectory: string; + entrypoint: string; +} diff --git a/shared/config/servers.ts b/shared/config/servers.ts new file mode 100644 index 000000000..91b191481 --- /dev/null +++ b/shared/config/servers.ts @@ -0,0 +1,68 @@ +import * as Fs from 'fs'; +import * as Path from 'path'; +import { getCacheDirectory } from '../lib/dirUtils'; +import { safeOverwriteFile } from '../lib/fileUtils'; +import { isSemverSatisfied } from '../lib/VersionUtils'; + +export default class UlixeeServerConfig { + public static global = new UlixeeServerConfig(Path.join(getCacheDirectory(), 'ulixee')); + + public hostByVersion: IUlixeeServerConfig['hostByVersion'] = {}; + + private get configPath(): string { + return Path.join(this.directoryPath, 'servers.json'); + } + + constructor(readonly directoryPath: string) { + if (Fs.existsSync(this.configPath)) { + const data: IUlixeeServerConfig = JSON.parse(Fs.readFileSync(this.configPath, 'utf8')); + this.hostByVersion = data.hostByVersion ?? {}; + } + } + + public async setVersionHost(version: string, host: string): Promise { + if (!host) delete this.hostByVersion[version]; + else { + let serverModulePath: string; + try { + serverModulePath = require.resolve('@ulixee/server'); + } catch (err) {} + this.hostByVersion[version] = { + host, + nodePath: process.execPath, + serverModulePath, + }; + } + await this.save(); + } + + public hasServers(): boolean { + return Object.keys(this.hostByVersion).length > 0; + } + + public getVersionHost(version: string): string { + if (this.hostByVersion[version]) return this.hostByVersion[version].host; + for (const [hostVersion, info] of Object.entries(this.hostByVersion)) { + if (isSemverSatisfied(version, hostVersion)) { + return info.host; + } + } + return null; + } + + public save(): Promise { + return safeOverwriteFile(this.configPath, JSON.stringify(this.getData(), null, 2)); + } + + private getData(): IUlixeeServerConfig { + return { + hostByVersion: this.hostByVersion, + }; + } +} + +export interface IUlixeeServerConfig { + hostByVersion: { + [version: string]: { host: string; nodePath: string; serverModulePath: string }; + }; +} diff --git a/shared/interfaces/ILog.ts b/shared/interfaces/ILog.ts new file mode 100644 index 000000000..c65b2d24a --- /dev/null +++ b/shared/interfaces/ILog.ts @@ -0,0 +1,17 @@ +export default interface ILog extends IBoundLog { + level: string; + flush(); +} + +export interface IBoundLog { + stats(action: string, data?: T): number; + info(action: string, data?: T): number; + warn(action: string, data?: T): number; + error(action: string, data?: T): number; + createChild(module, boundData?: any): IBoundLog; +} + +export interface ILogData { + sessionId: string; + parentLogId?: number; +} diff --git a/shared/interfaces/IPendingWaitEvent.ts b/shared/interfaces/IPendingWaitEvent.ts new file mode 100644 index 000000000..8a13cbaf9 --- /dev/null +++ b/shared/interfaces/IPendingWaitEvent.ts @@ -0,0 +1,18 @@ +import IResolvablePromise from './IResolvablePromise'; +import { registerSerializableErrorType } from '../lib/TypeSerializer'; + +export class CanceledPromiseError extends Error { + constructor(message: string) { + super(message); + this.name = 'CanceledPromiseError'; + } +} + +export default interface IPendingWaitEvent { + id: number; + event: string | symbol; + resolvable: IResolvablePromise; + error: CanceledPromiseError; +} + +registerSerializableErrorType(CanceledPromiseError); diff --git a/shared/interfaces/IRegisteredEventListener.ts b/shared/interfaces/IRegisteredEventListener.ts new file mode 100644 index 000000000..1dc7d8bc4 --- /dev/null +++ b/shared/interfaces/IRegisteredEventListener.ts @@ -0,0 +1,48 @@ +import ITypedEventEmitter from './ITypedEventEmitter'; + +export type Callback = (...args: any[]) => void; +export type EventName = string | symbol; + +export default interface IRegisteredEventListener { + emitter: { off(event: string | symbol, listener: Callback) }; + eventName: EventName; + handler: (...args: any[]) => void; +} + +export interface IEventSubscriber { + on( + emitter: ITypedEventEmitter, + eventName: K, + handler: (this: ITypedEventEmitter, event?: T[K], initiator?: any) => any, + includeUnhandledEvents?: boolean, + ): IRegisteredEventListener; + on( + emitter: { + on(event: EventName, listener: Callback, includeUnhandledEvents?: boolean); + off(event: EventName, listener: Callback); + }, + eventName: EventName, + handler: Callback, + includeUnhandledEvents?: boolean, + ): IRegisteredEventListener; + + once( + emitter: ITypedEventEmitter, + eventName: K, + handler: (this: ITypedEventEmitter, event?: T[K], initiator?: any) => any, + includeUnhandledEvents?: boolean, + ): IRegisteredEventListener; + once( + emitter: { + once(event: EventName, listener: Callback, includeUnhandledEvents?: boolean); + off(event: EventName, listener: Callback); + }, + eventName: EventName, + handler: Callback, + includeUnhandledEvents?: boolean, + ): IRegisteredEventListener; + + off(...events: IRegisteredEventListener[]): void; + + close(...keepEvents: string[]): void; +} diff --git a/shared/interfaces/IResolvablePromise.ts b/shared/interfaces/IResolvablePromise.ts new file mode 100644 index 000000000..d649ad1fa --- /dev/null +++ b/shared/interfaces/IResolvablePromise.ts @@ -0,0 +1,9 @@ +export default interface IResolvablePromise extends PromiseLike { + isResolved: boolean; + resolved: T; + stack?: string; + promise?: Promise; + resolve?: (value?: T | PromiseLike) => void; + reject?: (reason?: any) => void; + timeout?: NodeJS.Timeout; +} diff --git a/shared/interfaces/ISourceCodeLocation.ts b/shared/interfaces/ISourceCodeLocation.ts new file mode 100644 index 000000000..31240db1f --- /dev/null +++ b/shared/interfaces/ISourceCodeLocation.ts @@ -0,0 +1,5 @@ +export default interface ISourceCodeLocation { + filename: string; + line: number; + column: number; +} diff --git a/shared/interfaces/ITypedEventEmitter.ts b/shared/interfaces/ITypedEventEmitter.ts new file mode 100644 index 000000000..074b6e6f9 --- /dev/null +++ b/shared/interfaces/ITypedEventEmitter.ts @@ -0,0 +1,49 @@ +export default interface ITypedEventEmitter { + waitOn( + eventType: K, + listenerFn?: (this: this, event?: T[K]) => boolean, + timeoutMillis?: number, + ): Promise; + + on( + eventType: K, + listenerFn: (this: this, event?: T[K]) => any, + includeUnhandledEvents?: boolean, + ): this; + + off( + event: K, + listener: (this: this, event?: T[K]) => any, + ): this; + + once( + eventType: K, + listenerFn: (this: this, event?: T[K]) => any, + includeUnhandledEvents?: boolean, + ): this; + + emit(eventType: K, event?: T[K]): boolean; + + addListener( + event: K, + listener: (this: this, event?: T[K]) => any, + includeUnhandledEvents?: boolean, + ): this; + + removeListener( + event: K, + listener: (this: this, event?: T[K]) => any, + ): this; + + prependListener( + event: K, + listener: (this: this, event?: T[K]) => void, + includeUnhandledEvents?: boolean, + ): this; + + prependOnceListener( + event: K, + listener: (this: this, event?: T[K]) => void, + includeUnhandledEvents?: boolean, + ): this; +} diff --git a/shared/interfaces/SameSiteContext.ts b/shared/interfaces/SameSiteContext.ts new file mode 100644 index 000000000..835b5d646 --- /dev/null +++ b/shared/interfaces/SameSiteContext.ts @@ -0,0 +1,9 @@ +const sameSiteContext = ['none', 'strict', 'lax'] as const; + +type SameSiteContext = typeof sameSiteContext[number]; + +export function isSameSiteContext(type: string): boolean { + return sameSiteContext.includes(type as any); +} + +export default SameSiteContext; diff --git a/shared/interfaces/TimeoutError.ts b/shared/interfaces/TimeoutError.ts new file mode 100644 index 000000000..d5654ffae --- /dev/null +++ b/shared/interfaces/TimeoutError.ts @@ -0,0 +1,10 @@ +import { registerSerializableErrorType } from '../lib/TypeSerializer'; + +export default class TimeoutError extends Error { + constructor(message?: string) { + super(message ?? 'Timeout waiting for promise'); + this.name = 'TimeoutError'; + } +} + +registerSerializableErrorType(TimeoutError); diff --git a/shared/jest.config.js b/shared/jest.config.js new file mode 100644 index 000000000..8562b694a --- /dev/null +++ b/shared/jest.config.js @@ -0,0 +1,9 @@ + +module.exports = {verbose: false, + testMatch: ['**/test/*.test.js'], + testEnvironment: 'node', + collectCoverage: false, + transform: {}, + testTimeout: 15e3, + reporters: ['default', 'jest-summary-reporter'] +}; diff --git a/shared/lib/EventSubscriber.ts b/shared/lib/EventSubscriber.ts new file mode 100644 index 000000000..5de656857 --- /dev/null +++ b/shared/lib/EventSubscriber.ts @@ -0,0 +1,76 @@ +import IRegisteredEventListener, { IEventSubscriber } from '../interfaces/IRegisteredEventListener'; + +type AnyFunction = (...args: any[]) => any; + +export default class EventSubscriber implements IEventSubscriber { + public groups: { [key: string]: IRegisteredEventListener[] } = {}; + private readonly registeredEventListeners = new Set(); + + on( + emitter: { + on( + event: K, + listener: (...args: Parameters) => ReturnType, + includeUnhandledEvents?: boolean, + ); + off(event: K, listener: (...args: Parameters) => ReturnType); + }, + eventName: K, + handler: (...args: Parameters) => ReturnType, + includeUnhandledEvents?: boolean, + ): IRegisteredEventListener { + emitter.on(eventName, handler, includeUnhandledEvents); + const registeredEvent: IRegisteredEventListener = { emitter, eventName, handler }; + this.registeredEventListeners.add(registeredEvent); + return registeredEvent; + } + + once( + emitter: { + once( + event: K, + listener: (...args: Parameters) => ReturnType, + includeUnhandledEvents?: boolean, + ); + off(event: K, listener: (...args: Parameters) => ReturnType); + }, + eventName: K, + handler: (...args: Parameters) => ReturnType, + includeUnhandledEvents?: boolean, + ): IRegisteredEventListener { + emitter.once(eventName, handler, includeUnhandledEvents); + const registeredEvent: IRegisteredEventListener = { emitter, eventName, handler }; + this.registeredEventListeners.add(registeredEvent); + return registeredEvent; + } + + off(...listeners: IRegisteredEventListener[]): void { + for (const listener of listeners) { + listener.emitter.off(listener.eventName, listener.handler); + this.registeredEventListeners.delete(listener); + } + listeners.length = 0; + } + + close(...keepMockEvents: (string | symbol)[]): void { + for (const listener of this.registeredEventListeners) { + if (keepMockEvents.includes(listener.eventName)) { + // add a mock event handler (like for capturing events) + (listener.emitter as any).on(listener.eventName, () => null); + } + listener.emitter.off(listener.eventName, listener.handler); + } + this.registeredEventListeners.clear(); + } + + group(name: string, ...listeners: IRegisteredEventListener[]): void { + this.groups[name] ??= []; + this.groups[name].push(...listeners); + } + + endGroup(name: string): void { + const events = this.groups[name]; + delete this.groups[name]; + if (events) this.off(...events); + } +} diff --git a/shared/lib/IpcUtils.ts b/shared/lib/IpcUtils.ts new file mode 100644 index 000000000..ba6df6ddd --- /dev/null +++ b/shared/lib/IpcUtils.ts @@ -0,0 +1,8 @@ +import * as os from 'os'; + +export function createIpcSocketPath(name: string): string { + if (os.platform() === 'win32') { + return `\\\\.\\pipe\\${name}`; + } + return `${os.tmpdir()}/${name}.sock`; +} diff --git a/shared/lib/Logger.ts b/shared/lib/Logger.ts new file mode 100644 index 000000000..cd3739333 --- /dev/null +++ b/shared/lib/Logger.ts @@ -0,0 +1,287 @@ +// eslint-disable-next-line max-classes-per-file +import { inspect } from 'util'; +import ILog, { ILogData } from '../interfaces/ILog'; + +const hasBeenLoggedSymbol = Symbol.for('hasBeenLogged'); + +const logFilters = { + active: [] as RegExp[], + skip: [] as RegExp[], + enabledNamesCache: {} as { [namespace: string]: boolean }, +}; + +let logId = 0; +class Log implements ILog { + public readonly level: LogLevel; + public useColors = + process.env.NODE_DISABLE_COLORS !== 'true' && process.env.NODE_DISABLE_COLORS !== '1'; + + protected readonly boundContext: any = {}; + private readonly module: string; + + constructor(module: NodeModule, boundContext?: any) { + this.module = module ? extractPathFromModule(module) : ''; + if (boundContext) this.boundContext = boundContext; + this.level = isEnabled(this.module) ? 'stats' : 'error'; + } + + public stats(action: string, data?: ILogData): number { + return this.log('stats', action, data); + } + + public info(action: string, data?: ILogData): number { + return this.log('info', action, data); + } + + public warn(action: string, data?: ILogData): number { + return this.log('warn', action, data); + } + + public error(action: string, data?: ILogData): number { + return this.log('error', action, data); + } + + public createChild(module, boundContext?: any): ILog { + const Constructor = this.constructor; + // @ts-ignore + return new Constructor(module, { + ...this.boundContext, + ...boundContext, + }); + } + + public flush(): void { + // no-op + } + + protected logToConsole(level: LogLevel, entry: ILogEntry): void { + const printablePath = entry.module.replace('.js', '').replace('.ts', '').replace('build/', ''); + + const { error, printData } = translateToPrintable(entry.data); + + if (level === 'warn' || level === 'error') { + printData.sessionId = entry.sessionId; + printData.sessionName = loggerSessionIdNames.get(entry.sessionId) ?? undefined; + } + + const params = Object.keys(printData).length ? [printData] : []; + if (error) params.push(error); + + // eslint-disable-next-line no-console + console.log( + `${entry.timestamp.toISOString()} ${entry.level.toUpperCase()} [${printablePath}] ${ + entry.action + }`, + ...params.map(x => inspect(x, false, null, this.useColors)), + ); + } + + private log(level: LogLevel, action: string, data?: ILogData): number { + let logData: object; + let sessionId: string = this.boundContext.sessionId; + let parentId: number; + const mergedData = { ...data, context: this.boundContext }; + if (mergedData) { + for (const [key, val] of Object.entries(mergedData)) { + if (key === 'parentLogId') parentId = val as number; + else if (key === 'sessionId') sessionId = val as string; + else { + if (!logData) logData = {}; + logData[key] = val; + } + } + } + logId += 1; + const id = logId; + const entry: ILogEntry = { + id, + sessionId, + parentId, + timestamp: new Date(), + action, + data: logData, + level, + module: this.module, + }; + if (logLevels[level] >= logLevels[this.level]) { + this.logToConsole(level, entry); + } + LogEvents.broadcast(entry); + return id; + } +} + +function translateValueToPrintable(value: any, depth = 0): any { + if (value === undefined || value === null) return; + if (value instanceof Error) { + return value.toString(); + } + if (value instanceof RegExp) { + return `/${value.source}/${value.flags}`; + } + if ((value as any).toJSON) { + return (value as any).toJSON(); + } + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { + return value; + } + + if (depth > 2) return value; + + if (typeof value === 'object') { + if (Array.isArray(value)) { + return value.map(x => translateValueToPrintable(x, depth + 1)); + } + const result: any = {}; + for (const [key, subValue] of Object.entries(value)) { + result[key] = translateValueToPrintable(subValue, depth + 1); + } + return result; + } +} + +export function translateToPrintable( + data: any, + result?: { error?: Error; printData: any }, +): { error?: Error; printData: any } { + result ??= { printData: {} }; + const { printData } = result; + for (const [key, value] of Object.entries(data)) { + if (value instanceof Error) { + Object.defineProperty(value, hasBeenLoggedSymbol, { + enumerable: false, + value: true, + }); + result.error = value; + continue; + } + const printable = translateValueToPrintable(value); + if (printable === null || printable === undefined) continue; + printData[key] = printable; + } + return result; +} + +const logLevels = { stats: 0, info: 1, warn: 2, error: 3 }; + +let logCreator = (module: NodeModule): { log: ILog } => { + const log: ILog = new Log(module); + + return { + log, + }; +}; + +export default function logger(module: NodeModule): ILogBuilder { + return logCreator(module); +} + +let idCounter = 0; + +const loggerSessionIdNames = new Map(); + +class LogEvents { + private static subscriptions: { [id: number]: (log: ILogEntry) => any } = {}; + + public static unsubscribe(subscriptionId: number): void { + delete LogEvents.subscriptions[subscriptionId]; + } + + public static subscribe(onLogFn: (log: ILogEntry) => any): number { + idCounter += 1; + const id = idCounter; + LogEvents.subscriptions[id] = onLogFn; + return id; + } + + public static broadcast(entry: ILogEntry): void { + Object.values(LogEvents.subscriptions).forEach(x => x(entry)); + } +} + +export { Log, LogEvents, loggerSessionIdNames, hasBeenLoggedSymbol }; + +export function injectLogger(builder: (module: NodeModule) => ILogBuilder): void { + logCreator = builder; +} + +export interface ILogEntry { + id: number; + timestamp: Date; + action: string; + module: string; + sessionId?: string; + parentId?: number; + data?: any; + level: LogLevel; +} + +type LogLevel = keyof typeof logLevels; + +interface ILogBuilder { + log: ILog; +} + +function extractPathFromModule(module: NodeModule): string { + const fullPath = typeof module === 'string' ? module : module.filename || module.id || ''; + return fullPath + .replace(/^(.*)[/\\]unblocked[/\\](.+)$/, '$2') + .replace(/^(.*)[/\\]ulixee[/\\](.+)$/, '$2') + .replace(/^(.*)[/\\]@ulixee[/\\](.+)$/, '$2') + .replace(/^(.*)[/\\]commons[/\\](.+)$/, '$2') + .replace(/^.*[/\\]packages[/\\](.+)$/, '$1'); +} + +/// LOG FILTERING ////////////////////////////////////////////////////////////////////////////////////////////////////// + +function isEnabled(name: string): boolean { + if (name in logFilters.enabledNamesCache) return logFilters.enabledNamesCache[name]; + + if (name[name.length - 1] === '*') { + return true; + } + + for (const ns of logFilters.skip) { + if (ns.test(name)) { + logFilters.enabledNamesCache[name] = false; + return false; + } + } + + for (const ns of logFilters.active) { + if (ns.test(name)) { + logFilters.enabledNamesCache[name] = true; + return true; + } + } + + logFilters.enabledNamesCache[name] = false; + return false; +} + +function enable(namespaces: string): void { + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + + for (let part of split) { + if (!part) continue; + + part = part.replace(/\*/g, '.*?'); + + if (part[0] === '-') { + logFilters.skip.push(new RegExp('^' + part.slice(1) + '$')); + } else { + logFilters.active.push(new RegExp('^' + part + '$')); + if (part.includes('ubk:*') || part.includes('ubk*')) { + logFilters.active.push(/agent\/*/); + } else if (part === 'ubk') { + logFilters.active.push(/agent\/*/); + logFilters.skip.push(new RegExp('DevtoolsSessionLogger')); + logFilters.skip.push(new RegExp(/agent\/mitm*/)); + + } else if (part.includes('ubk:devtools')) { + logFilters.active.push(new RegExp('DevtoolsSessionLogger')); + } + } + } +} +enable(process.env.DEBUG); diff --git a/shared/lib/Queue.ts b/shared/lib/Queue.ts new file mode 100644 index 000000000..ccb30b8b5 --- /dev/null +++ b/shared/lib/Queue.ts @@ -0,0 +1,125 @@ +import IResolvablePromise from '../interfaces/IResolvablePromise'; +import { CanceledPromiseError } from '../interfaces/IPendingWaitEvent'; +import { createPromise } from './utils'; +import Resolvable from './Resolvable'; +import getPrototypeOf = Reflect.getPrototypeOf; + +type AsyncCallback = (value?: any) => Promise; + +export default class Queue { + public concurrency = 1; + public idletimeMillis = 500; + public idlePromise = createPromise(); + public get isActive(): boolean { + return (this.activeCount > 0 || this.queue.length > 0) && !this.stopDequeuing; + } + + public get size(): number { + return this.queue.length; + } + + public activeCount = 0; + + private abortPromise = new Resolvable(); + private idleTimout: NodeJS.Timeout; + + private stopDequeuing = false; + + private queue: IQueueEntry[] = []; + + constructor(readonly stacktraceMarker = 'QUEUE', concurrency?: number) { + if (concurrency) this.concurrency = concurrency; + } + + public run(cb: AsyncCallback, timeoutMillis?: number): Promise { + const promise = createPromise(timeoutMillis); + + this.queue.push({ + promise, + cb, + startStack: new Error('').stack.slice(8), // "Error: \n" is 8 chars + }); + + this.next().catch(() => null); + return promise.promise; + } + + public reset(): void { + this.stop(); + this.abortPromise = new Resolvable(); + this.stopDequeuing = false; + } + + public willStop(): void { + this.stopDequeuing = true; + } + + public stop(error?: CanceledPromiseError): void { + const canceledError = error ?? new CanceledPromiseError('Canceling Queue Item'); + this.abortPromise.resolve(canceledError); + while (this.queue.length) { + const next = this.queue.shift(); + if (!next) continue; + + this.reject(next, canceledError); + } + } + + public canRunMoreConcurrently(): boolean { + return this.activeCount < this.concurrency; + } + + private async next(): Promise { + clearTimeout(this.idleTimout); + + if (!this.canRunMoreConcurrently()) return; + + const next = this.queue.shift(); + if (!next) { + if (this.activeCount === 0) { + this.idleTimout = setTimeout(() => this.idlePromise.resolve(), this.idletimeMillis) as any; + this.idleTimout.unref(); + } + return; + } + + if (this.activeCount === 0 && this.idlePromise.isResolved) { + const newPromise = createPromise(); + this.idlePromise?.resolve(newPromise.promise); + this.idlePromise = newPromise; + } + if (this.stopDequeuing) next.promise.resolve(null); + + this.activeCount += 1; + try { + const res = await Promise.race([next.cb(), this.abortPromise.promise]); + if (this.abortPromise.isResolved) { + return this.reject(next, await this.abortPromise.promise); + } + + next.promise.resolve(res); + } catch (error) { + this.reject(next, error); + } finally { + this.activeCount -= 1; + } + + process.nextTick(() => this.next().catch(() => null)); + } + + private reject(entry: IQueueEntry, sourceError: Error): void { + const error = Object.create(getPrototypeOf(sourceError)); + error.message = sourceError.message; + Object.assign(error, sourceError); + + const marker = `------${this.stacktraceMarker}`.padEnd(50, '-'); + error.stack = `${sourceError.stack}\n${marker}\n${entry.startStack}`; + entry.promise.reject(error); + } +} + +interface IQueueEntry { + promise: IResolvablePromise; + cb: AsyncCallback; + startStack: string; +} diff --git a/shared/lib/Resolvable.ts b/shared/lib/Resolvable.ts new file mode 100644 index 000000000..94ffc912b --- /dev/null +++ b/shared/lib/Resolvable.ts @@ -0,0 +1,87 @@ +import IResolvablePromise from '../interfaces/IResolvablePromise'; +import TimeoutError from '../interfaces/TimeoutError'; + +export default class Resolvable implements IResolvablePromise, PromiseLike { + public isResolved = false; + public resolved: T; + public promise: Promise; + public readonly timeout: NodeJS.Timeout; + public readonly stack: string; + + private resolveFn: (value: T | PromiseLike) => void; + private rejectFn: (error?: Error) => void; + + constructor(timeoutMillis?: number, timeoutMessage?: string) { + // get parent stack + this.stack = new Error('').stack.slice(8); + this.promise = new Promise((resolve, reject) => { + this.resolveFn = resolve; + this.rejectFn = reject; + }); + + if (timeoutMillis !== undefined && timeoutMillis !== null) { + this.timeout = ( + setTimeout(this.rejectWithTimeout.bind(this, timeoutMessage), timeoutMillis) as any + ).unref(); + } + this.resolve = this.resolve.bind(this); + this.reject = this.reject.bind(this); + } + + public resolve(value: T | PromiseLike): void { + if (this.isResolved) return; + clearTimeout(this.timeout); + this.resolveFn(value); + Promise.resolve(value) + // eslint-disable-next-line promise/always-return,@typescript-eslint/no-floating-promises + .then(x => { + this.isResolved = true; + this.resolved = x; + this.clean(); + }) + .catch(this.reject); + } + + public reject(error: Error): void { + if (this.isResolved) return; + this.isResolved = true; + this.rejectFn(error); + this.clean(); + } + + public toJSON(): object { + return { + isResolved: this.isResolved, + resolved: this.resolved, + }; + } + + public then( + onfulfilled?: (value: T) => TResult1 | PromiseLike, + onrejected?: (reason: any) => TResult2 | PromiseLike, + ): Promise { + return this.promise.then(onfulfilled, onrejected); + } + + public catch( + onrejected?: (reason: any) => TResult | PromiseLike, + ): Promise { + return this.promise.catch(onrejected); + } + + public finally(onfinally?: () => void): Promise { + return this.promise.finally(onfinally); + } + + private clean(): void { + clearTimeout(this.timeout); + this.resolveFn = null; + this.rejectFn = null; + } + + private rejectWithTimeout(message: string): void { + const error = new TimeoutError(message); + error.stack = `TimeoutError: ${message}\n${this.stack}`; + this.reject(error); + } +} diff --git a/shared/lib/SessionClosedOrMissingError.ts b/shared/lib/SessionClosedOrMissingError.ts new file mode 100644 index 000000000..fdc7647f5 --- /dev/null +++ b/shared/lib/SessionClosedOrMissingError.ts @@ -0,0 +1,11 @@ +import { CanceledPromiseError } from '../interfaces/IPendingWaitEvent'; +import { registerSerializableErrorType } from './TypeSerializer'; + +export default class SessionClosedOrMissingError extends CanceledPromiseError { + constructor(message: string) { + super(message); + this.name = 'SessionClosedOrMissingError'; + } +} + +registerSerializableErrorType(SessionClosedOrMissingError); diff --git a/shared/lib/ShutdownHandler.ts b/shared/lib/ShutdownHandler.ts new file mode 100644 index 000000000..6c80c918a --- /dev/null +++ b/shared/lib/ShutdownHandler.ts @@ -0,0 +1,73 @@ +import logger from './Logger'; +import { CanceledPromiseError } from '../interfaces/IPendingWaitEvent'; + +type ShutdownSignal = NodeJS.Signals | 'exit'; + +const { log } = logger(module); + +export default class ShutdownHandler { + public static exitOnSignal = false; + + private static isRegistered = false; + private static hasRunHandlers = false; + private static readonly onShutdownFns: { + fn: (signal?: ShutdownSignal) => Promise | void; + callsite: string; + }[] = []; + + public static register(onShutdownFn: (signal?: ShutdownSignal) => Promise | void): void { + this.registerSignals(); + const callsite = new Error().stack.split(/\r?\n/).slice(2, 3).shift().trim(); + this.onShutdownFns.push({ fn: onShutdownFn, callsite }); + } + + private static registerSignals(): void { + if (!this.isRegistered) { + this.isRegistered = true; + process.once('exit' as any, code => ShutdownHandler.onSignal('exit', code)); + process.once('SIGTERM', ShutdownHandler.onSignal.bind(this)); + process.once('SIGINT', ShutdownHandler.onSignal.bind(this)); + process.once('SIGQUIT', ShutdownHandler.onSignal.bind(this)); + } + } + + private static async onSignal(signal: ShutdownSignal, code?: number): Promise { + if (this.hasRunHandlers) return; + this.hasRunHandlers = true; + const parentLogId = log.stats('ShutdownHandler.onSignal', { + signal, + sessionId: null, + }); + + while (this.onShutdownFns.length) { + const entry = this.onShutdownFns.shift(); + + log.stats('ShutdownHandler.execute', { + signal, + fn: entry.fn.toString(), + callsite: entry.callsite, + sessionId: null, + }); + try { + await entry.fn(signal); + } catch (error) { + if (error instanceof CanceledPromiseError) continue; + log.warn('ShutdownHandler.errorShuttingDown', { + error, + sessionId: null, + }); + } + } + + log.stats('ShutdownHandler.shutdownComplete', { + signal, + exiting: this.exitOnSignal, + sessionId: null, + parentLogId, + }); + + if (this.exitOnSignal) { + process.exit(code ?? 1); + } + } +} diff --git a/shared/lib/SourceLoader.ts b/shared/lib/SourceLoader.ts new file mode 100644 index 000000000..fa675e06d --- /dev/null +++ b/shared/lib/SourceLoader.ts @@ -0,0 +1,59 @@ +import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; +import { SourceMapSupport } from './SourceMapSupport'; +import { URL } from 'url'; +import * as fs from 'fs'; + +export default class SourceLoader { + private static sourceLines: { [source: string]: string[] } = {}; + private static fileContentsCache: { [filepath: string]: string } = {}; + + static resetCache(): void { + this.sourceLines = {}; + this.fileContentsCache = {}; + } + + static clearFileCache(filepath: string): void { + delete this.fileContentsCache[filepath]; + } + + static getSource(codeLocation: ISourceCodeLocation): ISourceCodeLocation & { code: string } { + if (!codeLocation) return null; + + codeLocation = SourceMapSupport.getOriginalSourcePosition(codeLocation); + + if (!this.sourceLines[codeLocation.filename]) { + const file = this.getFileContents(codeLocation.filename); + if (!file) return null; + this.sourceLines[codeLocation.filename] = file.split(/\r?\n/); + } + + const code = this.sourceLines[codeLocation.filename][codeLocation.line - 1]; + return { + code, + ...codeLocation, + }; + } + + static getFileContents(filepath: string, cache = true): string { + if (cache && this.fileContentsCache[filepath]) return this.fileContentsCache[filepath]; + + const originalFilepath = filepath; + // Trim the path to make sure there is no extra whitespace. + let lookupFilepath: string | URL = filepath.trim(); + if (filepath.startsWith('file://')) { + lookupFilepath = new URL(filepath); + } + + let data: string = null; + try { + data = fs.readFileSync(lookupFilepath, 'utf8'); + } catch (err) { + // couldn't read + } + if (cache) { + this.fileContentsCache[filepath] = data; + this.fileContentsCache[originalFilepath] = data; + } + return data; + } +} diff --git a/shared/lib/SourceMapSupport.ts b/shared/lib/SourceMapSupport.ts new file mode 100644 index 000000000..08dad26cb --- /dev/null +++ b/shared/lib/SourceMapSupport.ts @@ -0,0 +1,259 @@ +import { SourceMapConsumer } from 'source-map-js'; +import * as path from 'path'; +import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; +import SourceLoader from './SourceLoader'; + +// ATTRIBUTION: forked from https://github.com/evanw/node-source-map-support + +const sourceMapDataUrlRegex = /^data:application\/json[^,]+base64,/; +const sourceMapUrlRegex = + /(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/gm; +const fileUrlPrefix = 'file://'; + +export class SourceMapSupport { + private static sourceMapCache: { [source: string]: { map: SourceMapConsumer; url: string } } = {}; + private static resolvedPathCache: { [file_url: string]: string } = {}; + + static resetCache(): void { + this.sourceMapCache = {}; + this.resolvedPathCache = {}; + } + + static clearCache(filepath: string): void { + this.sourceMapCache[filepath] = null; + } + + static install(): void { + if (!Error[Symbol.for('source-map-support')]) { + Error[Symbol.for('source-map-support')] = true; + Error.prepareStackTrace = this.prepareStackTrace.bind(this); + } + } + + static getSourceFile(filename: string): string { + this.sourceMapCache[filename] ??= this.retrieveSourceMap(filename); + if (!this.sourceMapCache[filename].map) return filename; + + let source = filename; + const sourceMap = this.sourceMapCache[filename]; + sourceMap.map.eachMapping(mapping => { + if (source === filename) { + source = this.resolvePath(sourceMap.url, mapping.source); + } + }); + return source; + } + + static getOriginalSourcePosition( + position: ISourceCodeLocation, + ): ISourceCodeLocation & { name?: string } { + this.sourceMapCache[position.filename] ??= this.retrieveSourceMap(position.filename); + + const sourceMap = this.sourceMapCache[position.filename]; + if (sourceMap?.map) { + const originalPosition = sourceMap.map.originalPositionFor(position); + + // Only return the original position if a matching line was found + if (originalPosition.source) { + return { + filename: this.resolvePath(sourceMap.url, originalPosition.source), + column: originalPosition.column, + line: originalPosition.line, + name: originalPosition.name, + }; + } + } + + return position; + } + + private static prepareStackTrace(error: Error, stack: NodeJS.CallSite[]): string { + const name = error.name ?? error[Symbol.toStringTag] ?? error.constructor?.name ?? 'Error'; + const message = error.message ?? ''; + const errorString = name + ': ' + message; + + // track fn name as we go backwards through stack + const processedStack = []; + let containingFnName: string = null; + for (let i = stack.length - 1; i >= 0; i--) { + let frame = stack[i]; + if (frame.isNative()) { + containingFnName = null; + } else { + const filename = frame.getFileName() || (frame as any).getScriptNameOrSourceURL(); + if (filename) { + const position = this.getOriginalSourcePosition({ + filename, + line: frame.getLineNumber(), + column: frame.getColumnNumber() - 1, + }); + if (position.filename !== filename) { + const fnName = containingFnName ?? frame.getFunctionName(); + containingFnName = position.name; + frame = new Proxy(frame, { + get(target: NodeJS.CallSite, p: string | symbol): any { + if (p === 'getFunctionName') return () => fnName; + if (p === 'getFileName') return () => position.filename; + if (p === 'getScriptNameOrSourceURL') return () => position.filename; + if (p === 'getLineNumber') return () => position.line; + if (p === 'getColumnNumber') return () => position.column + 1; + if (p === 'toString') return CallSiteToString.bind(frame); + + return target[p]?.bind(target); + }, + }); + } + } + } + + processedStack.unshift(`\n at ${frame.toString()}`); + } + return errorString + processedStack.join(''); + } + + private static retrieveSourceMap(source: string): { url: string; map: SourceMapConsumer } { + const fileData = SourceLoader.getFileContents(source, false); + + // Find the *last* sourceMappingURL to avoid picking up sourceMappingURLs from comments, strings, etc. + let sourceMappingURL: string; + let sourceMapData: string; + + let match: RegExpMatchArray; + while ((match = sourceMapUrlRegex.exec(fileData))) { + sourceMappingURL = match[1]; + } + + if (sourceMappingURL) { + if (sourceMapDataUrlRegex.test(sourceMappingURL)) { + const rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(',') + 1); + sourceMapData = Buffer.from(rawData, 'base64').toString(); + sourceMappingURL = source; + } else { + sourceMappingURL = this.resolvePath(source, sourceMappingURL); + sourceMapData = SourceLoader.getFileContents(sourceMappingURL); + } + } + + if (!sourceMapData) { + return { + url: null, + map: null, + }; + } + + const rawData = JSON.parse(sourceMapData); + return { + url: sourceMappingURL, + map: new SourceMapConsumer(rawData), + }; + } + + private static resolvePath(base: string, relative: string): string { + if (!base) return relative; + const key = `${base}__${relative}`; + + if (!this.resolvedPathCache[key]) { + let protocol = base.startsWith(fileUrlPrefix) ? fileUrlPrefix : ''; + + let basePath = path.dirname(base).slice(protocol.length); + + // handle file:///C:/ paths + if (protocol && /^\/\w:/.test(basePath)) { + protocol += '/'; + basePath = basePath.slice(1); + } + + this.resolvedPathCache[key] = protocol + path.resolve(basePath, relative); + } + return this.resolvedPathCache[key]; + } +} + +SourceMapSupport.install(); + +// Converted from the V8 source code at: +// https://github.com/v8/v8/blob/dc712da548c7fb433caed56af9a021d964952728/src/objects/stack-frame-info.cc#L344-L393 +function CallSiteToString( + this: NodeJS.CallSite & { + getScriptNameOrSourceURL(): string; + isAsync(): boolean; + isPromiseAll?(): boolean; + isPromiseAny?(): boolean; + getPromiseIndex?(): number; + }, +): string { + let fileName; + let fileLocation = ''; + if (this.isNative()) { + fileLocation = 'native'; + } else { + fileName = this.getScriptNameOrSourceURL(); + if (!fileName && this.isEval()) { + fileLocation = this.getEvalOrigin(); + fileLocation += ', '; // Expecting source position to follow. + } + + if (fileName) { + fileLocation += fileName; + } else { + // Source code does not originate from a file and is not native, but we + // can still get the source position inside the source string, e.g. in + // an eval string. + fileLocation += ''; + } + const lineNumber = this.getLineNumber(); + if (lineNumber != null) { + fileLocation += ':' + lineNumber; + const columnNumber = this.getColumnNumber(); + if (columnNumber) { + fileLocation += ':' + columnNumber; + } + } + } + + let line = ''; + const isAsync = this.isAsync ? this.isAsync() : false; + if (isAsync) { + line += 'async '; + const isPromiseAll = this.isPromiseAll ? this.isPromiseAll() : false; + const isPromiseAny = this.isPromiseAny ? this.isPromiseAny() : false; + if (isPromiseAny || isPromiseAll) { + line += isPromiseAll ? 'Promise.all (index ' : 'Promise.any (index '; + const promiseIndex = this.getPromiseIndex(); + line += promiseIndex + ')'; + } + } + const functionName = this.getFunctionName(); + let addSuffix = true; + const isConstructor = this.isConstructor(); + const isMethodCall = !(this.isToplevel() || isConstructor); + if (isMethodCall) { + const typeName = this.getTypeName(); + const methodName = this.getMethodName(); + if (functionName) { + if (typeName && functionName.indexOf(typeName) != 0) { + line += typeName + '.'; + } + line += functionName; + if ( + methodName && + functionName.indexOf('.' + methodName) != functionName.length - methodName.length - 1 + ) { + line += ' [as ' + methodName + ']'; + } + } else { + line += typeName + '.' + (methodName || ''); + } + } else if (isConstructor) { + line += 'new ' + (functionName || ''); + } else if (functionName) { + line += functionName; + } else { + line += fileLocation; + addSuffix = false; + } + if (addSuffix) { + line += ' (' + fileLocation + ')'; + } + return line; +} diff --git a/shared/lib/SqliteTable.ts b/shared/lib/SqliteTable.ts new file mode 100644 index 000000000..c9c431b36 --- /dev/null +++ b/shared/lib/SqliteTable.ts @@ -0,0 +1,130 @@ +// eslint-disable-next-line import/no-unresolved +import type { Database as SqliteDatabase, Statement } from 'better-sqlite3'; + +type SqliteTypes = 'INTEGER' | 'TEXT' | 'BLOB' | 'DATETIME'; +type IRecord = (string | number | Buffer)[]; + +export default abstract class SqliteTable { + protected readonly insertStatement: Statement; + protected defaultSortOrder?: string; + protected insertCallbackFn?: (records: T[]) => void; + + protected pendingInserts: IRecord[] = []; + + private insertSubscriptionRecords: T[] = []; + private subscriptionThrottle: NodeJS.Timeout; + private lastSubscriptionPublishTime: number; + + protected constructor( + readonly db: SqliteDatabase, + readonly tableName: string, + readonly columns: [keyof T, SqliteTypes, string?][], + private insertOrReplace = false, + ) { + if (!db.readonly) { + this.db.exec(this.createTableStatement()); + this.insertStatement = this.db.prepare(this.buildInsertStatement()); + } + } + + public findPendingInserts(cb: (record: IRecord) => boolean): IRecord[] { + return this.pendingInserts.filter(cb); + } + + public findPendingRecords(cb: (record: IRecord) => boolean): T[] { + return this.pendingInserts.filter(cb).map(x => this.insertToObject(x)); + } + + public subscribe(callbackFn: (records: T[]) => void): void { + if (this.insertCallbackFn) throw new Error('This table already has a subscriber'); + this.insertCallbackFn = callbackFn; + const pendingRecords = this.pendingInserts.map(x => this.insertToObject(x)); + this.lastSubscriptionPublishTime = Date.now(); + process.nextTick(callbackFn, this.all().concat(pendingRecords)); + } + + public unsubscribe(): void { + this.insertCallbackFn = null; + } + + public runPendingInserts(): void { + const records = [...this.pendingInserts]; + this.pendingInserts.length = 0; + + for (const record of records) { + this.insertStatement.run(...record); + } + } + + public insertNow(record: IRecord): void { + this.insertStatement.run(...record); + this.addRecordToPublish(record); + } + + public all(): T[] { + const sort = this.defaultSortOrder ? ` ORDER BY ${this.defaultSortOrder}` : ''; + return this.db.prepare(`select * from ${this.tableName}${sort}`).all() as T[]; + } + + protected queuePendingInsert(record: IRecord): void { + this.pendingInserts.push(record); + this.addRecordToPublish(record); + } + + protected buildInsertStatement(): string { + const keys = this.columns.map(x => x[0]); + const params = keys.map(() => '?').join(', '); + const insertOrReplace = this.insertOrReplace ? ' OR REPLACE' : ''; + return `INSERT${insertOrReplace} INTO ${this.tableName} (${keys.join( + ', ', + )}) VALUES (${params})`; + } + + private addRecordToPublish(record: IRecord): void { + if (!this.insertCallbackFn) return; + this.insertSubscriptionRecords.push(this.insertToObject(record)); + clearTimeout(this.subscriptionThrottle); + + if (Date.now() - this.lastSubscriptionPublishTime > 500) { + this.lastSubscriptionPublishTime = Date.now(); + return process.nextTick(this.publishPendingRecords.bind(this)); + } + this.subscriptionThrottle = (setTimeout(this.publishPendingRecords.bind(this), 100) as any).unref(); + } + + private publishPendingRecords(): void { + if (!this.insertCallbackFn) return; + const records = [...this.insertSubscriptionRecords]; + this.insertSubscriptionRecords.length = 0; + this.lastSubscriptionPublishTime = Date.now(); + this.insertCallbackFn(records); + } + + private createTableStatement(): string { + const primaryKey = this.columns.filter(x => x[2]?.includes('PRIMARY KEY')); + let primaryKeyAddon = ''; + if (primaryKey.length > 1) { + primaryKeyAddon = `PRIMARY KEY (${primaryKey.map(x => x[0]).join(', ')})`; + for (const key of primaryKey) { + key.length = 2; + } + } + const definitions = this.columns.map(x => { + let columnDef = `${x[0]} ${x[1]}`; + if (x.length > 2) columnDef = `${columnDef} ${x[2]}`; + return columnDef; + }); + if (primaryKeyAddon) { + definitions.push(primaryKeyAddon); + } + return `CREATE TABLE IF NOT EXISTS ${this.tableName} (${definitions})`; + } + + private insertToObject(record: IRecord): T { + const result: any = {}; + for (let i = 0; i < record.length; i += 1) { + if (record[i] !== null) result[this.columns[i][0]] = record[i]; + } + return result as T; + } +} diff --git a/shared/lib/Timer.ts b/shared/lib/Timer.ts new file mode 100644 index 000000000..39ffa4a6c --- /dev/null +++ b/shared/lib/Timer.ts @@ -0,0 +1,87 @@ +import TimeoutError from '../interfaces/TimeoutError'; +import Resolvable from './Resolvable'; + +export default class Timer { + public readonly [Symbol.toStringTag] = 'Timer'; + public readonly timeout: NodeJS.Timer; + + private readonly time = process.hrtime(); + private timeoutMessage = 'Timeout waiting'; + private readonly expirePromise = new Resolvable(); + + constructor(readonly timeoutMillis: number, readonly registry?: IRegistry[]) { + // NOTE: A zero value will NOT timeout. This is to give users an ability to not timeout certain requests + this.timeout = + timeoutMillis > 0 ? setTimeout(this.expire.bind(this), timeoutMillis).unref() : null; + if (registry && this.timeout) { + registry.push({ reject: this.expirePromise.reject, timeout: this.timeout }); + } + } + + public setMessage(message: string): void { + this.timeoutMessage = message; + } + + public clear(): void { + if (this.registry) { + const idx = this.registry.findIndex(x => x.timeout === this.timeout); + if (idx >= 0) this.registry.splice(idx, 1); + } + clearTimeout(this.timeout); + } + + public throwIfExpired(message?: string): void { + if (this.isExpired()) { + this.clear(); + throw new TimeoutError(message ?? this.timeoutMessage); + } + } + + public isExpired(): boolean { + return this.elapsedMillis() >= this.timeoutMillis; + } + + public isResolved(): boolean { + return this.expirePromise.isResolved; + } + + public elapsedMillis(): number { + const time = process.hrtime(this.time); + return time[0] * 1000 + time[1] / 1000000; + } + + public async waitForPromise(promise: Promise, message: string): Promise { + this.timeoutMessage = message; + const timeout = new TimeoutError(this.timeoutMessage); + const result = await Promise.race([promise, this.expirePromise.then(() => timeout)]); + if (result instanceof TimeoutError) throw timeout; + return result; + } + + public waitForTimeout(): Promise { + // wait for promise to expire + return this.expirePromise.promise; + } + + private expire(): void { + this.expirePromise.resolve(); + this.clear(); + } + + public static expireAll(registry: IRegistry[], error: Error): void { + // clear any pending timeouts + while (registry.length) { + const next = registry.shift(); + if (next) { + const { timeout, reject } = next; + clearTimeout(timeout); + reject(error); + } + } + } +} + +interface IRegistry { + timeout: NodeJS.Timer; + reject: (err: Error) => any; +} diff --git a/shared/lib/TypeSerializer.ts b/shared/lib/TypeSerializer.ts new file mode 100644 index 000000000..b5dcc3d74 --- /dev/null +++ b/shared/lib/TypeSerializer.ts @@ -0,0 +1,238 @@ +const Types = { + number: 'number', + string: 'string', + boolean: 'boolean', + object: 'object', + bigint: 'bigint', + NaN: 'NaN', + Infinity: 'Infinity', + NegativeInfinity: '-Infinity', + DateIso: 'DateIso', + Buffer64: 'Buffer64', + ArrayBuffer64: 'ArrayBuffer64', + RegExp: 'RegExp', + Map: 'Map', + Set: 'Set', + Error: 'Error', +}; + +declare let Buffer; +declare let global; + +export default class TypeSerializer { + public static errorTypes = new Map(); + + private static isNodejs = + // prettier-ignore + // @ts-ignore + typeof process !== 'undefined' && ('release' in process) && process.release?.name === 'node'; + + public static parse(stringified: string, stackMarker = 'SERIALIZER'): any { + return JSON.parse(stringified, this.reviver.bind(this, stackMarker)); + } + + public static revive(object: any, objectKey?: string): any { + if (!object) return object; + const marker = 'SERIALIZER'; + const revived = this.reviver(marker, objectKey, object); + + if (revived !== object) { + if (revived instanceof Map) { + return new Map([...revived].map(([key, value]) => this.reviver(marker, key, value))); + } + if (revived instanceof Set) { + return new Set([...revived].map(value => this.reviver(marker, '', value))); + } + return revived; + } + + if (object && typeof object === Types.object) { + if (Array.isArray(object)) { + object = object.map(x => this.revive(x)); + } + const response = {}; + for (const [key, value] of Object.entries(object)) { + response[key] = this.revive(value, key); + } + object = response; + } + return object; + } + + public static stringify(object: any): string { + const final = TypeSerializer.replace(object); + return JSON.stringify(final); + } + + public static replace(object: any): object { + if (!object) return object; + const replaced = this.replacer(null, object); + if (replaced !== object || (typeof replaced === 'object' && '__type' in replaced)) { + return replaced; + } + if (object && typeof object === Types.object) { + if (Array.isArray(object)) return object.map(x => this.replace(x)); + const response = {}; + for (const [key, value] of Object.entries(object)) { + response[key] = this.replace(value); + } + return response; + } + return object; + } + + private static replacer(_: string, value: any): any { + if (value === null || value === undefined) return value; + + if (Number.isNaN(value)) { + return { __type: Types.NaN }; + } + + if (value === Number.POSITIVE_INFINITY) { + return { __type: Types.Infinity }; + } + + if (value === Number.NEGATIVE_INFINITY) { + return { __type: Types.NegativeInfinity }; + } + + const type = typeof value; + if (type === Types.boolean || type === Types.string || type === Types.number) return value; + if (type === Types.bigint) { + return { __type: Types.bigint, value: value.toString() }; + } + + if (value instanceof Date) { + return { __type: Types.DateIso, value: value.toISOString() }; + } + + if (value instanceof RegExp) { + return { __type: Types.RegExp, value: [value.source, value.flags] }; + } + + if (value instanceof Error) { + const { name, message, stack, ...data } = value; + return { __type: Types.Error, value: { name, message, stack, ...data } }; + } + + if (value instanceof Map) { + return { __type: Types.Map, value: [...value.entries()] }; + } + + if (value instanceof Set) { + return { __type: Types.Set, value: [...value] }; + } + + if (this.isNodejs) { + if (value instanceof Buffer || Buffer.isBuffer(value)) { + return { __type: Types.Buffer64, value: value.toString('base64') }; + } + } else { + // @ts-ignore + if (value instanceof DOMRect) { + return value.toJSON(); + } + // @ts-ignore + if (value instanceof CSSStyleDeclaration) { + const isNumber = new RegExp(/^\d+$/); + const result = {}; + for (const key of Object.keys(value)) { + if (isNumber.test(key)) continue; + result[key] = value[key]; + } + return result; + } + + if (ArrayBuffer.isView(value)) { + // @ts-ignore + const binary = new TextDecoder('utf8').decode(value.buffer); + return { + __type: Types.ArrayBuffer64, + value: globalThis.btoa(binary), + args: { + arrayType: value[Symbol.toStringTag], + byteOffset: value.byteOffset, + byteLength: value.byteLength, + }, + }; + } + if (value instanceof ArrayBuffer) { + // @ts-ignore + const binary = new TextDecoder('utf8').decode(value); + return { + __type: Types.ArrayBuffer64, + value: globalThis.btoa(binary), + }; + } + } + + if ('toJSON' in value) { + return value.toJSON(); + } + + return value; + } + + private static reviver(stackMarker: string, key: string, entry: any): any { + if (!entry || !entry.__type) return entry; + + const { value, __type: type } = entry; + + if (type === Types.number || type === Types.string || type === Types.boolean) return value; + if (type === Types.bigint) return BigInt(value); + if (type === Types.NaN) return Number.NaN; + if (type === Types.Infinity) return Number.POSITIVE_INFINITY; + if (type === Types.NegativeInfinity) return Number.NEGATIVE_INFINITY; + if (type === Types.DateIso) return new Date(value); + if (type === Types.Buffer64 || type === Types.ArrayBuffer64) { + if (this.isNodejs) { + return Buffer.from(value, 'base64'); + } + + const decoded = globalThis.atob(value); + // @ts-ignore + const uint8Array = new TextEncoder().encode(decoded); + if (!entry.args) return uint8Array; + + const { arrayType, byteOffset, byteLength } = entry.args; + + return new globalThis[arrayType](uint8Array.buffer, byteOffset, byteLength); + } + if (type === Types.RegExp) return new RegExp(value[0], value[1]); + if (type === Types.Map) return new Map(value); + if (type === Types.Set) return new Set(value); + if (type === Types.Error) { + const { name, message, stack, ...data } = value; + let Constructor = this.errorTypes && this.errorTypes.get(name); + if (!Constructor) { + if (this.isNodejs) { + Constructor = global[name] || Error; + } else { + Constructor = globalThis[name] || Error; + } + } + + const startStack = new Error('').stack.slice(8); // "Error: \n" is 8 chars + + const e = new Constructor(message); + e.name = name; + Object.assign(e, data); + if (stack) { + e.stack = `${stack}\n${`------${stackMarker}`.padEnd(50, '-')}\n${startStack}`; + } + return e; + } + + return entry; + } +} + +export function registerSerializableErrorType(errorConstructor: { + new (message?: string): Error; +}): void { + TypeSerializer.errorTypes.set(errorConstructor.name, errorConstructor); +} + +export const stringifiedTypeSerializerClass = `const Types = ${JSON.stringify( + Types, +)};\n${TypeSerializer.toString()}`; diff --git a/shared/lib/VersionUtils.ts b/shared/lib/VersionUtils.ts new file mode 100644 index 000000000..71120acba --- /dev/null +++ b/shared/lib/VersionUtils.ts @@ -0,0 +1,8 @@ +import * as semver from 'semver' + +export function isSemverSatisfied(version: string, isSatisfiedByVersion: string): boolean { + return semver.satisfies(isSatisfiedByVersion, `~${version}`, { includePrerelease: true }); +} +export function nextVersion(version :string): string { + return semver.inc(version, 'patch') +} diff --git a/shared/lib/decodeBuffer.ts b/shared/lib/decodeBuffer.ts new file mode 100644 index 000000000..aebe9762a --- /dev/null +++ b/shared/lib/decodeBuffer.ts @@ -0,0 +1,34 @@ +import * as zlib from 'zlib'; +import { promisify } from 'util'; + +const inflateAsync = promisify(zlib.inflate); +const inflateRawAsync = promisify(zlib.inflateRaw); +const brotliDecompressAsync = promisify(zlib.brotliDecompress); +const gunzipAsync = promisify(zlib.gunzip); + +export default function decodeBuffer(buffer: Buffer, encoding: string): Promise { + if (!buffer || !encoding) return Promise.resolve(buffer); + + if (encoding === 'gzip' || encoding === 'x-gzip') { + // from node-fetch: + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + const zlibOptions = { + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH, + }; + return gunzipAsync(buffer, zlibOptions); + } + if (encoding === 'deflate' || encoding === 'x-deflate') { + if ((buffer[0] & 0x0f) === 0x08) { + return inflateAsync(buffer); + } + return inflateRawAsync(buffer); + } + if (encoding === 'br') { + return brotliDecompressAsync(buffer); + } + + return Promise.resolve(buffer); +} diff --git a/shared/lib/dirUtils.ts b/shared/lib/dirUtils.ts new file mode 100644 index 000000000..d59c2b513 --- /dev/null +++ b/shared/lib/dirUtils.ts @@ -0,0 +1,18 @@ +import * as os from 'os'; +import * as Path from 'path'; + +export function getCacheDirectory(): string { + if (process.platform === 'linux') { + return process.env.XDG_CACHE_HOME || Path.join(os.homedir(), '.cache'); + } + + if (process.platform === 'darwin') { + return Path.join(os.homedir(), 'Library', 'Caches'); + } + + if (process.platform === 'win32') { + return process.env.LOCALAPPDATA || Path.join(os.homedir(), 'AppData', 'Local'); + } + + throw new Error(`Unsupported platform: ${process.platform}`); +} diff --git a/shared/lib/downloadFile.ts b/shared/lib/downloadFile.ts new file mode 100644 index 000000000..c68f736cb --- /dev/null +++ b/shared/lib/downloadFile.ts @@ -0,0 +1,84 @@ +import * as http from 'http'; +import { HttpsProxyAgent } from 'https-proxy-agent'; +import * as https from 'https'; +import { RequestOptions } from 'https'; +import { parse } from 'url'; +import { createWriteStream } from 'fs'; +import { createPromise } from './utils'; +import { getProxyForUrl } from './getProxyForUrl'; + +export default function downloadFile( + url: string, + destinationPath: string, + progressCallback?: (downloadedBytes: number, totalBytes: number) => void, +): Promise { + const downloaderPromise = createPromise(); + let downloadedBytes = 0; + let totalBytes = 0; + + const request = httpGet(url, response => { + if (response.statusCode !== 200) { + const error = new Error( + `Download failed: server returned code ${response.statusCode}. URL: ${url}`, + ); + // consume response data to free up memory + response.resume(); + downloaderPromise.reject(error); + return; + } + const file = createWriteStream(destinationPath); + file.once('finish', downloaderPromise.resolve); + file.once('error', downloaderPromise.reject); + response.pipe(file); + totalBytes = parseInt(response.headers['content-length'], 10); + if (progressCallback) response.on('data', onData); + }); + request.once('error', downloaderPromise.reject); + return downloaderPromise.promise; + + function onData(chunk: Buffer | string): void { + downloadedBytes += Buffer.byteLength(chunk); + progressCallback(downloadedBytes, totalBytes); + } +} + +export function httpGet( + url: string, + response: (x: http.IncomingMessage) => void, +): http.ClientRequest { + const options = getRequestOptionsWithProxy(url); + const httpModule = options.protocol === 'https:' ? https : http; + + const request = httpModule.request(options, (res: http.IncomingMessage): void => { + if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { + httpGet(res.headers.location, response); + } else { + response(res); + } + }); + request.end(); + return request; +} + +function getRequestOptionsWithProxy(url: string): RequestOptions { + const urlParsed = parse(url); + + const options: https.RequestOptions = { + ...urlParsed, + method: 'GET', + }; + + const proxyURL = getProxyForUrl(url); + if (proxyURL) { + if (url.startsWith('http:')) { + return { + path: urlParsed.href, + host: proxyURL.hostname, + port: proxyURL.port, + }; + } + options.agent = new HttpsProxyAgent(proxyURL.href); + options.rejectUnauthorized = false; + } + return options; +} diff --git a/shared/lib/eventUtils.ts b/shared/lib/eventUtils.ts new file mode 100644 index 000000000..e658cbb3f --- /dev/null +++ b/shared/lib/eventUtils.ts @@ -0,0 +1,252 @@ +import { EventEmitter } from 'events'; +import ITypedEventEmitter from '../interfaces/ITypedEventEmitter'; +import IRegisteredEventListener from '../interfaces/IRegisteredEventListener'; +import { IBoundLog } from '../interfaces/ILog'; +import { createPromise } from './utils'; +import IPendingWaitEvent, { CanceledPromiseError } from '../interfaces/IPendingWaitEvent'; + +export function addEventListener( + emitter: EventEmitter, + eventName: string | symbol, + handler: (...args: any[]) => void, +): IRegisteredEventListener { + emitter.on(eventName, handler); + return { emitter, eventName, handler }; +} + +export function addEventListeners( + emitter: EventEmitter, + registrations: [string | symbol, (...args: any[]) => void, boolean?][], +): IRegisteredEventListener[] { + return registrations.map(([eventName, handler]) => { + emitter.on(eventName, handler); + return { emitter, eventName, handler }; + }); +} + +export function removeEventListeners( + listeners: Array, +): void { + for (const listener of listeners) { + listener.emitter.off(listener.eventName, listener.handler); + } + listeners.length = 0; +} + +export function addTypedEventListener( + emitter: TypedEventEmitter, + eventName: K, + handler: (this: TypedEventEmitter, event?: T[K], initiator?: any) => any, + includeUnhandledEvents?: boolean, +): IRegisteredEventListener { + emitter.on(eventName, handler, includeUnhandledEvents); + return { emitter, eventName, handler }; +} + +export function addTypedEventListeners( + emitter: TypedEventEmitter, + registrations: [K, (this: TypedEventEmitter, event?: T[K]) => any, boolean?][], +): IRegisteredEventListener[] { + return registrations.map(([eventName, handler, includeUnhandled]) => { + emitter.on(eventName, handler, includeUnhandled); + return { emitter, eventName, handler }; + }); +} +export class TypedEventEmitter extends EventEmitter implements ITypedEventEmitter { + public storeEventsWithoutListeners = false; + public EventTypes: T; + + protected logger?: IBoundLog; + + private pendingIdCounter = 0; + private pendingWaitEventsById = new Map(); + + private eventsToLog = new Set(); + private storedEventsByType = new Map(); + private reemitterCountByEventType: { [eventType: string]: number } = {}; + + public cancelPendingEvents(message?: string, excludeEvents?: (keyof T & string)[]): void { + this.storedEventsByType.clear(); + const events = [...this.pendingWaitEventsById.values()]; + this.pendingWaitEventsById.clear(); + while (events.length) { + const event = events.shift(); + if (excludeEvents && excludeEvents.includes(event.event as any)) { + this.pendingWaitEventsById.set(event.id, event); + continue; + } + if (message) event.error.message = message; + event.resolvable.reject(event.error); + } + } + + public setEventsToLog(events: K[]): void { + this.eventsToLog = new Set(events); + } + + public waitOn( + eventType: K, + listenerFn?: (this: this, event?: T[K]) => boolean, + timeoutMillis = 30e3, + ): Promise { + const promise = createPromise( + timeoutMillis ?? 30e3, + `Timeout waiting for ${String(eventType)}`, + ); + + this.pendingIdCounter += 1; + const id = this.pendingIdCounter; + + this.pendingWaitEventsById.set(id, { + id, + event: eventType, + resolvable: promise, + error: new CanceledPromiseError(`Event (${String(eventType)}) canceled`), + }); + const messageId = this.logger?.stats(`waitOn:${eventType}`, { + timeoutMillis, + }); + const callbackFn = (result: T[K]): void => { + // give the listeners a second to register + if (!listenerFn || listenerFn.call(this, result)) { + this.logger?.stats(`waitOn.resolve:${eventType}`, { + parentLogId: messageId, + }); + promise.resolve(result); + } + }; + this.on(eventType, callbackFn); + + return promise.promise.finally(() => { + this.off(eventType, callbackFn); + this.pendingWaitEventsById.delete(id); + }); + } + + public addEventEmitter( + emitter: TypedEventEmitter, + eventTypes: K[], + ): IRegisteredEventListener[] { + const listeners: IRegisteredEventListener[] = []; + for (const eventName of eventTypes) { + const handler = emitter.emit.bind(emitter, eventName as any); + listeners.push({ handler, eventName, emitter: this }); + super.on(eventName, handler); + this.reemitterCountByEventType[eventName as string] ??= 0; + this.reemitterCountByEventType[eventName as string] += 1; + } + return listeners; + } + + public on( + eventType: K, + listenerFn: (this: this, event?: T[K]) => any, + includeUnhandledEvents = false, + ): this { + super.on(eventType, listenerFn); + return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); + } + + public off( + eventType: K, + listenerFn: (this: this, event?: T[K]) => any, + ): this { + return super.off(eventType, listenerFn); + } + + public once( + eventType: K, + listenerFn: (this: this, event?: T[K]) => any, + includeUnhandledEvents = false, + ): this { + super.once(eventType, listenerFn); + return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); + } + + public emit( + eventType: K, + event?: T[K], + sendInitiator?: object, + ): boolean { + const listeners = super.listenerCount(eventType); + if (this.storeEventsWithoutListeners && !listeners) { + if (!this.storedEventsByType.has(eventType)) this.storedEventsByType.set(eventType, []); + this.storedEventsByType.get(eventType).push(event); + return false; + } + this.logEvent(eventType, event); + if (sendInitiator) return super.emit(eventType, event, sendInitiator); + else return super.emit(eventType, event); + } + + public addListener( + eventType: K, + listenerFn: (this: this, event?: T[K]) => any, + includeUnhandledEvents = false, + ): this { + return this.on(eventType, listenerFn, includeUnhandledEvents); + } + + public removeListener( + eventType: K, + listenerFn: (this: this, event?: T[K]) => any, + ): this { + return super.removeListener(eventType, listenerFn); + } + + public prependListener( + eventType: K, + listenerFn: (this: this, event?: T[K]) => void, + includeUnhandledEvents = false, + ): this { + super.prependListener(eventType, listenerFn); + return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); + } + + public prependOnceListener( + eventType: K, + listenerFn: (this: this, event?: T[K]) => void, + includeUnhandledEvents = false, + ): this { + super.prependOnceListener(eventType, listenerFn); + return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); + } + + private replayOrClearMissedEvents( + shouldReplay: boolean, + eventType: K, + ): this { + const events = this.storedEventsByType.get(eventType); + if (!events || !events.length) return this; + this.storedEventsByType.delete(eventType); + if (shouldReplay) { + for (const event of events) { + this.logEvent(eventType, event); + super.emit(eventType, event); + } + } + return this; + } + + private logEvent(eventType: K, event?: T[K]): void { + if (this.eventsToLog.has(eventType)) { + let data: any = event; + if (eventType) { + if (typeof event === 'object') { + if ((event as any).toJSON) { + data = (event as any).toJSON(); + } else { + data = { ...event }; + for (const [key, val] of Object.entries(data)) { + if (!val) continue; + if ((val as any).toJSON) { + data[key] = (val as any).toJSON(); + } + } + } + } + } + this.logger?.stats(`emit:${eventType}`, data); + } + } +} diff --git a/shared/lib/fileUtils.ts b/shared/lib/fileUtils.ts new file mode 100644 index 000000000..1e18f31b2 --- /dev/null +++ b/shared/lib/fileUtils.ts @@ -0,0 +1,35 @@ +import { promises as Fs } from 'fs'; +import * as Os from 'os'; +import * as crypto from 'crypto'; + +export async function existsAsync(path: string): Promise { + try { + await Fs.access(path); + return true; + } catch (_) { + return false; + } +} + +export async function readFileAsJson(path: string): Promise { + const buffer = await Fs.readFile(path, 'utf8'); + return JSON.parse(buffer) as T; +} + +// Nodejs doesn't guarantee it will complete writing to the file if multiple processes are writing and/or the process shuts down. +export async function safeOverwriteFile(path: string, body: any): Promise { + if (await existsAsync(path)) { + const tempId = crypto.randomBytes(16).toString('hex'); + const tmpPath = `${path}.${tempId}`; + await Fs.writeFile(tmpPath, body); + await Fs.rename(tmpPath, path); + } else { + await Fs.writeFile(path, body); + } +} + +const homeDirReplace = new RegExp(Os.homedir(), 'g'); + +export function cleanHomeDir(str: string): string { + return str.replace(homeDirReplace, '~'); +} diff --git a/shared/lib/getProxyForUrl.ts b/shared/lib/getProxyForUrl.ts new file mode 100644 index 000000000..88b3c7ee6 --- /dev/null +++ b/shared/lib/getProxyForUrl.ts @@ -0,0 +1,87 @@ +import { URL } from 'url'; + +// logic from https://github.com/Rob--W/proxy-from-env + +export function getProxyForUrl(url: string): URL { + const parsedUrl = new URL(url); + let protocol = parsedUrl.protocol; + let hostname = parsedUrl.host; + if (typeof hostname !== 'string' || !hostname || typeof protocol !== 'string') { + return null; // Don't proxy URLs without a valid scheme or host. + } + + setProxyVars(); + protocol = protocol.split(':', 1)[0]; + // Stripping ports in this way instead of using parsedUrl.hostname to make + // sure that the brackets around IPv6 addresses are kept. + hostname = hostname.replace(/:\d*$/, ''); + let parsedPort = parseInt(parsedUrl.port, 10) || 0; + if (!parsedPort) parsedPort = protocol === 'https:' ? 443 : 80; + if (!shouldProxy(hostname, parsedPort)) { + return null; // Don't proxy URLs that match NO_PROXY. + } + + let proxy = + getEnv(`npm_config_${protocol}_proxy`) || + getEnv(`${protocol}_proxy`) || + getEnv('npm_config_proxy') || + getEnv('all_proxy'); + if (proxy && proxy.indexOf('://') === -1) { + // Missing scheme in proxy, default to the requested URL's scheme. + proxy = `${protocol}://${proxy}`; + } + if (!proxy) return null; + return new URL(proxy); +} + +function shouldProxy(hostname: string, port: number): boolean { + const NO_PROXY = (getEnv('npm_config_no_proxy') || getEnv('no_proxy')).toLowerCase(); + if (!NO_PROXY) { + return true; // Always proxy if NO_PROXY is not set. + } + if (NO_PROXY === '*') { + return false; // Never proxy if wildcard is set. + } + + for (const proxy of NO_PROXY.split(/[,\s]/)) { + if (!proxy) continue; + const parsedProxy = proxy.match(/^(.+):(\d+)$/); + let parsedProxyHostname = parsedProxy ? parsedProxy[1] : proxy; + const parsedProxyPort = parsedProxy ? parseInt(parsedProxy[2], 10) : 0; + if (parsedProxyPort && parsedProxyPort !== port) { + continue; + } + + if (!parsedProxyHostname.startsWith('.') && !parsedProxyHostname.startsWith('*')) { + // No wildcards, so stop proxying if there is an exact match. + if (hostname === parsedProxyHostname) { + return false; + } + } + + if (parsedProxyHostname.startsWith('*')) { + // Remove leading wildcard. + parsedProxyHostname = parsedProxyHostname.slice(1); + } + // Stop proxying if the hostname ends with the no_proxy host. + if (!hostname.endsWith(parsedProxyHostname)) { + return false; + } + } + return true; +} + +function getEnv(key: string): string { + return process.env[key.toLowerCase()] || process.env[key.toUpperCase()] || ''; +} + +function setProxyVars(): void { + // Override current environment proxy settings with npm configuration, if any. + const NPM_HTTPS_PROXY = process.env.npm_config_https_proxy || process.env.npm_config_proxy; + const NPM_HTTP_PROXY = process.env.npm_config_http_proxy || process.env.npm_config_proxy; + const NPM_NO_PROXY = process.env.npm_config_no_proxy; + + if (NPM_HTTPS_PROXY) process.env.HTTPS_PROXY = NPM_HTTPS_PROXY; + if (NPM_HTTP_PROXY) process.env.HTTP_PROXY = NPM_HTTP_PROXY; + if (NPM_NO_PROXY) process.env.NO_PROXY = NPM_NO_PROXY; +} diff --git a/shared/lib/utils.ts b/shared/lib/utils.ts new file mode 100644 index 000000000..14154976b --- /dev/null +++ b/shared/lib/utils.ts @@ -0,0 +1,147 @@ +import IResolvablePromise from '../interfaces/IResolvablePromise'; +import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; +import Resolvable from './Resolvable'; + +export function assert(value: unknown, message?: string, reject?): void { + if (value) return; + const error = new Error(message); + if (reject) { + reject(error); + } else { + throw error; + } +} + +// @deprecated - change case... can't remove due to hero dependency +export function getCallSite(priorToFilename?: string, endFilename?: string): ISourceCodeLocation[] { + return getCallsite(priorToFilename, endFilename); +} + +export function getCallsite(priorToFilename?: string, endFilename?: string): ISourceCodeLocation[] { + const startingPrepareStack = Error.prepareStackTrace; + const startingTraceLimit = Error.stackTraceLimit; + + Error.stackTraceLimit = 25; + Error.prepareStackTrace = (_, callsite): ISourceCodeLocation[] => { + return callsite.map(x => ({ + filename: x.getFileName(), + line: x.getLineNumber(), + column: x.getColumnNumber() - 1, + })); + }; + + const capture: { stack?: ISourceCodeLocation[] } = {}; + Error.captureStackTrace(capture); + Error.stackTraceLimit = startingTraceLimit; + let stack = capture.stack; + + Error.prepareStackTrace = startingPrepareStack; + let startIndex = 1; + + if (priorToFilename) { + const idx = stack.findIndex( + x => x.filename === priorToFilename || x.filename?.endsWith(priorToFilename), + ); + if (idx >= 0) startIndex = idx + 1; + } + stack = stack.slice(startIndex); + + if (endFilename) { + let lastIdx = -1; + for (let i = stack.length - 1; i >= 0; i -= 1) { + const x = stack[i]; + if (x.filename === endFilename || x.filename?.endsWith(endFilename)) { + lastIdx = i; + break; + } + } + if (lastIdx >= 0) stack = stack.slice(0, lastIdx + 1); + } + return stack.filter( + x => + !!x.filename && !x.filename.startsWith('internal') && !x.filename.startsWith('node:internal'), + ); +} + +export function escapeUnescapedChar(str: string, char: string): string { + let i = str.indexOf(char); + while (i !== -1) { + if (str[i - 1] !== '\\') { + str = `${str.substr(0, i)}\\${str.substr(i)}`; + } + i = str.indexOf(char, i + 2); + } + return str; +} + +export function pickRandom(array: T[]): T { + if (array.length === 1) return array[0]; + if (!array.length) throw new Error('Empty array provided to "pickRandom"'); + return array[Math.floor(Math.random() * array.length)]; +} + +const prototypeFunctionMap = new WeakMap>(); +export function getObjectFunctionProperties(object: any): Set { + if (prototypeFunctionMap.has(object)) return prototypeFunctionMap.get(object); + + const functionKeys = new Set(); + for (const key of Reflect.ownKeys(object)) { + if (key === 'constructor') { + continue; + } + const descriptor = Reflect.getOwnPropertyDescriptor(object, key); + if ( + descriptor && + typeof descriptor.value === 'function' && + !descriptor.get && + !descriptor.set && + descriptor.writable + ) { + functionKeys.add(key); + } + } + + prototypeFunctionMap.set(object, functionKeys); + return functionKeys; +} + +const prototypeHierarchyCache = new WeakMap(); +export function getPrototypeHierarchy(self: any): object[] { + const hierarchy: object[] = []; + let object = self; + do { + hierarchy.unshift(object); + + if (prototypeHierarchyCache.has(object)) { + return prototypeHierarchyCache.get(object).concat(hierarchy); + } + + object = Reflect.getPrototypeOf(object); + } while (object && object !== Object.prototype); + + // don't put in the last item + for (let i = 0; i < hierarchy.length - 1; i += 1) { + const entry = hierarchy[i]; + const ancestors = i > 0 ? hierarchy.slice(0, i) : []; + prototypeHierarchyCache.set(entry, ancestors); + } + + return hierarchy; +} + +export function bindFunctions(self: any): void { + const hierarchy = getPrototypeHierarchy(self); + for (const tier of hierarchy) { + const keys = getObjectFunctionProperties(tier); + for (const key of keys) { + self[key] = self[key].bind(self); + } + } +} + +export function createPromise( + timeoutMillis?: number, + timeoutMessage?: string, +): IResolvablePromise { + return new Resolvable(timeoutMillis, timeoutMessage); +} diff --git a/shared/package.build.json b/shared/package.build.json new file mode 100644 index 000000000..6ae64c052 --- /dev/null +++ b/shared/package.build.json @@ -0,0 +1,3 @@ +{ + "devDependencies": {} +} diff --git a/shared/package.dist.json b/shared/package.dist.json new file mode 100644 index 000000000..210ca3a0e --- /dev/null +++ b/shared/package.dist.json @@ -0,0 +1,4 @@ +{ + "scripts": {}, + "devDependencies": {} +} diff --git a/shared/package.json b/shared/package.json new file mode 100644 index 000000000..259765932 --- /dev/null +++ b/shared/package.json @@ -0,0 +1,45 @@ +{ + "name": "@ulixee/commons", + "version": "2.0.0-alpha.2", + "description": "Common utilities for Ulixee", + "license": "MIT", + "scripts": { + "prepare": "husky install", + "build": "pwd && yarn tsc && ulx-repo-after-build && cd ./build && yarn install -focus", + "build:dist": "shx rm -rf build-dist && tsc -b tsconfig.dist.json && ulx-repo-after-build --dist", + "tsc": "tsc -b -i tsconfig.json", + "watch": "tsc -b -i -w tsconfig.json", + "test": "cross-env NODE_ENV=test jest", + "lint": "eslint --cache ./" + }, + "dependencies": { + "devtools-protocol": "^0.0.981744", + "https-proxy-agent": "^5.0.0", + "semver": "^7.3.7", + "source-map-js": "^1.0.1" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.5.0", + "@commitlint/cli": "^12.0.1", + "@commitlint/config-conventional": "^12.0.1", + "@types/node": "^14.18.18", + "@ulixee/repo-tools": "1.0.7", + "cross-env": "^7.0.3", + "@types/jest": "^27.5.1", + "jest": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-summary-reporter": "^0.0.2", + "husky": "^7.0.1", + "lint-staged": "^10.5.2", + "shx": "^0.3.3", + "typescript": "~4.5.5" + }, + "lint-staged": { + "*.ts": [ + "eslint --fix" + ], + "*.json": [ + "prettier --write" + ] + } +} diff --git a/shared/test/SourceLoader.test.ts b/shared/test/SourceLoader.test.ts new file mode 100644 index 000000000..9c3fb63fd --- /dev/null +++ b/shared/test/SourceLoader.test.ts @@ -0,0 +1,15 @@ +import { getCallsite } from '../lib/utils'; +import SourceLoader from '../lib/SourceLoader'; +import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; + +it('can lookup source code', function () { + let callsite: ISourceCodeLocation[]; + // run code like this so we can see the true load (?? will be translated by typescript) + function loadCallsite() { + callsite ??= getCallsite(); + return callsite; + } + const site = loadCallsite(); + expect(SourceLoader.getSource(site[0]).code).toBe(` callsite ??= getCallsite();`); + expect(SourceLoader.getSource(site[1]).code).toBe(` const site = loadCallsite();`); +}); diff --git a/shared/test/SourceMapSupport.test.ts b/shared/test/SourceMapSupport.test.ts new file mode 100644 index 000000000..bc7527192 --- /dev/null +++ b/shared/test/SourceMapSupport.test.ts @@ -0,0 +1,297 @@ +import { SourceMapSupport } from '../lib/SourceMapSupport'; +import { SourceMapGenerator } from 'source-map-js'; +import * as fs from 'fs'; +import * as path from 'path'; +import SourceLoader from '../lib/SourceLoader'; + +let counter = 0; + +beforeEach(() => { + jest.resetModules(); + SourceMapSupport.resetCache(); + SourceLoader.resetCache(); + counter += 1; +}); + +it('normal throw', function () { + const { full, inline } = createStackTraces(createMultiLineSourceMap(), [ + 'throw new Error("test");', + ]); + + for (const stack of [full, inline]) { + expect(stack[0]).toBe('Error: test'); + expect(stack[1]).toMatch( + /^ at Object\.\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/, + ); + } +}); + +it('throw inside function', function () { + const { full, inline } = createStackTraces(createMultiLineSourceMap(), [ + 'function foo() {', + ' throw new Error("test");', + '}', + 'foo();', + ]); + + for (const stack of [full, inline]) { + expect(stack[0]).toBe('Error: test'); + expect(stack[1]).toMatch(/^ at foo \((?:.*[/\\])?line2\.js:1002:102\)$/); + expect(stack[2]).toMatch( + /^ at Object\.\.exports\.test \((?:.*[/\\])?line4\.js:1004:104\)$/, + ); + } +}); + +it('throw inside function inside function', function () { + const { full, inline } = createStackTraces(createMultiLineSourceMap(), [ + 'function foo() {', + ' function bar() {', + ' throw new Error("test");', + ' }', + ' bar();', + '}', + 'foo();', + ]); + + for (const stack of [full, inline]) { + expect(stack[0]).toBe('Error: test'); + expect(stack[1]).toMatch(/^ at bar \((?:.*[/\\])?line3\.js:1003:103\)$/); + expect(stack[2]).toMatch(/^ at foo \((?:.*[/\\])?line5\.js:1005:105\)$/); + expect(stack[3]).toMatch( + /^ at Object\.\.exports\.test \((?:.*[/\\])?line7\.js:1007:107\)$/, + ); + } +}); + +it('native function', function () { + const sourceMap = createEmptySourceMap(); + sourceMap.addMapping({ + generated: { line: 1, column: 0 }, + original: { line: 1, column: 0 }, + source: '.original.js', + }); + const { full, inline } = createStackTraces(sourceMap, [ + '[1].map(function(x) { throw new Error(x); });', + ]); + + for (const stack of [full, inline]) { + expect(stack[0]).toBe('Error: 1'); + expect(stack[1]).toMatch(/[/\\].original\.js/); + expect(stack[2]).toMatch(/at Array\.map \((native|)\)/); + } +}); + +it('function constructor', function () { + const { full, inline } = createStackTraces(createMultiLineSourceMap(), [ + 'throw new Function(")");', + ]); + + for (const stack of [full, inline]) { + expect(stack[0]).toMatch(/SyntaxError: Unexpected token '?\)'?/); + } +}); + +it('throw with empty source map', function () { + const { full, inline } = createStackTraces(createEmptySourceMap(), ['throw new Error("test");']); + + for (const stack of [full, inline]) { + expect(stack[0]).toBe('Error: test'); + expect(stack[1]).toMatch( + /^ at Object\.\.exports\.test \((?:.*[/\\])?\.generated-\d+(?:-inline)?\.js:1:\d+\)$/, + ); + } +}); + +it('throw with source map with gap', function () { + const { full, inline } = createStackTraces(createSourceMapWithGap(), [ + 'throw new Error("test");', + ]); + + for (const stack of [full, inline]) { + expect(stack[0]).toBe('Error: test'); + expect(stack[1]).toMatch( + /^ at Object\.\.exports\.test \((?:.*[/\\])?\.generated-\d+(?:-inline)?\.js:1:\d+\)$/, + ); + } +}); + +it('finds the last sourceMappingURL', function () { + const { full, inline } = createStackTraces(createMultiLineSourceMapWithSourcesContent(), [ + '//# sourceMappingURL=missing.map.js', // NB: createStackTraces adds another source mapping. + 'throw new Error("test");', + ]); + + for (const stack of [full, inline]) { + expect(stack[0]).toBe('Error: test'); + expect(stack[1]).toMatch( + /^ at Object\.\.exports\.test \((?:.*[/\\])?original\.js:1002:5\)$/, + ); + } +}); + +it('maps original name from source', function () { + const sourceMap = createEmptySourceMap(); + sourceMap.addMapping({ + generated: { line: 2, column: 8 }, + original: { line: 1000, column: 10 }, + source: '.original2.js', + }); + sourceMap.addMapping({ + generated: { line: 4, column: 0 }, + original: { line: 1002, column: 1 }, + source: '.original2.js', + name: 'myOriginalName', + }); + const { full, inline } = createStackTraces(sourceMap, [ + 'function foo() {', + ' throw new Error("test");', + '}', + 'foo();', + ]); + + for (const stack of [full, inline]) { + expect(stack[0]).toBe('Error: test'); + expect(stack[1]).toMatch(/^ at myOriginalName \((?:.*[/\\])?\.original2.js:1000:11\)$/); + expect(stack[2]).toMatch( + /^ at Object\.\.exports\.test \((?:.*[/\\])?\.original2.js:1002:2\)$/, + ); + } +}); + +/* The following test duplicates some of the code in + * `createStackTraces` but appends a charset to the + * source mapping url. + */ +it('finds source maps with charset specified', function () { + const sourceMap = createMultiLineSourceMap(); + + const file = `./.generated-${counter}.js`; + fs.writeFileSync( + path.join(__dirname, file), + 'exports.test = function() {' + + 'throw new Error("test");' + + '};//@ sourceMappingURL=data:application/json;charset=utf8;base64,' + + Buffer.from(sourceMap.toString()).toString('base64'), + ); + try { + require(file).test(); + } catch (e) { + const stack = e.stack.split(/\r\n|\n/); + expect(stack[0]).toBe('Error: test'); + expect(stack[1]).toMatch( + /^ at Object\.\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/, + ); + } + fs.unlinkSync(path.join(__dirname, file)); +}); + +/* The following test duplicates some of the code in + * `createStackTraces` but appends some code and a + * comment to the source mapping url. + */ +it('allows code/comments after sourceMappingURL', function () { + const sourceMap = createMultiLineSourceMap(); + const file = `./.generated-${counter}.js`; + fs.writeFileSync( + path.join(__dirname, file), + 'exports.test = function() {' + + 'throw new Error("test");' + + '};//# sourceMappingURL=data:application/json;base64,' + + Buffer.from(sourceMap.toString()).toString('base64') + + '\n// Some comment below the sourceMappingURL\nvar foo = 0;', + ); + try { + require(file).test(); + } catch (e) { + const stack = e.stack.split(/\r\n|\n/); + expect(stack[0]).toBe('Error: test'); + expect(stack[1]).toMatch( + /^ at Object\.\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/, + ); + } + fs.unlinkSync(path.join(__dirname, file)); +}); + +function createEmptySourceMap(): SourceMapGenerator { + return new SourceMapGenerator({ + file: `.generated-${counter}.js`, + sourceRoot: '.', + }); +} + +function createSourceMapWithGap(): SourceMapGenerator { + const sourceMap = createEmptySourceMap(); + sourceMap.addMapping({ + generated: { line: 100, column: 0 }, + original: { line: 100, column: 0 }, + source: '.original.js', + }); + return sourceMap; +} + +function createMultiLineSourceMap(): SourceMapGenerator { + const sourceMap = createEmptySourceMap(); + for (let i = 1; i <= 100; i++) { + sourceMap.addMapping({ + generated: { line: i, column: 0 }, + original: { line: 1000 + i, column: 99 + i }, + source: 'line' + i + '.js', + }); + } + return sourceMap; +} + +function createMultiLineSourceMapWithSourcesContent(): SourceMapGenerator { + const sourceMap = createEmptySourceMap(); + let original = new Array(1001).join('\n'); + for (let i = 1; i <= 100; i++) { + sourceMap.addMapping({ + generated: { line: i, column: 0 }, + original: { line: 1000 + i, column: 4 }, + source: 'original.js', + }); + original += ' line ' + i + '\n'; + } + sourceMap.setSourceContent('original.js', original); + return sourceMap; +} + +function createStackTraces( + sourceMap: SourceMapSupport, + source: string[], +): { full: string[]; inline: string[] } { + // Check once with a separate source map + fs.writeFileSync(`${__dirname}/.generated-${counter}.js.map`, sourceMap.toString()); + fs.writeFileSync( + `${__dirname}/.generated-${counter}.js`, + 'exports.test = function() {' + + source.join('\n') + + `};//@ sourceMappingURL=.generated-${counter}.js.map`, + ); + const response = { full: null, inline: null }; + try { + require(`./.generated-${counter}`).test(); + } catch (e) { + response.full = e.stack.split(/\r\n|\n/); + } + + fs.unlinkSync(`${__dirname}/.generated-${counter}.js`); + fs.unlinkSync(`${__dirname}/.generated-${counter}.js.map`); + // Check again with an inline source map (in a data URL) + fs.writeFileSync( + `${__dirname}/.generated-${counter}-inline.js`, + 'exports.test = function() {' + + source.join('\n') + + '};//@ sourceMappingURL=data:application/json;base64,' + + Buffer.from(sourceMap.toString()).toString('base64'), + ); + try { + require(`./.generated-${counter}-inline`).test(); + } catch (e) { + response.inline = e.stack.split(/\r\n|\n/); + } + fs.unlinkSync(`${__dirname}/.generated-${counter}-inline.js`); + + return response; +} diff --git a/shared/test/TypeSerializer.test.ts b/shared/test/TypeSerializer.test.ts new file mode 100644 index 000000000..c16253c6f --- /dev/null +++ b/shared/test/TypeSerializer.test.ts @@ -0,0 +1,31 @@ +import TypeSerializer from '../lib/TypeSerializer'; +import { CanceledPromiseError } from '../interfaces/IPendingWaitEvent'; + +let testObject: any; +beforeAll(() => { + testObject = { + name: 'original', + map: new Map([ + ['1', 1], + ['2', 2], + ]), + set: new Set([1, 2, 3, 4]), + regex: /test13234/gi, + date: new Date('2021-03-17T15:41:06.513Z'), + buffer: Buffer.from('This is a test buffer'), + error: new CanceledPromiseError('This is canceled'), + }; + + testObject.nestedObject = { ...testObject, name: 'nested' }; + testObject.nestedArray = [ + { ...testObject, name: 'item1' }, + { ...testObject, name: 'item2' }, + ]; +}); + +test('it should be able to serialize a complex object in nodejs', () => { + const result = TypeSerializer.stringify(testObject); + expect(typeof result).toBe('string'); + const decoded = TypeSerializer.parse(result); + expect(decoded).toEqual(testObject); +}); diff --git a/shared/test/utils.test.ts b/shared/test/utils.test.ts new file mode 100644 index 000000000..5e79e2dfa --- /dev/null +++ b/shared/test/utils.test.ts @@ -0,0 +1,58 @@ +import * as Utils from '../lib/utils'; +import { bindFunctions } from '../lib/utils'; +import { isSemverSatisfied } from '../lib/VersionUtils'; + +const { escapeUnescapedChar } = Utils; + +test('should escape unescaped regex chars', () => { + const result = escapeUnescapedChar('http://test.com?param=1', '?'); + expect(result).toBe('http://test.com\\?param=1'); +}); + +test('should not escape already unescaped regex chars', () => { + const result = escapeUnescapedChar('http://test.com\\?param=1', '?'); + expect(result).toBe('http://test.com\\?param=1'); +}); + +test('should get all functions of an object hierarchy', () => { + class BaseClass { + method1() {} + method2() {} + } + + class TestClass extends BaseClass { + method3() {} + } + + const instance = new TestClass(); + const hierarchy = Utils.getPrototypeHierarchy(instance); + expect(hierarchy[0]).toEqual(BaseClass.prototype); + expect(hierarchy[1]).toEqual(TestClass.prototype); + expect(hierarchy[2]).toEqual(instance); + // cache should return the same set + expect(Utils.getPrototypeHierarchy(instance)).toEqual(hierarchy); + + bindFunctions(instance); + + expect([...Utils.getObjectFunctionProperties(BaseClass.prototype)]).toEqual([ + 'method1', + 'method2', + ]); + expect([...Utils.getObjectFunctionProperties(TestClass.prototype)]).toEqual(['method3']); + + // should bind all methods + expect([...Utils.getObjectFunctionProperties(instance)]).toEqual([ + 'method1', + 'method2', + 'method3', + ]); +}); + +test('can check Prerelease Semvers', () => { + expect(isSemverSatisfied('2.0.0-alpha.1', '2.0.0-alpha.1')).toBeTruthy(); + expect(isSemverSatisfied('2.0.0-alpha.1', '2.0.0-alpha.2')).toBeTruthy(); +}); + +test('can handle v in front of versions', () => { + expect(isSemverSatisfied('v2.0.0-alpha.1', '2.0.0-alpha.1')).toBeTruthy(); +}) diff --git a/shared/tsconfig.dist.json b/shared/tsconfig.dist.json new file mode 100644 index 000000000..85fb7a53a --- /dev/null +++ b/shared/tsconfig.dist.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./build-dist", + "sourceMap": true, + "inlineSourceMap": false + } +} diff --git a/shared/tsconfig.json b/shared/tsconfig.json new file mode 100644 index 000000000..07b6df79f --- /dev/null +++ b/shared/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "./node_modules/@ulixee/repo-tools/tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "./build" + }, + "include": ["**/*.ts", "*.json", ".eslintrc.js"], + "exclude": [ + "**/tsconfig*.json", + "build", + "build-dist", + "node_modules", + "**/node_modules", + "docs", + "**/*.d.ts" + ] +} diff --git a/shared/yarn.lock b/shared/yarn.lock new file mode 100644 index 000000000..49e9b5596 --- /dev/null +++ b/shared/yarn.lock @@ -0,0 +1,5002 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.0.tgz#c58d04d7c6fbfb58ea7681e2b9145cfb62726756" + integrity sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.0" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helpers" "^7.18.0" + "@babel/parser" "^7.18.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.0", "@babel/generator@^7.7.2": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.0.tgz#46d28e8a18fc737b028efb25ab105d74473af43f" + integrity sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg== + dependencies: + "@babel/types" "^7.18.0" + "@jridgewell/gen-mapping" "^0.3.0" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" + integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" + +"@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.17.12", "@babel/helper-plugin-utils@^7.8.0": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" + integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== + +"@babel/helper-simple-access@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" + integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helpers@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.0.tgz#aff37c3590de42102b54842446146d0205946370" + integrity sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" + integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112" + integrity sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + 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": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b" + integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/runtime-corejs3@^7.10.2": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.0.tgz#eed03023c5226b1e2b2ba32b8b6af5cb0518a6c7" + integrity sha512-G5FaGZOWORq9zthDjIrjib5XlcddeqLbIiDO3YQsut6j7aGf76xn0umUC/pA6+nApk3hQJF4JzLzg5PCl6ewJg== + dependencies: + core-js-pure "^3.20.2" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.16.3": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.0.tgz#6d77142a19cb6088f0af662af1ada37a604d34ae" + integrity sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.18.0", "@babel/traverse@^7.7.2": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.0.tgz#0e5ec6db098660b2372dd63d096bf484e32d27ba" + integrity sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.0" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.18.0" + "@babel/types" "^7.18.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.0.tgz#ef523ea349722849cb4bf806e9342ede4d071553" + integrity sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@commitlint/cli@^12.0.1": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-12.1.4.tgz#af4d9dd3c0122c7b39a61fa1cd2abbad0422dbe0" + integrity sha512-ZR1WjXLvqEffYyBPT0XdnSxtt3Ty1TMoujEtseW5o3vPnkA1UNashAMjQVg/oELqfaiAMnDw8SERPMN0e/0kLg== + dependencies: + "@commitlint/format" "^12.1.4" + "@commitlint/lint" "^12.1.4" + "@commitlint/load" "^12.1.4" + "@commitlint/read" "^12.1.4" + "@commitlint/types" "^12.1.4" + lodash "^4.17.19" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^16.2.0" + +"@commitlint/config-conventional@^12.0.1": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-12.1.4.tgz#95bbab622f117a8a3e49f95917b08655040c66a8" + integrity sha512-ZIdzmdy4o4WyqywMEpprRCrehjCSQrHkaRTVZV411GyLigFQHlEBSJITAihLAWe88Qy/8SyoIe5uKvAsV5vRqQ== + dependencies: + conventional-changelog-conventionalcommits "^4.3.1" + +"@commitlint/ensure@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-12.1.4.tgz#287ae2dcc5ccb086e749705b1bd9bdb99773056f" + integrity sha512-MxHIBuAG9M4xl33qUfIeMSasbv3ktK0W+iygldBxZOL4QSYC2Gn66pZAQMnV9o3V+sVFHoAK2XUKqBAYrgbEqw== + dependencies: + "@commitlint/types" "^12.1.4" + lodash "^4.17.19" + +"@commitlint/execute-rule@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-12.1.4.tgz#9973b02e9779adbf1522ae9ac207a4815ec73de1" + integrity sha512-h2S1j8SXyNeABb27q2Ok2vD1WfxJiXvOttKuRA9Or7LN6OQoC/KtT3844CIhhWNteNMu/wE0gkTqGxDVAnJiHg== + +"@commitlint/format@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-12.1.4.tgz#db2d46418a6ae57c90e5f7f65dff46f0265d9f24" + integrity sha512-h28ucMaoRjVvvgS6Bdf85fa/+ZZ/iu1aeWGCpURnQV7/rrVjkhNSjZwGlCOUd5kDV1EnZ5XdI7L18SUpRjs26g== + dependencies: + "@commitlint/types" "^12.1.4" + chalk "^4.0.0" + +"@commitlint/is-ignored@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-12.1.4.tgz#4c430bc3b361aa9be5cd4ddb252c1559870ea7bc" + integrity sha512-uTu2jQU2SKvtIRVLOzMQo3KxDtO+iJ1p0olmncwrqy4AfPLgwoyCP2CiULq5M7xpR3+dE3hBlZXbZTQbD7ycIw== + dependencies: + "@commitlint/types" "^12.1.4" + semver "7.3.5" + +"@commitlint/lint@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-12.1.4.tgz#856b7fd2b2e6367b836cb84a12f1c1b3c0e40d22" + integrity sha512-1kZ8YDp4to47oIPFELUFGLiLumtPNKJigPFDuHt2+f3Q3IKdQ0uk53n3CPl4uoyso/Og/EZvb1mXjFR/Yce4cA== + dependencies: + "@commitlint/is-ignored" "^12.1.4" + "@commitlint/parse" "^12.1.4" + "@commitlint/rules" "^12.1.4" + "@commitlint/types" "^12.1.4" + +"@commitlint/load@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-12.1.4.tgz#e3c2dbc0e7d8d928f57a6878bd7219909fc0acab" + integrity sha512-Keszi0IOjRzKfxT+qES/n+KZyLrxy79RQz8wWgssCboYjKEp+wC+fLCgbiMCYjI5k31CIzIOq/16J7Ycr0C0EA== + dependencies: + "@commitlint/execute-rule" "^12.1.4" + "@commitlint/resolve-extends" "^12.1.4" + "@commitlint/types" "^12.1.4" + chalk "^4.0.0" + cosmiconfig "^7.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + +"@commitlint/message@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-12.1.4.tgz#3895edcc0709deca5945f3d55f5ea95a9f1f446d" + integrity sha512-6QhalEKsKQ/Y16/cTk5NH4iByz26fqws2ub+AinHPtM7Io0jy4e3rym9iE+TkEqiqWZlUigZnTwbPvRJeSUBaA== + +"@commitlint/parse@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-12.1.4.tgz#ba03d54d24ef84f6fd2ff31c5e9998b22d7d0aa1" + integrity sha512-yqKSAsK2V4X/HaLb/yYdrzs6oD/G48Ilt0EJ2Mp6RJeWYxG14w/Out6JrneWnr/cpzemyN5hExOg6+TB19H/Lw== + dependencies: + "@commitlint/types" "^12.1.4" + conventional-changelog-angular "^5.0.11" + conventional-commits-parser "^3.0.0" + +"@commitlint/read@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-12.1.4.tgz#552fda42ef185d5b578beb6f626a5f8b282de3a6" + integrity sha512-TnPQSJgD8Aod5Xeo9W4SaYKRZmIahukjcCWJ2s5zb3ZYSmj6C85YD9cR5vlRyrZjj78ItLUV/X4FMWWVIS38Jg== + dependencies: + "@commitlint/top-level" "^12.1.4" + "@commitlint/types" "^12.1.4" + fs-extra "^9.0.0" + git-raw-commits "^2.0.0" + +"@commitlint/resolve-extends@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-12.1.4.tgz#e758ed7dcdf942618b9f603a7c28a640f6a0802a" + integrity sha512-R9CoUtsXLd6KSCfsZly04grsH6JVnWFmVtWgWs1KdDpdV+G3TSs37tColMFqglpkx3dsWu8dsPD56+D9YnJfqg== + dependencies: + import-fresh "^3.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/rules@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-12.1.4.tgz#0e141b08caa3d7bdc48aa784baa8baff3efd64db" + integrity sha512-W8m6ZSjg7RuIsIfzQiFHa48X5mcPXeKT9yjBxVmjHvYfS2FDBf1VxCQ7vO0JTVIdV4ohjZ0eKg/wxxUuZHJAZg== + dependencies: + "@commitlint/ensure" "^12.1.4" + "@commitlint/message" "^12.1.4" + "@commitlint/to-lines" "^12.1.4" + "@commitlint/types" "^12.1.4" + +"@commitlint/to-lines@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-12.1.4.tgz#caa582dbf121f377a0588bb64e25c4854843cd25" + integrity sha512-TParumvbi8bdx3EdLXz2MaX+e15ZgoCqNUgqHsRLwyqLUTRbqCVkzrfadG1UcMQk8/d5aMbb327ZKG3Q4BRorw== + +"@commitlint/top-level@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-12.1.4.tgz#96d5c715bfc1bdf86dfcf11b67fc2cf7658c7a6e" + integrity sha512-d4lTJrOT/dXlpY+NIt4CUl77ciEzYeNVc0VFgUQ6VA+b1rqYD2/VWFjBlWVOrklxtSDeKyuEhs36RGrppEFAvg== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^12.1.4": + version "12.1.4" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-12.1.4.tgz#9618a5dc8991fb58e6de6ed89d7bf712fa74ba7e" + integrity sha512-KRIjdnWNUx6ywz+SJvjmNCbQKcKP6KArhjZhY2l+CWKxak0d77SOjggkMwFTiSgLODOwmuLTbarR2ZfWPiPMlw== + dependencies: + chalk "^4.0.0" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + 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== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + 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== + 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" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + 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" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@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" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + 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== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@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== + 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" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.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" + 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" + +"@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== + dependencies: + 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== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@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== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@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== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@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" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.1.19" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@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": + version "7.17.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" + integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/better-sqlite3@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.5.0.tgz#c57f42c76153d070f7673fbad0084ee324905be0" + integrity sha512-G9ZbMjydW2yj1AgiPlUtdgF3a1qNpLJLudc9ynJCeJByS3XFWpmT9LT+VSHrKHFbxb31CvtYwetLTOvG9zdxdg== + dependencies: + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.1.tgz#2c8b6dc6ff85c33bcd07d0b62cb3d19ddfdb3ab9" + integrity sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/minimatch@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/node@*": + version "17.0.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.35.tgz#635b7586086d51fb40de0a2ec9d1014a5283ba4a" + integrity sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg== + +"@types/node@^14.18.18": + version "14.18.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.18.tgz#5c9503030df484ccffcbb935ea9a9e1d6fad1a20" + integrity sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^2.1.5": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.1.tgz#76e72d8a775eef7ce649c63c8acae1a0824bbaed" + integrity sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.25.0": + version "5.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.25.0.tgz#e8ce050990e4d36cc200f2de71ca0d3eb5e77a31" + integrity sha512-icYrFnUzvm+LhW0QeJNKkezBu6tJs9p/53dpPLFH8zoM9w1tfaKzVurkPotEpAqQ8Vf8uaFyL5jHd0Vs6Z0ZQg== + dependencies: + "@typescript-eslint/scope-manager" "5.25.0" + "@typescript-eslint/type-utils" "5.25.0" + "@typescript-eslint/utils" "5.25.0" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.25.0.tgz#950ab2ab402852a8a2c02b4b254b06d411a6ba9e" + integrity sha512-YTe9rmslCh1xAvNa3X+uZe4L2lsyb8V3WIeK9z46nNiPswk/V/0SGLJSfo8W9Hj4R7ak7bolazXGn3DErmb8QA== + dependencies: + "@typescript-eslint/utils" "5.25.0" + +"@typescript-eslint/parser@^5.25.0": + version "5.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.25.0.tgz#fb533487147b4b9efd999a4d2da0b6c263b64f7f" + integrity sha512-r3hwrOWYbNKP1nTcIw/aZoH+8bBnh/Lh1iDHoFpyG4DnCpvEdctrSl6LOo19fZbzypjQMHdajolxs6VpYoChgA== + dependencies: + "@typescript-eslint/scope-manager" "5.25.0" + "@typescript-eslint/types" "5.25.0" + "@typescript-eslint/typescript-estree" "5.25.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.25.0": + version "5.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.25.0.tgz#e78f1484bca7e484c48782075219c82c6b77a09f" + integrity sha512-p4SKTFWj+2VpreUZ5xMQsBMDdQ9XdRvODKXN4EksyBjFp2YvQdLkyHqOffakYZPuWJUDNu3jVXtHALDyTv3cww== + dependencies: + "@typescript-eslint/types" "5.25.0" + "@typescript-eslint/visitor-keys" "5.25.0" + +"@typescript-eslint/type-utils@5.25.0": + version "5.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.25.0.tgz#5750d26a5db4c4d68d511611e0ada04e56f613bc" + integrity sha512-B6nb3GK3Gv1Rsb2pqalebe/RyQoyG/WDy9yhj8EE0Ikds4Xa8RR28nHz+wlt4tMZk5bnAr0f3oC8TuDAd5CPrw== + dependencies: + "@typescript-eslint/utils" "5.25.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.25.0": + version "5.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.25.0.tgz#dee51b1855788b24a2eceeae54e4adb89b088dd8" + integrity sha512-7fWqfxr0KNHj75PFqlGX24gWjdV/FDBABXL5dyvBOWHpACGyveok8Uj4ipPX/1fGU63fBkzSIycEje4XsOxUFA== + +"@typescript-eslint/typescript-estree@5.25.0": + version "5.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.25.0.tgz#a7ab40d32eb944e3fb5b4e3646e81b1bcdd63e00" + integrity sha512-MrPODKDych/oWs/71LCnuO7NyR681HuBly2uLnX3r5i4ME7q/yBqC4hW33kmxtuauLTM0OuBOhhkFaxCCOjEEw== + dependencies: + "@typescript-eslint/types" "5.25.0" + "@typescript-eslint/visitor-keys" "5.25.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.25.0": + version "5.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.25.0.tgz#272751fd737733294b4ab95e16c7f2d4a75c2049" + integrity sha512-qNC9bhnz/n9Kba3yI6HQgQdBLuxDoMgdjzdhSInZh6NaDnFpTUlwNGxplUFWfY260Ya0TRPvkg9dd57qxrJI9g== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.25.0" + "@typescript-eslint/types" "5.25.0" + "@typescript-eslint/typescript-estree" "5.25.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.25.0": + version "5.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.25.0.tgz#33aa5fdcc5cedb9f4c8828c6a019d58548d4474b" + integrity sha512-yd26vFgMsC4h2dgX4+LR+GeicSKIfUvZREFLf3DDjZPtqgLx5AJZr6TetMNwFP9hcKreTTeztQYBTNbNoOycwA== + dependencies: + "@typescript-eslint/types" "5.25.0" + eslint-visitor-keys "^3.3.0" + +"@ulixee/repo-tools@1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.7.tgz#74448e3225a1730c1be5c77adfe52f1d02eb89ea" + integrity sha512-WdBloK6Ciz7VUBWHy/H5KYTeEsL6cU4tL4lvL0Sm/r8OiV6biE8qbVFtghg3AssBvoVFXT1utklpQurYUEPBnw== + dependencies: + "@typescript-eslint/eslint-plugin" "^5.25.0" + "@typescript-eslint/parser" "^5.25.0" + copyfiles "^2.4.1" + eslint "^7.21.0" + eslint-config-airbnb-typescript "^17.0.0" + eslint-config-prettier "^8.3.0" + eslint-import-resolver-typescript "^2.5.0" + eslint-plugin-eslint-comments "^3.2.0" + eslint-plugin-import "^2.25.4" + eslint-plugin-jest "^25.2.2" + eslint-plugin-jsx-a11y "^6.4.1" + eslint-plugin-monorepo-cop "^1.0.2" + eslint-plugin-prettier "^4.0.0" + eslint-plugin-promise "^5.1.1" + eslint-plugin-react "^7.22.0" + eslint-plugin-react-hooks "^4.2.0" + prettier "^2.2.1" + pretty-quick "^3.1.0" + typescript "^4.5.5" + +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +array-includes@^3.1.4, array-includes@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +axe-core@^4.3.5: + version "4.4.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.2.tgz#dcf7fb6dea866166c3eab33d68208afe4d5f670c" + integrity sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA== + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +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== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + 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== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@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== + 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-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@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-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== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.20.2: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001332: + version "1.0.30001341" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz#59590c8ffa8b5939cf4161f00827b8873ad72498" + integrity sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA== + +chalk@^2.0.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== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +ci-info@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.1.tgz#58331f6f472a25fe3a50a351ae3052936c2c7f32" + integrity sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +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== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.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" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.16: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +confusing-browser-globals@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +conventional-changelog-angular@^5.0.11: + version "5.0.13" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" + integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== + dependencies: + compare-func "^2.0.0" + q "^1.5.1" + +conventional-changelog-conventionalcommits@^4.3.1: + version "4.6.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" + integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== + dependencies: + compare-func "^2.0.0" + lodash "^4.17.15" + q "^1.5.1" + +conventional-commits-parser@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" + integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +copyfiles@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" + integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== + dependencies: + glob "^7.0.5" + minimatch "^3.0.3" + mkdirp "^1.0.4" + noms "0.0.0" + through2 "^2.0.1" + untildify "^4.0.0" + yargs "^16.1.0" + +core-js-pure@^3.20.2: + version "3.22.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.5.tgz#bdee0ed2f9b78f2862cda4338a07b13a49b6c9a9" + integrity sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +damerau-levenshtein@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +devtools-protocol@^0.0.981744: + version "0.0.981744" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.981744.tgz#9960da0370284577d46c28979a0b32651022bacf" + integrity sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg== + +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== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +electron-to-chromium@^1.4.118: + version "1.4.137" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f" + integrity sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA== + +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== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.5, enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb-typescript@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz#360dbcf810b26bbcf2ff716198465775f1c49a07" + integrity sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g== + dependencies: + eslint-config-airbnb-base "^15.0.0" + +eslint-config-prettier@^8.3.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-import-resolver-typescript@^2.5.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" + integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== + dependencies: + debug "^4.3.4" + glob "^7.2.0" + is-glob "^4.0.3" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-module-utils@^2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + +eslint-plugin-eslint-comments@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-import@^2.25.4: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jest@^25.2.2: + version "25.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + +eslint-plugin-jsx-a11y@^6.4.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" + integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== + dependencies: + "@babel/runtime" "^7.16.3" + aria-query "^4.2.2" + array-includes "^3.1.4" + ast-types-flow "^0.0.7" + axe-core "^4.3.5" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.7" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.2.1" + language-tags "^1.0.5" + minimatch "^3.0.4" + +eslint-plugin-monorepo-cop@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-monorepo-cop/-/eslint-plugin-monorepo-cop-1.0.2.tgz#c482ddc45ce7bec6642942ba8c35c1c910942f70" + integrity sha512-jGEbrgW5K+JUxT4OwmVMOxWfR9NJDwmZAXxsGCMYT91p5r3b1IB3jMedLCX+zfAXuPtnLOgo93mALaVymLIX8w== + dependencies: + read-pkg-up "^6.0.0" + requireindex "~1.1.0" + +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-promise@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971" + integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw== + +eslint-plugin-react-hooks@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" + integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== + +eslint-plugin-react@^7.22.0: + version "7.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz#8e7b1b2934b8426ac067a0febade1b13bd7064e3" + integrity sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A== + dependencies: + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^7.21.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^4.0.0, execa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +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== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.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== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +git-raw-commits@^2.0.0: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.6.0, globals@^13.9.0: + version "13.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" + integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + 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" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +husky@^7.0.1: + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.5, ignore@^5.1.4, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.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== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^1.0.0" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +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== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +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== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.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" + 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== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.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@^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== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + 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" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + 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== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +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== + 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== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^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== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +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-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== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@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" + micromatch "^4.0.4" + walker "^1.0.7" + 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== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +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== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + 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" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +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-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== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +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== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.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== + 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" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.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" + 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" + 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== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^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-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + 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" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-summary-reporter@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/jest-summary-reporter/-/jest-summary-reporter-0.0.2.tgz#53b9997b56f343a0dd9af24199c68d371e01f534" + integrity sha512-rZ3ThO57l+ZJCxF74cXIGQU3cV9I7bSBe1ElBp0taE3x2JghgD69bNCKt0LvpVQX5azTRHG7LmcjIpwriVnTng== + dependencies: + chalk "^2.4.1" + +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.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== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +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== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-worker@^27.5.1: + 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== + dependencies: + "@types/node" "*" + 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== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.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== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" + integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== + dependencies: + array-includes "^3.1.4" + object.assign "^4.1.2" + +kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^10.5.2: + version "10.5.4" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" + integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== + dependencies: + chalk "^4.1.0" + cli-truncate "^2.1.0" + commander "^6.2.0" + cosmiconfig "^7.0.0" + debug "^4.2.0" + dedent "^0.7.0" + enquirer "^2.3.6" + execa "^4.1.0" + listr2 "^3.2.2" + log-symbols "^4.0.0" + micromatch "^4.0.2" + normalize-path "^3.0.0" + please-upgrade-node "^3.2.0" + string-argv "0.3.1" + stringify-object "^3.3.0" + +listr2@^3.2.2: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + 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" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mri@^1.1.5: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "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.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multimatch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" + integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== + +noms@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" + integrity sha1-2o69nzr51nYJGbJ9nNyAkqczKFk= + dependencies: + inherits "^2.0.1" + readable-stream "~1.0.31" + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.19.5" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.2.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + +pretty-format@^27.0.0, 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== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-quick@^3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" + integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA== + dependencies: + chalk "^3.0.0" + execa "^4.0.0" + find-up "^4.1.0" + ignore "^5.1.4" + mri "^1.1.5" + multimatch "^4.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +read-pkg-up@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" + integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw== + dependencies: + find-up "^4.0.0" + read-pkg "^5.1.1" + type-fest "^0.5.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.1.1, read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@3, readable-stream@^3.0.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.1.0, regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requireindex@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" + integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0, 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== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.1: + version "7.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== + dependencies: + tslib "^2.1.0" + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shx@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" + integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== + dependencies: + minimist "^1.2.3" + shelljs "^0.8.5" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +source-map-js@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@^0.5.6: + 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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "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: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +string-argv@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.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== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + 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" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^6.0.9: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +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" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +"through@>=2.2.7 <3", through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmpl@1.0.5: + version "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 sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +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" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "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-fest@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +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" + +typescript@^4.5.5: + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== + +typescript@~4.5.5: + version "4.5.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +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== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +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== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.4.6: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + 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@^16.1.0, 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" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 92812d468bf0b8a1fbaaaeb2601191ba271fc870 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 19 May 2022 20:51:27 -0400 Subject: [PATCH 003/147] fix: readme --- shared/README.md | 66 ++---------------------------------------------- 1 file changed, 2 insertions(+), 64 deletions(-) diff --git a/shared/README.md b/shared/README.md index d1a6d176f..7d36768be 100644 --- a/shared/README.md +++ b/shared/README.md @@ -1,67 +1,5 @@ -# JsPath - -JsPath is a serializable specification for referencing a path to a DOM node, property or method. - -This library was created as a way to create paths to methods and properties of the DOM remotely. Breaking a path into individual steps allows a library to create references to nested objects (eg, passing a Node into a function) without AST parsing a string of code. It also provides a mechanism for creating "references" to nodes (NodePointer.id), dynamically inspecting properties (appending internal state methods), and more without requiring any parsing. - -For a fully-typed implementation of accessing a remote DOM, refer to the [AwaitedDOM](https://docs.ulixee.org/docs/hero/basic-interfaces/awaited-dom). - -### IJsPath - -IJsPath is an array of "steps" to locate (or re-locate) a node. Steps can be the following: - -- An [INodePointer](#inodepointer) id `number`. eg: `[1]`. -- A Function `Array`. `[MethodName, ...arguments]`, eg: `['document', ['querySelector','p']]`. -- A Property name `string`. eg: `[1, 'innerText']` will get the innerText of node with NodePointer id = 1. - -### INodePointer - -INodePointer is a persisted reference to a DOM Node. It includes extra details about a node. An iterable Node type will serialize the properties as well. - -NOTE: A DOM Node could also be a querySelector, and can be used to re-retrieve instance properties. - -- id: `number`. The Id that can be used in future references to this DOM Node. -- type: `string`. The type of DOM Node. eg, `HTMLDivElement`. -- preview?: `string`. A string preview of the HTML Element or DOM Node. -- iterableIsNodePointers?: `boolean`. If iterableItems are provided, returns `true` if the items are `INodePointers`. -- iterableItems?: `(string | number | boolean | object | INodePointer)[]`. The serialized iterable properties if this result set is iterable. eg, HTMLCollection, NodeList, Attributes, etc. - -### INodeVisibility - -INodeVisibility interface represents the various attributes of visibility a DOM Node possesses. It can be used to determine if a Node can be interacted with on a Webpage. - -NOTE: It is up to an implementation library to create the mechanism for requesting the visibility of a node. - -The returned properties will be calculated and returned as follows: - -- isVisible `boolean`. The node is visible (`nodeExists`, `hasContainingElement`, `isConnected`, `hasCssOpacity`,`hasCssDisplay`,`hasCssVisibility` `hasDimensions`). -- isClickable `boolean`. The node is visible, in the viewport and unobstructed (`isVisible`, `isOnscreenVertical`, `isOnscreenHorizontal` and `isUnobstructedByOtherElements`). -- nodeExists `boolean`. Was the node found in the DOM. -- isOnscreenVertical `boolean`. The node is on-screen vertically. -- isOnscreenHorizontal `boolean`. The node is on-screen horizontally. -- hasContainingElement `boolean`. The node is an Element or has a containing Element providing layout. -- isConnected `boolean`. The node is connected to the DOM. -- hasCssOpacity `boolean`. The display `opacity` property is not "0". -- hasCssDisplay `boolean`. The display `display` property is not "none". -- hasCssVisibility `boolean`. The visibility `style` property is not "hidden". -- hasDimensions `boolean`. The node has width and height. -- isUnobstructedByOtherElements `boolean`. The node is not hidden or obscured > 50% by another element. - -## Installation - -```shell script -npm i --save @unblocked-web/js-path -``` - -or - -```shell script -yarn add @unblocked-web/js-path -``` - -## Contributing - -Contributions are welcome. +# Ulixee Commons +This is an internal set of utilities used by the Ulixee and Unblocked projects. ## License From 75e80004deb12e87a3755832bfa6aaf825239aeb Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 27 May 2022 13:47:37 -0400 Subject: [PATCH 004/147] chore: make logger private --- shared/.prettierrc | 7 +++++++ shared/interfaces/ITypedEventEmitter.ts | 6 ------ shared/lib/Logger.ts | 24 ++++++++++++++++++------ shared/lib/SqliteTable.ts | 4 +++- shared/lib/eventUtils.ts | 18 ++++++++++-------- 5 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 shared/.prettierrc diff --git a/shared/.prettierrc b/shared/.prettierrc new file mode 100644 index 000000000..6b4bb5d27 --- /dev/null +++ b/shared/.prettierrc @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 2, + "arrowParens": "avoid" +} diff --git a/shared/interfaces/ITypedEventEmitter.ts b/shared/interfaces/ITypedEventEmitter.ts index 074b6e6f9..bf688ea2b 100644 --- a/shared/interfaces/ITypedEventEmitter.ts +++ b/shared/interfaces/ITypedEventEmitter.ts @@ -1,10 +1,4 @@ export default interface ITypedEventEmitter { - waitOn( - eventType: K, - listenerFn?: (this: this, event?: T[K]) => boolean, - timeoutMillis?: number, - ): Promise; - on( eventType: K, listenerFn: (this: this, event?: T[K]) => any, diff --git a/shared/lib/Logger.ts b/shared/lib/Logger.ts index cd3739333..e4b50d4ed 100644 --- a/shared/lib/Logger.ts +++ b/shared/lib/Logger.ts @@ -228,7 +228,7 @@ function extractPathFromModule(module: NodeModule): string { .replace(/^(.*)[/\\]unblocked[/\\](.+)$/, '$2') .replace(/^(.*)[/\\]ulixee[/\\](.+)$/, '$2') .replace(/^(.*)[/\\]@ulixee[/\\](.+)$/, '$2') - .replace(/^(.*)[/\\]commons[/\\](.+)$/, '$2') + .replace(/^(.*)[/\\]commons[/\\](.+)$/, '$2') .replace(/^.*[/\\]packages[/\\](.+)$/, '$1'); } @@ -240,7 +240,6 @@ function isEnabled(name: string): boolean { if (name[name.length - 1] === '*') { return true; } - for (const ns of logFilters.skip) { if (ns.test(name)) { logFilters.enabledNamesCache[name] = false; @@ -271,16 +270,29 @@ function enable(namespaces: string): void { logFilters.skip.push(new RegExp('^' + part.slice(1) + '$')); } else { logFilters.active.push(new RegExp('^' + part + '$')); + if (part.includes('ubk:*') || part.includes('ubk*')) { - logFilters.active.push(/agent\/*/); + logFilters.active.push(/agent\/.*/); } else if (part === 'ubk') { - logFilters.active.push(/agent\/*/); + logFilters.active.push(/agent\/.*/); logFilters.skip.push(new RegExp('DevtoolsSessionLogger')); - logFilters.skip.push(new RegExp(/agent\/mitm*/)); - + logFilters.skip.push(new RegExp(/agent\/mitm.*/)); } else if (part.includes('ubk:devtools')) { logFilters.active.push(new RegExp('DevtoolsSessionLogger')); } + + if (part.includes('ulx:*') || part.includes('ulx*')) { + logFilters.active.push(/^apps\/chromealive*/); + logFilters.active.push(/hero\/.*/); + logFilters.active.push(/net\/.*/); + logFilters.active.push(/databox\/.*/); + } else if (part.includes('hero')) { + logFilters.active.push(/^hero\/.*/); + logFilters.active.push(/net\/.*/); + } else if (part.includes('databox')) { + logFilters.active.push(/^databox\/.*/); + logFilters.active.push(/net\/.*/); + } } } } diff --git a/shared/lib/SqliteTable.ts b/shared/lib/SqliteTable.ts index c9c431b36..42c671784 100644 --- a/shared/lib/SqliteTable.ts +++ b/shared/lib/SqliteTable.ts @@ -89,7 +89,9 @@ export default abstract class SqliteTable { this.lastSubscriptionPublishTime = Date.now(); return process.nextTick(this.publishPendingRecords.bind(this)); } - this.subscriptionThrottle = (setTimeout(this.publishPendingRecords.bind(this), 100) as any).unref(); + this.subscriptionThrottle = ( + setTimeout(this.publishPendingRecords.bind(this), 100) as any + ).unref(); } private publishPendingRecords(): void { diff --git a/shared/lib/eventUtils.ts b/shared/lib/eventUtils.ts index e658cbb3f..db042952b 100644 --- a/shared/lib/eventUtils.ts +++ b/shared/lib/eventUtils.ts @@ -24,9 +24,7 @@ export function addEventListeners( }); } -export function removeEventListeners( - listeners: Array, -): void { +export function removeEventListeners(listeners: Array): void { for (const listener of listeners) { listener.emitter.off(listener.eventName, listener.handler); } @@ -56,7 +54,7 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi public storeEventsWithoutListeners = false; public EventTypes: T; - protected logger?: IBoundLog; + #logger?: IBoundLog; private pendingIdCounter = 0; private pendingWaitEventsById = new Map(); @@ -80,7 +78,11 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi } } - public setEventsToLog(events: K[]): void { + public setEventsToLog( + logger: IBoundLog, + events: K[], + ): void { + this.#logger = logger; this.eventsToLog = new Set(events); } @@ -103,13 +105,13 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi resolvable: promise, error: new CanceledPromiseError(`Event (${String(eventType)}) canceled`), }); - const messageId = this.logger?.stats(`waitOn:${eventType}`, { + const messageId = this.#logger?.stats?.(`waitOn:${eventType}`, { timeoutMillis, }); const callbackFn = (result: T[K]): void => { // give the listeners a second to register if (!listenerFn || listenerFn.call(this, result)) { - this.logger?.stats(`waitOn.resolve:${eventType}`, { + this.#logger?.stats?.(`waitOn.resolve:${eventType}`, { parentLogId: messageId, }); promise.resolve(result); @@ -246,7 +248,7 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi } } } - this.logger?.stats(`emit:${eventType}`, data); + this.#logger?.stats?.(`emit:${eventType}`, data); } } } From 96ae1c56d74a48c011b663ec331d9266145a826c Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 31 May 2022 12:45:35 -0400 Subject: [PATCH 005/147] v2.0.0-alpha.3 --- shared/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/package.json b/shared/package.json index 259765932..5793ec1e4 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.2", + "version": "2.0.0-alpha.3", "description": "Common utilities for Ulixee", "license": "MIT", "scripts": { From d4b104a633f3bbc5e5b551f1a0a0e8d0e1c5af1d Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 8 Jun 2022 10:46:06 -0400 Subject: [PATCH 006/147] feat: add bech32m hasher fix: add source map raw lookup --- shared/lib/Hasher.ts | 8 +++ shared/lib/Logger.ts | 74 +++++++++++++++------------- shared/lib/SourceMapSupport.ts | 90 ++++++++++++++++++++-------------- shared/package.json | 3 +- shared/yarn.lock | 5 ++ 5 files changed, 109 insertions(+), 71 deletions(-) create mode 100644 shared/lib/Hasher.ts diff --git a/shared/lib/Hasher.ts b/shared/lib/Hasher.ts new file mode 100644 index 000000000..3367deb46 --- /dev/null +++ b/shared/lib/Hasher.ts @@ -0,0 +1,8 @@ +import { createHash } from 'crypto'; +import { bech32m } from 'bech32' + +export function hashDatabox(script: Buffer): string { + const hash = createHash('sha3-256').update(script).digest(); + const words = bech32m.toWords(hash); + return bech32m.encode('dbx', words); +} diff --git a/shared/lib/Logger.ts b/shared/lib/Logger.ts index e4b50d4ed..d84d7c060 100644 --- a/shared/lib/Logger.ts +++ b/shared/lib/Logger.ts @@ -7,6 +7,7 @@ const hasBeenLoggedSymbol = Symbol.for('hasBeenLogged'); const logFilters = { active: [] as RegExp[], skip: [] as RegExp[], + namespaces: { active: new Set(), inactive: new Set() }, enabledNamesCache: {} as { [namespace: string]: boolean }, }; @@ -234,27 +235,56 @@ function extractPathFromModule(module: NodeModule): string { /// LOG FILTERING ////////////////////////////////////////////////////////////////////////////////////////////////////// -function isEnabled(name: string): boolean { - if (name in logFilters.enabledNamesCache) return logFilters.enabledNamesCache[name]; +export function registerNamespaceMapping( + onNamespaceFn: (namespace: string, active: RegExp[], skip: RegExp[]) => void, +): void { + for (const ns of logFilters.namespaces.active) { + onNamespaceFn(ns, logFilters.active, logFilters.skip); + } +} + +registerNamespaceMapping((ns, active, skip) => { + if (ns.includes('ubk:*') || ns.includes('ubk*')) { + active.push(/agent\/.*/); + } else if (ns === 'ubk') { + active.push(/agent\/.*/); + skip.push(/DevtoolsSessionLogger/, /agent\/mitm.*/); + } else if (ns.includes('ubk:devtools')) { + active.push(/DevtoolsSessionLogger/); + } +}); + +registerNamespaceMapping((ns, active) => { + if (ns.includes('ulx:*') || ns.includes('ulx*')) { + active.push(/^apps\/chromealive*/, /hero\/.*/, /net\/.*/, /databox\/.*/); + } else if (ns.includes('hero')) { + active.push(/^hero\/.*/, /net\/.*/); + } else if (ns.includes('databox')) { + active.push(/^databox\/.*/, /net\/.*/); + } +}); - if (name[name.length - 1] === '*') { +function isEnabled(modulePath: string): boolean { + if (modulePath in logFilters.enabledNamesCache) return logFilters.enabledNamesCache[modulePath]; + + if (modulePath[modulePath.length - 1] === '*') { return true; } for (const ns of logFilters.skip) { - if (ns.test(name)) { - logFilters.enabledNamesCache[name] = false; + if (ns.test(modulePath)) { + logFilters.enabledNamesCache[modulePath] = false; return false; } } for (const ns of logFilters.active) { - if (ns.test(name)) { - logFilters.enabledNamesCache[name] = true; + if (ns.test(modulePath)) { + logFilters.enabledNamesCache[modulePath] = true; return true; } } - logFilters.enabledNamesCache[name] = false; + logFilters.enabledNamesCache[modulePath] = false; return false; } @@ -267,32 +297,10 @@ function enable(namespaces: string): void { part = part.replace(/\*/g, '.*?'); if (part[0] === '-') { - logFilters.skip.push(new RegExp('^' + part.slice(1) + '$')); + logFilters.namespaces.inactive.add(part); // .push(new RegExp('^' + part.slice(1) + '$')); } else { - logFilters.active.push(new RegExp('^' + part + '$')); - - if (part.includes('ubk:*') || part.includes('ubk*')) { - logFilters.active.push(/agent\/.*/); - } else if (part === 'ubk') { - logFilters.active.push(/agent\/.*/); - logFilters.skip.push(new RegExp('DevtoolsSessionLogger')); - logFilters.skip.push(new RegExp(/agent\/mitm.*/)); - } else if (part.includes('ubk:devtools')) { - logFilters.active.push(new RegExp('DevtoolsSessionLogger')); - } - - if (part.includes('ulx:*') || part.includes('ulx*')) { - logFilters.active.push(/^apps\/chromealive*/); - logFilters.active.push(/hero\/.*/); - logFilters.active.push(/net\/.*/); - logFilters.active.push(/databox\/.*/); - } else if (part.includes('hero')) { - logFilters.active.push(/^hero\/.*/); - logFilters.active.push(/net\/.*/); - } else if (part.includes('databox')) { - logFilters.active.push(/^databox\/.*/); - logFilters.active.push(/net\/.*/); - } + logFilters.namespaces.active.add(part); + // logFilters.active.push(new RegExp('^' + part + '$')); } } } diff --git a/shared/lib/SourceMapSupport.ts b/shared/lib/SourceMapSupport.ts index 08dad26cb..e0cc85a68 100644 --- a/shared/lib/SourceMapSupport.ts +++ b/shared/lib/SourceMapSupport.ts @@ -44,6 +44,21 @@ export class SourceMapSupport { return source; } + static getSourceFilePaths(filename: string): string[] { + this.sourceMapCache[filename] ??= this.retrieveSourceMap(filename); + if (!this.sourceMapCache[filename].map) return [filename]; + + const sourcesByMappingSource = new Map(); + const sourceMap = this.sourceMapCache[filename]; + sourceMap.map.eachMapping(mapping => { + if (!sourcesByMappingSource.has(mapping.source)) { + const resolvedPath = this.resolvePath(sourceMap.url, mapping.source); + sourcesByMappingSource.set(mapping.source, resolvedPath); + } + }); + return [...sourcesByMappingSource.values()]; + } + static getOriginalSourcePosition( position: ISourceCodeLocation, ): ISourceCodeLocation & { name?: string } { @@ -67,6 +82,44 @@ export class SourceMapSupport { return position; } + static retrieveSourceMap(source: string): { url: string; map: SourceMapConsumer; rawMap?: any } { + const fileData = SourceLoader.getFileContents(source, false); + + // Find the *last* sourceMappingURL to avoid picking up sourceMappingURLs from comments, strings, etc. + let sourceMappingURL: string; + let sourceMapData: string; + + let match: RegExpMatchArray; + while ((match = sourceMapUrlRegex.exec(fileData))) { + sourceMappingURL = match[1]; + } + + if (sourceMappingURL) { + if (sourceMapDataUrlRegex.test(sourceMappingURL)) { + const rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(',') + 1); + sourceMapData = Buffer.from(rawData, 'base64').toString(); + sourceMappingURL = source; + } else { + sourceMappingURL = this.resolvePath(source, sourceMappingURL); + sourceMapData = SourceLoader.getFileContents(sourceMappingURL); + } + } + + if (!sourceMapData) { + return { + url: null, + map: null, + }; + } + + const rawData = JSON.parse(sourceMapData); + return { + url: sourceMappingURL, + map: new SourceMapConsumer(rawData), + rawMap: rawData, + }; + } + private static prepareStackTrace(error: Error, stack: NodeJS.CallSite[]): string { const name = error.name ?? error[Symbol.toStringTag] ?? error.constructor?.name ?? 'Error'; const message = error.message ?? ''; @@ -111,43 +164,6 @@ export class SourceMapSupport { return errorString + processedStack.join(''); } - private static retrieveSourceMap(source: string): { url: string; map: SourceMapConsumer } { - const fileData = SourceLoader.getFileContents(source, false); - - // Find the *last* sourceMappingURL to avoid picking up sourceMappingURLs from comments, strings, etc. - let sourceMappingURL: string; - let sourceMapData: string; - - let match: RegExpMatchArray; - while ((match = sourceMapUrlRegex.exec(fileData))) { - sourceMappingURL = match[1]; - } - - if (sourceMappingURL) { - if (sourceMapDataUrlRegex.test(sourceMappingURL)) { - const rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(',') + 1); - sourceMapData = Buffer.from(rawData, 'base64').toString(); - sourceMappingURL = source; - } else { - sourceMappingURL = this.resolvePath(source, sourceMappingURL); - sourceMapData = SourceLoader.getFileContents(sourceMappingURL); - } - } - - if (!sourceMapData) { - return { - url: null, - map: null, - }; - } - - const rawData = JSON.parse(sourceMapData); - return { - url: sourceMappingURL, - map: new SourceMapConsumer(rawData), - }; - } - private static resolvePath(base: string, relative: string): string { if (!base) return relative; const key = `${base}__${relative}`; diff --git a/shared/package.json b/shared/package.json index 5793ec1e4..7f6d4a0bb 100644 --- a/shared/package.json +++ b/shared/package.json @@ -16,7 +16,8 @@ "devtools-protocol": "^0.0.981744", "https-proxy-agent": "^5.0.0", "semver": "^7.3.7", - "source-map-js": "^1.0.1" + "source-map-js": "^1.0.1", + "bech32": "^2.0.0" }, "devDependencies": { "@types/better-sqlite3": "^7.5.0", diff --git a/shared/yarn.lock b/shared/yarn.lock index 49e9b5596..41890ed37 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -1274,6 +1274,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bech32@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" + integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" From 650dd281ee044250d2c1aedf803398d375da257d Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 9 Jun 2022 15:29:43 -0400 Subject: [PATCH 007/147] v2.0.0-alpha.4 --- shared/lib/SqliteTable.ts | 2 +- shared/lib/eventUtils.ts | 22 +- shared/package.json | 12 +- shared/yarn.lock | 1348 +++++++++++++++---------------------- 4 files changed, 578 insertions(+), 806 deletions(-) diff --git a/shared/lib/SqliteTable.ts b/shared/lib/SqliteTable.ts index 42c671784..5bc061822 100644 --- a/shared/lib/SqliteTable.ts +++ b/shared/lib/SqliteTable.ts @@ -112,7 +112,7 @@ export default abstract class SqliteTable { } } const definitions = this.columns.map(x => { - let columnDef = `${x[0]} ${x[1]}`; + let columnDef = `${String(x[0])} ${x[1]}`; if (x.length > 2) columnDef = `${columnDef} ${x[2]}`; return columnDef; }); diff --git a/shared/lib/eventUtils.ts b/shared/lib/eventUtils.ts index db042952b..c017856ed 100644 --- a/shared/lib/eventUtils.ts +++ b/shared/lib/eventUtils.ts @@ -105,13 +105,13 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi resolvable: promise, error: new CanceledPromiseError(`Event (${String(eventType)}) canceled`), }); - const messageId = this.#logger?.stats?.(`waitOn:${eventType}`, { + const messageId = this.#logger?.stats?.(`waitOn:${String(eventType)}`, { timeoutMillis, }); const callbackFn = (result: T[K]): void => { // give the listeners a second to register if (!listenerFn || listenerFn.call(this, result)) { - this.#logger?.stats?.(`waitOn.resolve:${eventType}`, { + this.#logger?.stats?.(`waitOn.resolve:${String(eventType)}`, { parentLogId: messageId, }); promise.resolve(result); @@ -140,7 +140,7 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi return listeners; } - public on( + public override on( eventType: K, listenerFn: (this: this, event?: T[K]) => any, includeUnhandledEvents = false, @@ -149,14 +149,14 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); } - public off( + public override off( eventType: K, listenerFn: (this: this, event?: T[K]) => any, ): this { return super.off(eventType, listenerFn); } - public once( + public override once( eventType: K, listenerFn: (this: this, event?: T[K]) => any, includeUnhandledEvents = false, @@ -165,7 +165,7 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); } - public emit( + public override emit( eventType: K, event?: T[K], sendInitiator?: object, @@ -181,7 +181,7 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi else return super.emit(eventType, event); } - public addListener( + public override addListener( eventType: K, listenerFn: (this: this, event?: T[K]) => any, includeUnhandledEvents = false, @@ -189,14 +189,14 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi return this.on(eventType, listenerFn, includeUnhandledEvents); } - public removeListener( + public override removeListener( eventType: K, listenerFn: (this: this, event?: T[K]) => any, ): this { return super.removeListener(eventType, listenerFn); } - public prependListener( + public override prependListener( eventType: K, listenerFn: (this: this, event?: T[K]) => void, includeUnhandledEvents = false, @@ -205,7 +205,7 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); } - public prependOnceListener( + public override prependOnceListener( eventType: K, listenerFn: (this: this, event?: T[K]) => void, includeUnhandledEvents = false, @@ -248,7 +248,7 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi } } } - this.#logger?.stats?.(`emit:${eventType}`, data); + this.#logger?.stats?.(`emit:${String(eventType)}`, data); } } } diff --git a/shared/package.json b/shared/package.json index 7f6d4a0bb..8e91e83f2 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.3", + "version": "2.0.0-alpha.4", "description": "Common utilities for Ulixee", "license": "MIT", "scripts": { @@ -24,16 +24,16 @@ "@commitlint/cli": "^12.0.1", "@commitlint/config-conventional": "^12.0.1", "@types/node": "^14.18.18", - "@ulixee/repo-tools": "1.0.7", + "@ulixee/repo-tools": "1.0.9", "cross-env": "^7.0.3", - "@types/jest": "^27.5.1", - "jest": "^27.5.1", - "jest-environment-node": "^27.5.1", + "@types/jest": "^28.1.0", + "jest": "^28.1.0", + "jest-environment-node": "^28.1.0", "jest-summary-reporter": "^0.0.2", "husky": "^7.0.1", "lint-staged": "^10.5.2", "shx": "^0.3.3", - "typescript": "~4.5.5" + "typescript": "~4.7.3" }, "lint-staged": { "*.ts": [ diff --git a/shared/yarn.lock b/shared/yarn.lock index 41890ed37..5fb3646bc 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -29,7 +29,28 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": +"@babel/core@^7.11.6": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.2.tgz#87b2fcd7cce9becaa7f5acebdc4f09f3dd19d876" + integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-compilation-targets" "^7.18.2" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helpers" "^7.18.2" + "@babel/parser" "^7.18.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/core@^7.12.3": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.0.tgz#c58d04d7c6fbfb58ea7681e2b9145cfb62726756" integrity sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw== @@ -59,6 +80,15 @@ "@jridgewell/gen-mapping" "^0.3.0" jsesc "^2.5.1" +"@babel/generator@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" + integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== + dependencies: + "@babel/types" "^7.18.2" + "@jridgewell/gen-mapping" "^0.3.0" + jsesc "^2.5.1" + "@babel/helper-compilation-targets@^7.17.10": version "7.17.10" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" @@ -69,6 +99,16 @@ browserslist "^4.20.2" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" + integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + "@babel/helper-environment-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" @@ -76,6 +116,11 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-environment-visitor@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" + integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== + "@babel/helper-function-name@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" @@ -150,6 +195,15 @@ "@babel/traverse" "^7.18.0" "@babel/types" "^7.18.0" +"@babel/helpers@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" + integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" @@ -295,6 +349,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8" + integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.18.0" + "@babel/types" "^7.18.2" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.0.tgz#ef523ea349722849cb4bf806e9342ede4d071553" @@ -303,6 +373,14 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.18.2": + version "7.18.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" + integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -490,173 +568,197 @@ 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@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.1.tgz#305f8ca50b6e70413839f54c0e002b60a0f2fd7d" + integrity sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" + jest-message-util "^28.1.1" + jest-util "^28.1.1" 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== - 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/core@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.1.tgz#086830bec6267accf9af5ca76f794858e9f9f092" + integrity sha512-3pYsBoZZ42tXMdlcFeCc/0j9kOlK7MYuXs2B1QbvDgMoW1K9NJ4G/VYvIbMb26iqlkTfPHo7SC2JgjDOk/mxXw== + dependencies: + "@jest/console" "^28.1.1" + "@jest/reporters" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" "@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 "^28.0.2" + jest-config "^28.1.1" + jest-haste-map "^28.1.1" + jest-message-util "^28.1.1" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.1" + jest-resolve-dependencies "^28.1.1" + jest-runner "^28.1.1" + jest-runtime "^28.1.1" + jest-snapshot "^28.1.1" + jest-util "^28.1.1" + jest-validate "^28.1.1" + jest-watcher "^28.1.1" micromatch "^4.0.4" + pretty-format "^28.1.1" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== +"@jest/environment@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.1.tgz#c4cbf85283278d768f816ebd1a258ea6f9e39d4f" + integrity sha512-9auVQ2GzQ7nrU+lAr8KyY838YahElTX9HVjbQPPS2XjlxQ+na18G113OoBhyBGBtD6ZnO/SrUy5WR8EzOj1/Uw== dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/fake-timers" "^28.1.1" + "@jest/types" "^28.1.1" "@types/node" "*" - jest-mock "^27.5.1" + jest-mock "^28.1.1" -"@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" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== +"@jest/expect-utils@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.1.tgz#d84c346025b9f6f3886d02c48a6177e2b0360587" + integrity sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.1.tgz#ea4fcc8504b45835029221c0dc357c622a761326" + integrity sha512-/+tQprrFoT6lfkMj4mW/mUIfAmmk/+iQPmg7mLDIFOf2lyf7EBHaS+x3RbeR0VZVMe55IvX7QRoT/2aK3AuUXg== + dependencies: + expect "^28.1.1" + jest-snapshot "^28.1.1" + +"@jest/fake-timers@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.1.tgz#47ce33296ab9d680c76076d51ddbe65ceb3337f1" + integrity sha512-BY/3+TyLs5+q87rGWrGUY5f8e8uC3LsVHS9Diz8+FV3ARXL4sNnkLlIB8dvDvRrp+LUCGM+DLqlsYubizGUjIA== dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" + "@jest/types" "^28.1.1" + "@sinonjs/fake-timers" "^9.1.1" "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" + jest-message-util "^28.1.1" + jest-mock "^28.1.1" + jest-util "^28.1.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/globals@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.1.tgz#c0a7977f85e26279cc090d9adcdf82b8a34c4061" + integrity sha512-dEgl/6v7ToB4vXItdvcltJBgny0xBE6xy6IYQrPJAJggdEinGxCDMivNv7sFzPcTITGquXD6UJwYxfJ/5ZwDSg== dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" + "@jest/environment" "^28.1.1" + "@jest/expect" "^28.1.1" + "@jest/types" "^28.1.1" -"@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/reporters@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662" + integrity sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg== 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" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" + "@jridgewell/trace-mapping" "^0.3.7" "@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-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 "^28.1.1" + jest-util "^28.1.1" + jest-worker "^28.1.1" slash "^3.0.0" - source-map "^0.6.0" string-length "^4.0.1" + strip-ansi "^6.0.0" terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" + v8-to-istanbul "^9.0.0" -"@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/schemas@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" + integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== + dependencies: + "@sinclair/typebox" "^0.23.3" + +"@jest/source-map@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90" + integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw== dependencies: + "@jridgewell/trace-mapping" "^0.3.7" 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@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" + integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^28.1.1" + "@jest/types" "^28.1.1" "@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@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.1.tgz#f594ee2331df75000afe0d1ae3237630ecec732e" + integrity sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA== dependencies: - "@jest/test-result" "^27.5.1" + "@jest/test-result" "^28.1.1" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" + jest-haste-map "^28.1.1" + 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@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.1.tgz#83541f2a3f612077c8501f49cc4e205d4e4a6b27" + integrity sha512-PkfaTUuvjUarl1EDr5ZQcCA++oXkFCP9QFUkG0yVKVmNObjhrqDy0kbMpMebfHWm3CCDHjYNem9eUSH8suVNHQ== dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.1" + "@jridgewell/trace-mapping" "^0.3.7" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.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 "^28.1.1" + jest-regex-util "^28.0.2" + jest-util "^28.1.1" 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.1" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== +"@jest/types@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.1.tgz#d059bbc80e6da6eda9f081f293299348bd78ee0b" + integrity sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw== dependencies: + "@jest/schemas" "^28.0.2" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^16.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" "@jridgewell/gen-mapping@^0.1.0": @@ -691,7 +793,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== -"@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== @@ -720,6 +822,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@sinclair/typebox@^0.23.3": + version "0.23.5" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" + integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -727,19 +834,14 @@ dependencies: type-detect "4.0.8" -"@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" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== +"@sinonjs/fake-timers@^9.1.1": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== dependencies: "@sinonjs/commons" "^1.7.0" -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": +"@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== @@ -765,7 +867,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.17.1" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== @@ -779,7 +881,7 @@ dependencies: "@types/node" "*" -"@types/graceful-fs@^4.1.2": +"@types/graceful-fs@^4.1.3": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== @@ -805,10 +907,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.1.tgz#2c8b6dc6ff85c33bcd07d0b62cb3d19ddfdb3ab9" - integrity sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ== +"@types/jest@^28.1.0": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.1.tgz#8c9ba63702a11f8c386ee211280e8b68cb093cd1" + integrity sha512-C2p7yqleUKtCkVjlOur9BWVA4HgUQmEj/HWCt5WzZ5mLXrWnyIfl0wGuArc+kBXsy0ZZfLp+7dywB4HtSVYGVA== dependencies: jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" @@ -868,10 +970,10 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== +"@types/yargs@^17.0.8": + version "17.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" + integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== dependencies: "@types/yargs-parser" "*" @@ -962,10 +1064,10 @@ "@typescript-eslint/types" "5.25.0" eslint-visitor-keys "^3.3.0" -"@ulixee/repo-tools@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.7.tgz#74448e3225a1730c1be5c77adfe52f1d02eb89ea" - integrity sha512-WdBloK6Ciz7VUBWHy/H5KYTeEsL6cU4tL4lvL0Sm/r8OiV6biE8qbVFtghg3AssBvoVFXT1utklpQurYUEPBnw== +"@ulixee/repo-tools@1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.9.tgz#2775853d650da43645a6d8b8f3ce8ff90b40567d" + integrity sha512-jkJwuERasTm+agRu7gtWuXCeobqr/uBFwDRRX6THz3kpW2G/Ij5qadzD4790s2iiw7O2/lGCbNDn/OU97pN5VA== dependencies: "@typescript-eslint/eslint-plugin" "^5.25.0" "@typescript-eslint/parser" "^5.25.0" @@ -985,7 +1087,7 @@ eslint-plugin-react-hooks "^4.2.0" prettier "^2.2.1" pretty-quick "^3.1.0" - typescript "^4.5.5" + typescript "^4.7.2" JSONStream@^1.0.4: version "1.3.5" @@ -995,39 +1097,16 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - acorn-jsx@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1188,11 +1267,6 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" @@ -1208,16 +1282,15 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.1.tgz#2a3a4ae50964695b2d694ccffe4bec537c5a3586" + integrity sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw== dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/transform" "^28.1.1" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" + babel-preset-jest "^28.1.1" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -1233,14 +1306,14 @@ 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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.1.tgz#5e055cdcc47894f28341f87f5e35aad2df680b11" + integrity sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw== 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: @@ -1261,12 +1334,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.1.tgz#5b6e5e69f963eb2d70f739c607b8f723c0ee75e4" + integrity sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g== dependencies: - babel-plugin-jest-hoist "^27.5.1" + babel-plugin-jest-hoist "^28.1.1" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -1294,11 +1367,6 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - browserslist@^4.20.2: version "4.20.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" @@ -1467,13 +1535,6 @@ colorette@^2.0.16: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - commander@^6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" @@ -1583,23 +1644,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - damerau-levenshtein@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" @@ -1610,15 +1654,6 @@ dargs@^7.0.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -1653,17 +1688,12 @@ decamelize@^1.1.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -1681,11 +1711,6 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -1701,6 +1726,11 @@ diff-sequences@^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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1722,13 +1752,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -1741,10 +1764,10 @@ electron-to-chromium@^1.4.118: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f" integrity sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA== -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== +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== emoji-regex@^8.0.0: version "8.0.0" @@ -1842,18 +1865,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-config-airbnb-base@^15.0.0: version "15.0.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" @@ -2092,7 +2103,7 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -2161,15 +2172,16 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.1.tgz#ca6fff65f6517cf7220c2e805a49c19aea30b420" + integrity sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w== 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" "^28.1.1" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-util "^28.1.1" fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -2197,7 +2209,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -2266,15 +2278,6 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - fs-extra@^9.0.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -2387,7 +2390,7 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: +glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -2493,27 +2496,11 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -2537,13 +2524,6 @@ husky@^7.0.1: resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -2705,11 +2685,6 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -2756,11 +2731,6 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -2830,85 +2800,82 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -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@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.0.2.tgz#7d7810660a5bd043af9e9cfbe4d58adb05e91531" + integrity sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA== dependencies: - "@jest/types" "^27.5.1" execa "^5.0.0" throat "^6.0.1" -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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.1.tgz#3d27da6a974d85a466dc0cdc6ddeb58daaa57bb4" + integrity sha512-75+BBVTsL4+p2w198DQpCeyh1RdaS2lhEG87HkaFX/UG0gJExVq2skG2pT7XZEGBubNj2CytcWSPan4QEPNosw== dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/environment" "^28.1.1" + "@jest/expect" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.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" + jest-each "^28.1.1" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-runtime "^28.1.1" + jest-snapshot "^28.1.1" + jest-util "^28.1.1" + pretty-format "^28.1.1" 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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.1.tgz#23ddfde8940e1818585ae4a568877b33b0e51cfe" + integrity sha512-+sUfVbJqb1OjBZ0OdBbI6OWfYM1i7bSfzYy6gze1F1w3OKWq8ZTEKkZ8a7ZQPq6G/G1qMh/uKqpdWhgl11NFQQ== dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/core" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" chalk "^4.0.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" + jest-config "^28.1.1" + jest-util "^28.1.1" + jest-validate "^28.1.1" prompts "^2.0.1" - yargs "^16.2.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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.1.tgz#e90b97b984f14a6c24a221859e81b258990fce2f" + integrity sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA== 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" "^28.1.1" + "@jest/types" "^28.1.1" + babel-jest "^28.1.1" 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 "^28.1.1" + jest-environment-node "^28.1.1" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.1" + jest-runner "^28.1.1" + jest-util "^28.1.1" + jest-validate "^28.1.1" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^27.5.1" + pretty-format "^28.1.1" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -2922,106 +2889,84 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -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-diff@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.1.tgz#1a3eedfd81ae79810931c63a1d0f201b9120106c" + integrity sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg== 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== - dependencies: - "@jest/types" "^27.5.1" chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.1" -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" + detect-newline "^3.0.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-each@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.1.tgz#ba5238dacf4f31d9fe23ddc2c44c01e7c23885c4" + integrity sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw== dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.1" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.1" + pretty-format "^28.1.1" + +jest-environment-node@^28.1.0, jest-environment-node@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.1.tgz#1c86c59003a7d319fa06ea3b1bbda6c193715c67" + integrity sha512-2aV/eeY/WNgUUJrrkDJ3cFEigjC5fqT1+fCclrY6paqJ5zVPoM//sHmfgUUp7WLYxIdbPwMiVIzejpN56MxnNA== + dependencies: + "@jest/environment" "^28.1.1" + "@jest/fake-timers" "^28.1.1" + "@jest/types" "^28.1.1" "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" + jest-mock "^28.1.1" + jest-util "^28.1.1" 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-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-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + +jest-haste-map@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.1.tgz#471685f1acd365a9394745bb97c8fc16289adca3" + integrity sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ== dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" + "@jest/types" "^28.1.1" + "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" + jest-regex-util "^28.0.2" + jest-util "^28.1.1" + jest-worker "^28.1.1" 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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.1.tgz#537f37afd610a4b3f4cab15e06baf60484548efb" + integrity sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw== dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.1" -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: +jest-matcher-utils@^27.0.0: 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== @@ -3031,27 +2976,37 @@ jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== +jest-matcher-utils@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz#a7c4653c2b782ec96796eb3088060720f1e29304" + integrity sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.1" + +jest-message-util@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.1.tgz#60aa0b475cfc08c8a9363ed2fb9108514dd9ab89" + integrity sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^27.5.1" + pretty-format "^28.1.1" 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" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== +jest-mock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.1.tgz#37903d269427fa1ef5b2447be874e1c62a39a371" + integrity sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.1" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -3059,126 +3014,117 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -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@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.1.tgz#3dffaaa56f4b41bc6b61053899d1756401763a27" + integrity sha512-p8Y150xYJth4EXhOuB8FzmS9r8IGLEioiaetgdNGb9VHka4fl0zqWlVe4v7mSkYOuEUg2uB61iE+zySDgrOmgQ== dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.1" -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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5" + integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== dependencies: - "@jest/types" "^27.5.1" chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" + jest-haste-map "^28.1.1" jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" + jest-util "^28.1.1" + jest-validate "^28.1.1" resolve "^1.20.0" resolve.exports "^1.1.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== - 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-runner@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.1.tgz#9ecdb3f27a00059986797aa6b012ba8306aa436c" + integrity sha512-W5oFUiDBgTsCloTAj6q95wEvYDB0pxIhY6bc5F26OucnwBN+K58xGTGbliSMI4ChQal5eANDF+xvELaYkJxTmA== + dependencies: + "@jest/console" "^28.1.1" + "@jest/environment" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" "@types/node" "*" chalk "^4.0.0" - emittery "^0.8.1" + emittery "^0.10.2" 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" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.1" + jest-haste-map "^28.1.1" + jest-leak-detector "^28.1.1" + jest-message-util "^28.1.1" + jest-resolve "^28.1.1" + jest-runtime "^28.1.1" + jest-util "^28.1.1" + jest-watcher "^28.1.1" + jest-worker "^28.1.1" + source-map-support "0.5.13" 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-runtime@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.1.tgz#569e1dc3c36c6c4c0b29516c1c49b6ad580abdaf" + integrity sha512-J89qEJWW0leOsqyi0D9zHpFEYHwwafFdS9xgvhFHtIdRghbadodI0eA+DrthK/1PebBv3Px8mFSMGKrtaVnleg== + dependencies: + "@jest/environment" "^28.1.1" + "@jest/fake-timers" "^28.1.1" + "@jest/globals" "^28.1.1" + "@jest/source-map" "^28.0.2" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" 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 "^28.1.1" + jest-message-util "^28.1.1" + jest-mock "^28.1.1" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.1" + jest-snapshot "^28.1.1" + jest-util "^28.1.1" 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== +jest-snapshot@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.1.tgz#ab825c16c8d8b5e883bd57eee6ca8748c42ab848" + integrity sha512-1KjqHJ98adRcbIdMizjF5DipwZFbvxym/kFO4g4fVZCZRxH/dqV8TiBFCa6rqic3p0karsy8RWS1y4E07b7P0A== 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== - dependencies: - "@babel/core" "^7.7.2" + "@babel/core" "^7.11.6" "@babel/generator" "^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" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^27.5.1" + expect "^28.1.1" 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 "^28.1.1" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.1" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-util "^28.1.1" natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" + pretty-format "^28.1.1" + semver "^7.3.5" jest-summary-reporter@^0.0.2: version "0.0.2" @@ -3187,60 +3133,62 @@ jest-summary-reporter@^0.0.2: dependencies: chalk "^2.4.1" -jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== +jest-util@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" + integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.1.tgz#59b7b339b3c85b5144bd0c06ad3600f503a4acc8" + integrity sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.1" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^27.5.1" + jest-get-type "^28.0.2" leven "^3.1.0" - pretty-format "^27.5.1" + pretty-format "^28.1.1" -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@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.1.tgz#533597fb3bfefd52b5cd115cd916cffd237fb60c" + integrity sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug== dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^27.5.1" + emittery "^0.10.2" + jest-util "^28.1.1" string-length "^4.0.1" -jest-worker@^27.5.1: - 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== +jest-worker@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.1.tgz#3480c73247171dfd01eda77200f0063ab6a3bf28" + integrity sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ== dependencies: "@types/node" "*" 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@^28.1.0: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.1.tgz#3c39a3a09791e16e9ef283597d24ab19a0df701e" + integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA== dependencies: - "@jest/core" "^27.5.1" + "@jest/core" "^28.1.1" + "@jest/types" "^28.1.1" import-local "^3.0.2" - jest-cli "^27.5.1" + jest-cli "^28.1.1" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -3255,39 +3203,6 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.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" @@ -3382,14 +3297,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -3462,7 +3369,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: +lodash@^4.17.15, lodash@^4.17.19: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3558,18 +3465,6 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" 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" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -3692,11 +3587,6 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3771,18 +3661,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -3871,11 +3749,6 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -3940,11 +3813,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -3966,6 +3834,16 @@ pretty-format@^27.0.0, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-format@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.1.tgz#f731530394e0f7fcd95aba6b43c50e02d86b95cb" + integrity sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw== + dependencies: + "@jest/schemas" "^28.0.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-quick@^3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" @@ -4005,11 +3883,6 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -4018,7 +3891,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -4048,6 +3921,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.1.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + read-pkg-up@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" @@ -4252,18 +4130,6 @@ safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -4286,7 +4152,7 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.7: +semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -4331,7 +4197,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -4369,24 +4235,19 @@ source-map-js@^1.0.1: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@^0.5.6: - 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== +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@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "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: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -4582,11 +4443,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - table@^6.0.9: version "6.8.0" resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" @@ -4667,22 +4523,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -4722,13 +4562,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -4764,22 +4597,10 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -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" - -typescript@^4.5.5: - version "4.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" - integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== - -typescript@~4.5.5: - version "4.5.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" - integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== +typescript@^4.7.2, typescript@~4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" + integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== unbox-primitive@^1.0.2: version "1.0.2" @@ -4791,11 +4612,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -4823,14 +4639,14 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -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.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz#be0dae58719fc53cb97e5c7ac1d7e6d4f5b19511" + integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw== dependencies: + "@jridgewell/trace-mapping" "^0.3.7" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" - source-map "^0.7.3" validate-npm-package-license@^3.0.1: version "3.0.4" @@ -4840,58 +4656,13 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - 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== dependencies: makeerror "1.0.12" -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -4910,7 +4681,7 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -4938,30 +4709,13 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -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.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== dependencies: imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.4.6: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + signal-exit "^3.0.7" xtend@~4.0.1: version "4.0.2" @@ -4988,6 +4742,11 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3: 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.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + yargs@^16.1.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -5001,6 +4760,19 @@ yargs@^16.1.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.3.1: + version "17.5.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 39c063fecba620050bb50bcce4c5969b8310b274 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 9 Jun 2022 20:47:57 -0400 Subject: [PATCH 008/147] fix: scoped loggers --- shared/lib/Logger.ts | 50 +++++++++++++++++++++----------------------- shared/package.json | 2 +- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/shared/lib/Logger.ts b/shared/lib/Logger.ts index d84d7c060..772601495 100644 --- a/shared/lib/Logger.ts +++ b/shared/lib/Logger.ts @@ -243,27 +243,6 @@ export function registerNamespaceMapping( } } -registerNamespaceMapping((ns, active, skip) => { - if (ns.includes('ubk:*') || ns.includes('ubk*')) { - active.push(/agent\/.*/); - } else if (ns === 'ubk') { - active.push(/agent\/.*/); - skip.push(/DevtoolsSessionLogger/, /agent\/mitm.*/); - } else if (ns.includes('ubk:devtools')) { - active.push(/DevtoolsSessionLogger/); - } -}); - -registerNamespaceMapping((ns, active) => { - if (ns.includes('ulx:*') || ns.includes('ulx*')) { - active.push(/^apps\/chromealive*/, /hero\/.*/, /net\/.*/, /databox\/.*/); - } else if (ns.includes('hero')) { - active.push(/^hero\/.*/, /net\/.*/); - } else if (ns.includes('databox')) { - active.push(/^databox\/.*/, /net\/.*/); - } -}); - function isEnabled(modulePath: string): boolean { if (modulePath in logFilters.enabledNamesCache) return logFilters.enabledNamesCache[modulePath]; @@ -291,17 +270,36 @@ function isEnabled(modulePath: string): boolean { function enable(namespaces: string): void { const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - for (let part of split) { + for (const part of split) { if (!part) continue; - part = part.replace(/\*/g, '.*?'); - if (part[0] === '-') { - logFilters.namespaces.inactive.add(part); // .push(new RegExp('^' + part.slice(1) + '$')); + logFilters.namespaces.inactive.add(part); } else { logFilters.namespaces.active.add(part); - // logFilters.active.push(new RegExp('^' + part + '$')); } } } + enable(process.env.DEBUG); + +registerNamespaceMapping((ns, active, skip) => { + if (ns.includes('ubk:*') || ns.includes('ubk*')) { + active.push(/agent\/.*/); + } else if (ns === 'ubk') { + active.push(/agent\/.*/); + skip.push(/DevtoolsSessionLogger/, /agent\/mitm.*/); + } else if (ns.includes('ubk:devtools')) { + active.push(/DevtoolsSessionLogger/); + } +}); + +registerNamespaceMapping((ns, active) => { + if (ns.includes('ulx:*') || ns.includes('ulx*')) { + active.push(/^apps\/chromealive*/, /hero\/.*/, /net\/.*/, /databox\/.*/); + } else if (ns.includes('hero')) { + active.push(/^hero\/.*/, /net\/.*/); + } else if (ns.includes('databox')) { + active.push(/^databox\/.*/, /net\/.*/); + } +}); diff --git a/shared/package.json b/shared/package.json index 8e91e83f2..14ee5dc46 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.4", + "version": "2.0.0-alpha.5", "description": "Common utilities for Ulixee", "license": "MIT", "scripts": { From d19f78713d39f312e47fa956fc34f90bf732d4ce Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 10 Jun 2022 18:16:13 -0400 Subject: [PATCH 009/147] chore: lint fixes --- shared/lib/Logger.ts | 34 +++++++---- shared/lib/SourceLoader.ts | 4 +- shared/lib/SourceMapSupport.ts | 23 ++++---- shared/lib/TypeSerializer.ts | 2 +- shared/lib/eventUtils.ts | 47 +-------------- shared/package.json | 2 +- shared/test/SourceLoader.test.ts | 2 +- shared/test/SourceMapSupport.test.ts | 86 +++++++++++++++------------- 8 files changed, 85 insertions(+), 115 deletions(-) diff --git a/shared/lib/Logger.ts b/shared/lib/Logger.ts index 772601495..fe4205407 100644 --- a/shared/lib/Logger.ts +++ b/shared/lib/Logger.ts @@ -5,6 +5,7 @@ import ILog, { ILogData } from '../interfaces/ILog'; const hasBeenLoggedSymbol = Symbol.for('hasBeenLogged'); const logFilters = { + envValue: null as string, active: [] as RegExp[], skip: [] as RegExp[], namespaces: { active: new Set(), inactive: new Set() }, @@ -165,7 +166,13 @@ export function translateToPrintable( const logLevels = { stats: 0, info: 1, warn: 2, error: 3 }; -let logCreator = (module: NodeModule): { log: ILog } => { +declare global { + function UlixeeLogCreator(module: NodeModule): { + log: ILog; + }; +} + +global.UlixeeLogCreator = (module: NodeModule): { log: ILog } => { const log: ILog = new Log(module); return { @@ -174,7 +181,7 @@ let logCreator = (module: NodeModule): { log: ILog } => { }; export default function logger(module: NodeModule): ILogBuilder { - return logCreator(module); + return global.UlixeeLogCreator(module); } let idCounter = 0; @@ -203,7 +210,7 @@ class LogEvents { export { Log, LogEvents, loggerSessionIdNames, hasBeenLoggedSymbol }; export function injectLogger(builder: (module: NodeModule) => ILogBuilder): void { - logCreator = builder; + global.UlixeeLogCreator = builder; } export interface ILogEntry { @@ -238,6 +245,7 @@ function extractPathFromModule(module: NodeModule): string { export function registerNamespaceMapping( onNamespaceFn: (namespace: string, active: RegExp[], skip: RegExp[]) => void, ): void { + loadNamespaces(process.env.DEBUG); for (const ns of logFilters.namespaces.active) { onNamespaceFn(ns, logFilters.active, logFilters.skip); } @@ -267,28 +275,30 @@ function isEnabled(modulePath: string): boolean { return false; } -function enable(namespaces: string): void { - const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); +function loadNamespaces(namespaces: string): void { + if (logFilters.envValue === namespaces) return; + + namespaces ??= ''; + logFilters.envValue = namespaces; + const split = namespaces.split(/[\s,]+/).map(x => x.trim()); for (const part of split) { if (!part) continue; if (part[0] === '-') { - logFilters.namespaces.inactive.add(part); + logFilters.namespaces.inactive.add(part.slice(1)); } else { logFilters.namespaces.active.add(part); } } } -enable(process.env.DEBUG); - registerNamespaceMapping((ns, active, skip) => { if (ns.includes('ubk:*') || ns.includes('ubk*')) { active.push(/agent\/.*/); } else if (ns === 'ubk') { active.push(/agent\/.*/); - skip.push(/DevtoolsSessionLogger/, /agent\/mitm.*/); + skip.push(/DevtoolsSessionLogger/, /agent[/-]mitm.*/); } else if (ns.includes('ubk:devtools')) { active.push(/DevtoolsSessionLogger/); } @@ -296,10 +306,10 @@ registerNamespaceMapping((ns, active, skip) => { registerNamespaceMapping((ns, active) => { if (ns.includes('ulx:*') || ns.includes('ulx*')) { - active.push(/^apps\/chromealive*/, /hero\/.*/, /net\/.*/, /databox\/.*/); + active.push(/^apps[/-]chromealive*/, /hero[/-].*/, /net\/.*/, /databox[/-].*/); } else if (ns.includes('hero')) { - active.push(/^hero\/.*/, /net\/.*/); + active.push(/^hero[/-].*/, /net\/.*/); } else if (ns.includes('databox')) { - active.push(/^databox\/.*/, /net\/.*/); + active.push(/^databox[/-].*/, /net\/.*/); } }); diff --git a/shared/lib/SourceLoader.ts b/shared/lib/SourceLoader.ts index fa675e06d..6e8c7d49d 100644 --- a/shared/lib/SourceLoader.ts +++ b/shared/lib/SourceLoader.ts @@ -1,7 +1,7 @@ -import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; -import { SourceMapSupport } from './SourceMapSupport'; import { URL } from 'url'; import * as fs from 'fs'; +import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; +import { SourceMapSupport } from './SourceMapSupport'; export default class SourceLoader { private static sourceLines: { [source: string]: string[] } = {}; diff --git a/shared/lib/SourceMapSupport.ts b/shared/lib/SourceMapSupport.ts index e0cc85a68..8338ae5de 100644 --- a/shared/lib/SourceMapSupport.ts +++ b/shared/lib/SourceMapSupport.ts @@ -90,6 +90,7 @@ export class SourceMapSupport { let sourceMapData: string; let match: RegExpMatchArray; + // eslint-disable-next-line no-cond-assign while ((match = sourceMapUrlRegex.exec(fileData))) { sourceMappingURL = match[1]; } @@ -123,7 +124,7 @@ export class SourceMapSupport { private static prepareStackTrace(error: Error, stack: NodeJS.CallSite[]): string { const name = error.name ?? error[Symbol.toStringTag] ?? error.constructor?.name ?? 'Error'; const message = error.message ?? ''; - const errorString = name + ': ' + message; + const errorString = `${name}: ${message}`; // track fn name as we go backwards through stack const processedStack = []; @@ -219,10 +220,10 @@ function CallSiteToString( } const lineNumber = this.getLineNumber(); if (lineNumber != null) { - fileLocation += ':' + lineNumber; + fileLocation += `:${lineNumber}`; const columnNumber = this.getColumnNumber(); if (columnNumber) { - fileLocation += ':' + columnNumber; + fileLocation += `:${columnNumber}`; } } } @@ -236,7 +237,7 @@ function CallSiteToString( if (isPromiseAny || isPromiseAll) { line += isPromiseAll ? 'Promise.all (index ' : 'Promise.any (index '; const promiseIndex = this.getPromiseIndex(); - line += promiseIndex + ')'; + line += `${promiseIndex})`; } } const functionName = this.getFunctionName(); @@ -247,21 +248,21 @@ function CallSiteToString( const typeName = this.getTypeName(); const methodName = this.getMethodName(); if (functionName) { - if (typeName && functionName.indexOf(typeName) != 0) { - line += typeName + '.'; + if (typeName && functionName.indexOf(typeName) !== 0) { + line += `${typeName}.`; } line += functionName; if ( methodName && - functionName.indexOf('.' + methodName) != functionName.length - methodName.length - 1 + functionName.indexOf(`.${methodName}`) !== functionName.length - methodName.length - 1 ) { - line += ' [as ' + methodName + ']'; + line += ` [as ${methodName}]`; } } else { - line += typeName + '.' + (methodName || ''); + line += `${typeName}.${methodName || ''}`; } } else if (isConstructor) { - line += 'new ' + (functionName || ''); + line += `new ${functionName || ''}`; } else if (functionName) { line += functionName; } else { @@ -269,7 +270,7 @@ function CallSiteToString( addSuffix = false; } if (addSuffix) { - line += ' (' + fileLocation + ')'; + line += ` (${fileLocation})`; } return line; } diff --git a/shared/lib/TypeSerializer.ts b/shared/lib/TypeSerializer.ts index b5dcc3d74..83f80c715 100644 --- a/shared/lib/TypeSerializer.ts +++ b/shared/lib/TypeSerializer.ts @@ -134,7 +134,7 @@ export default class TypeSerializer { } // @ts-ignore if (value instanceof CSSStyleDeclaration) { - const isNumber = new RegExp(/^\d+$/); + const isNumber = /^\d+$/; const result = {}; for (const key of Object.keys(value)) { if (isNumber.test(key)) continue; diff --git a/shared/lib/eventUtils.ts b/shared/lib/eventUtils.ts index c017856ed..79a4d9085 100644 --- a/shared/lib/eventUtils.ts +++ b/shared/lib/eventUtils.ts @@ -5,51 +5,6 @@ import { IBoundLog } from '../interfaces/ILog'; import { createPromise } from './utils'; import IPendingWaitEvent, { CanceledPromiseError } from '../interfaces/IPendingWaitEvent'; -export function addEventListener( - emitter: EventEmitter, - eventName: string | symbol, - handler: (...args: any[]) => void, -): IRegisteredEventListener { - emitter.on(eventName, handler); - return { emitter, eventName, handler }; -} - -export function addEventListeners( - emitter: EventEmitter, - registrations: [string | symbol, (...args: any[]) => void, boolean?][], -): IRegisteredEventListener[] { - return registrations.map(([eventName, handler]) => { - emitter.on(eventName, handler); - return { emitter, eventName, handler }; - }); -} - -export function removeEventListeners(listeners: Array): void { - for (const listener of listeners) { - listener.emitter.off(listener.eventName, listener.handler); - } - listeners.length = 0; -} - -export function addTypedEventListener( - emitter: TypedEventEmitter, - eventName: K, - handler: (this: TypedEventEmitter, event?: T[K], initiator?: any) => any, - includeUnhandledEvents?: boolean, -): IRegisteredEventListener { - emitter.on(eventName, handler, includeUnhandledEvents); - return { emitter, eventName, handler }; -} - -export function addTypedEventListeners( - emitter: TypedEventEmitter, - registrations: [K, (this: TypedEventEmitter, event?: T[K]) => any, boolean?][], -): IRegisteredEventListener[] { - return registrations.map(([eventName, handler, includeUnhandled]) => { - emitter.on(eventName, handler, includeUnhandled); - return { emitter, eventName, handler }; - }); -} export class TypedEventEmitter extends EventEmitter implements ITypedEventEmitter { public storeEventsWithoutListeners = false; public EventTypes: T; @@ -178,7 +133,7 @@ export class TypedEventEmitter extends EventEmitter implements ITypedEventEmi } this.logEvent(eventType, event); if (sendInitiator) return super.emit(eventType, event, sendInitiator); - else return super.emit(eventType, event); + return super.emit(eventType, event); } public override addListener( diff --git a/shared/package.json b/shared/package.json index 14ee5dc46..d17ed071b 100644 --- a/shared/package.json +++ b/shared/package.json @@ -24,7 +24,7 @@ "@commitlint/cli": "^12.0.1", "@commitlint/config-conventional": "^12.0.1", "@types/node": "^14.18.18", - "@ulixee/repo-tools": "1.0.9", + "@ulixee/repo-tools": "1.0.11", "cross-env": "^7.0.3", "@types/jest": "^28.1.0", "jest": "^28.1.0", diff --git a/shared/test/SourceLoader.test.ts b/shared/test/SourceLoader.test.ts index 9c3fb63fd..eb5c4edc3 100644 --- a/shared/test/SourceLoader.test.ts +++ b/shared/test/SourceLoader.test.ts @@ -2,7 +2,7 @@ import { getCallsite } from '../lib/utils'; import SourceLoader from '../lib/SourceLoader'; import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; -it('can lookup source code', function () { +it('can lookup source code', () => { let callsite: ISourceCodeLocation[]; // run code like this so we can see the true load (?? will be translated by typescript) function loadCallsite() { diff --git a/shared/test/SourceMapSupport.test.ts b/shared/test/SourceMapSupport.test.ts index bc7527192..be00efde7 100644 --- a/shared/test/SourceMapSupport.test.ts +++ b/shared/test/SourceMapSupport.test.ts @@ -1,7 +1,7 @@ -import { SourceMapSupport } from '../lib/SourceMapSupport'; import { SourceMapGenerator } from 'source-map-js'; import * as fs from 'fs'; import * as path from 'path'; +import { SourceMapSupport } from '../lib/SourceMapSupport'; import SourceLoader from '../lib/SourceLoader'; let counter = 0; @@ -13,7 +13,7 @@ beforeEach(() => { counter += 1; }); -it('normal throw', function () { +it('normal throw', () => { const { full, inline } = createStackTraces(createMultiLineSourceMap(), [ 'throw new Error("test");', ]); @@ -21,12 +21,12 @@ it('normal throw', function () { for (const stack of [full, inline]) { expect(stack[0]).toBe('Error: test'); expect(stack[1]).toMatch( - /^ at Object\.\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/, + /^ {4}at Object\.\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/, ); } }); -it('throw inside function', function () { +it('throw inside function', () => { const { full, inline } = createStackTraces(createMultiLineSourceMap(), [ 'function foo() {', ' throw new Error("test");', @@ -36,14 +36,14 @@ it('throw inside function', function () { for (const stack of [full, inline]) { expect(stack[0]).toBe('Error: test'); - expect(stack[1]).toMatch(/^ at foo \((?:.*[/\\])?line2\.js:1002:102\)$/); + expect(stack[1]).toMatch(/^ {4}at foo \((?:.*[/\\])?line2\.js:1002:102\)$/); expect(stack[2]).toMatch( - /^ at Object\.\.exports\.test \((?:.*[/\\])?line4\.js:1004:104\)$/, + /^ {4}at Object\.\.exports\.test \((?:.*[/\\])?line4\.js:1004:104\)$/, ); } }); -it('throw inside function inside function', function () { +it('throw inside function inside function', () => { const { full, inline } = createStackTraces(createMultiLineSourceMap(), [ 'function foo() {', ' function bar() {', @@ -56,15 +56,15 @@ it('throw inside function inside function', function () { for (const stack of [full, inline]) { expect(stack[0]).toBe('Error: test'); - expect(stack[1]).toMatch(/^ at bar \((?:.*[/\\])?line3\.js:1003:103\)$/); - expect(stack[2]).toMatch(/^ at foo \((?:.*[/\\])?line5\.js:1005:105\)$/); + expect(stack[1]).toMatch(/^ {4}at bar \((?:.*[/\\])?line3\.js:1003:103\)$/); + expect(stack[2]).toMatch(/^ {4}at foo \((?:.*[/\\])?line5\.js:1005:105\)$/); expect(stack[3]).toMatch( - /^ at Object\.\.exports\.test \((?:.*[/\\])?line7\.js:1007:107\)$/, + /^ {4}at Object\.\.exports\.test \((?:.*[/\\])?line7\.js:1007:107\)$/, ); } }); -it('native function', function () { +it('native function', () => { const sourceMap = createEmptySourceMap(); sourceMap.addMapping({ generated: { line: 1, column: 0 }, @@ -82,7 +82,7 @@ it('native function', function () { } }); -it('function constructor', function () { +it('function constructor', () => { const { full, inline } = createStackTraces(createMultiLineSourceMap(), [ 'throw new Function(")");', ]); @@ -92,18 +92,18 @@ it('function constructor', function () { } }); -it('throw with empty source map', function () { +it('throw with empty source map', () => { const { full, inline } = createStackTraces(createEmptySourceMap(), ['throw new Error("test");']); for (const stack of [full, inline]) { expect(stack[0]).toBe('Error: test'); expect(stack[1]).toMatch( - /^ at Object\.\.exports\.test \((?:.*[/\\])?\.generated-\d+(?:-inline)?\.js:1:\d+\)$/, + /^ {4}at Object\.\.exports\.test \((?:.*[/\\])?\.generated-\d+(?:-inline)?\.js:1:\d+\)$/, ); } }); -it('throw with source map with gap', function () { +it('throw with source map with gap', () => { const { full, inline } = createStackTraces(createSourceMapWithGap(), [ 'throw new Error("test");', ]); @@ -111,12 +111,12 @@ it('throw with source map with gap', function () { for (const stack of [full, inline]) { expect(stack[0]).toBe('Error: test'); expect(stack[1]).toMatch( - /^ at Object\.\.exports\.test \((?:.*[/\\])?\.generated-\d+(?:-inline)?\.js:1:\d+\)$/, + /^ {4}at Object\.\.exports\.test \((?:.*[/\\])?\.generated-\d+(?:-inline)?\.js:1:\d+\)$/, ); } }); -it('finds the last sourceMappingURL', function () { +it('finds the last sourceMappingURL', () => { const { full, inline } = createStackTraces(createMultiLineSourceMapWithSourcesContent(), [ '//# sourceMappingURL=missing.map.js', // NB: createStackTraces adds another source mapping. 'throw new Error("test");', @@ -125,12 +125,12 @@ it('finds the last sourceMappingURL', function () { for (const stack of [full, inline]) { expect(stack[0]).toBe('Error: test'); expect(stack[1]).toMatch( - /^ at Object\.\.exports\.test \((?:.*[/\\])?original\.js:1002:5\)$/, + /^ {4}at Object\.\.exports\.test \((?:.*[/\\])?original\.js:1002:5\)$/, ); } }); -it('maps original name from source', function () { +it('maps original name from source', () => { const sourceMap = createEmptySourceMap(); sourceMap.addMapping({ generated: { line: 2, column: 8 }, @@ -152,9 +152,9 @@ it('maps original name from source', function () { for (const stack of [full, inline]) { expect(stack[0]).toBe('Error: test'); - expect(stack[1]).toMatch(/^ at myOriginalName \((?:.*[/\\])?\.original2.js:1000:11\)$/); + expect(stack[1]).toMatch(/^ {4}at myOriginalName \((?:.*[/\\])?\.original2.js:1000:11\)$/); expect(stack[2]).toMatch( - /^ at Object\.\.exports\.test \((?:.*[/\\])?\.original2.js:1002:2\)$/, + /^ {4}at Object\.\.exports\.test \((?:.*[/\\])?\.original2.js:1002:2\)$/, ); } }); @@ -163,24 +163,25 @@ it('maps original name from source', function () { * `createStackTraces` but appends a charset to the * source mapping url. */ -it('finds source maps with charset specified', function () { +it('finds source maps with charset specified', () => { const sourceMap = createMultiLineSourceMap(); const file = `./.generated-${counter}.js`; fs.writeFileSync( path.join(__dirname, file), - 'exports.test = function() {' + + `${'exports.test = function() {' + 'throw new Error("test");' + - '};//@ sourceMappingURL=data:application/json;charset=utf8;base64,' + - Buffer.from(sourceMap.toString()).toString('base64'), + '};//@ sourceMappingURL=data:application/json;charset=utf8;base64,'}${ + Buffer.from(sourceMap.toString()).toString('base64')}`, ); try { + // eslint-disable-next-line import/no-dynamic-require require(file).test(); } catch (e) { const stack = e.stack.split(/\r\n|\n/); expect(stack[0]).toBe('Error: test'); expect(stack[1]).toMatch( - /^ at Object\.\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/, + /^ {4}at Object\.\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/, ); } fs.unlinkSync(path.join(__dirname, file)); @@ -190,24 +191,25 @@ it('finds source maps with charset specified', function () { * `createStackTraces` but appends some code and a * comment to the source mapping url. */ -it('allows code/comments after sourceMappingURL', function () { +it('allows code/comments after sourceMappingURL', () => { const sourceMap = createMultiLineSourceMap(); const file = `./.generated-${counter}.js`; fs.writeFileSync( path.join(__dirname, file), - 'exports.test = function() {' + + `${'exports.test = function() {' + 'throw new Error("test");' + - '};//# sourceMappingURL=data:application/json;base64,' + - Buffer.from(sourceMap.toString()).toString('base64') + - '\n// Some comment below the sourceMappingURL\nvar foo = 0;', + '};//# sourceMappingURL=data:application/json;base64,'}${ + Buffer.from(sourceMap.toString()).toString('base64') + }\n// Some comment below the sourceMappingURL\nvar foo = 0;`, ); try { + // eslint-disable-next-line import/no-dynamic-require require(file).test(); } catch (e) { const stack = e.stack.split(/\r\n|\n/); expect(stack[0]).toBe('Error: test'); expect(stack[1]).toMatch( - /^ at Object\.\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/, + /^ {4}at Object\.\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/, ); } fs.unlinkSync(path.join(__dirname, file)); @@ -236,7 +238,7 @@ function createMultiLineSourceMap(): SourceMapGenerator { sourceMap.addMapping({ generated: { line: i, column: 0 }, original: { line: 1000 + i, column: 99 + i }, - source: 'line' + i + '.js', + source: `line${ i }.js`, }); } return sourceMap; @@ -251,7 +253,7 @@ function createMultiLineSourceMapWithSourcesContent(): SourceMapGenerator { original: { line: 1000 + i, column: 4 }, source: 'original.js', }); - original += ' line ' + i + '\n'; + original += ` line ${ i }\n`; } sourceMap.setSourceContent('original.js', original); return sourceMap; @@ -265,12 +267,13 @@ function createStackTraces( fs.writeFileSync(`${__dirname}/.generated-${counter}.js.map`, sourceMap.toString()); fs.writeFileSync( `${__dirname}/.generated-${counter}.js`, - 'exports.test = function() {' + - source.join('\n') + - `};//@ sourceMappingURL=.generated-${counter}.js.map`, + `exports.test = function() {${ + source.join('\n') + }};//@ sourceMappingURL=.generated-${counter}.js.map`, ); const response = { full: null, inline: null }; try { + // eslint-disable-next-line import/no-dynamic-require require(`./.generated-${counter}`).test(); } catch (e) { response.full = e.stack.split(/\r\n|\n/); @@ -281,12 +284,13 @@ function createStackTraces( // Check again with an inline source map (in a data URL) fs.writeFileSync( `${__dirname}/.generated-${counter}-inline.js`, - 'exports.test = function() {' + - source.join('\n') + - '};//@ sourceMappingURL=data:application/json;base64,' + - Buffer.from(sourceMap.toString()).toString('base64'), + `exports.test = function() {${ + source.join('\n') + }};//@ sourceMappingURL=data:application/json;base64,${ + Buffer.from(sourceMap.toString()).toString('base64')}`, ); try { + // eslint-disable-next-line import/no-dynamic-require require(`./.generated-${counter}-inline`).test(); } catch (e) { response.inline = e.stack.split(/\r\n|\n/); From 14a3bb5a6454e766576a325de9ce68b81cd14401 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Sat, 11 Jun 2022 14:35:18 -0400 Subject: [PATCH 010/147] fix: another lint issue --- shared/config/servers.ts | 4 +- shared/yarn.lock | 471 +++++++++++++-------------------------- 2 files changed, 163 insertions(+), 312 deletions(-) diff --git a/shared/config/servers.ts b/shared/config/servers.ts index 91b191481..c83e4c658 100644 --- a/shared/config/servers.ts +++ b/shared/config/servers.ts @@ -26,7 +26,9 @@ export default class UlixeeServerConfig { let serverModulePath: string; try { serverModulePath = require.resolve('@ulixee/server'); - } catch (err) {} + } catch (err) { + /* no-op */ + } this.hostByVersion[version] = { host, nodePath: process.execPath, diff --git a/shared/yarn.lock b/shared/yarn.lock index 5fb3646bc..4d9992a6a 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -10,13 +10,6 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" @@ -204,7 +197,7 @@ "@babel/traverse" "^7.18.2" "@babel/types" "^7.18.2" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": +"@babel/highlight@^7.16.7": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== @@ -523,31 +516,31 @@ dependencies: chalk "^4.0.0" -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" + "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/object-schema@^1.2.0": +"@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -977,14 +970,14 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.25.0.tgz#e8ce050990e4d36cc200f2de71ca0d3eb5e77a31" - integrity sha512-icYrFnUzvm+LhW0QeJNKkezBu6tJs9p/53dpPLFH8zoM9w1tfaKzVurkPotEpAqQ8Vf8uaFyL5jHd0Vs6Z0ZQg== +"@typescript-eslint/eslint-plugin@^5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.1.tgz#fdf59c905354139046b41b3ed95d1609913d0758" + integrity sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw== dependencies: - "@typescript-eslint/scope-manager" "5.25.0" - "@typescript-eslint/type-utils" "5.25.0" - "@typescript-eslint/utils" "5.25.0" + "@typescript-eslint/scope-manager" "5.27.1" + "@typescript-eslint/type-utils" "5.27.1" + "@typescript-eslint/utils" "5.27.1" debug "^4.3.4" functional-red-black-tree "^1.0.1" ignore "^5.2.0" @@ -992,100 +985,92 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@^5.0.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.25.0.tgz#950ab2ab402852a8a2c02b4b254b06d411a6ba9e" - integrity sha512-YTe9rmslCh1xAvNa3X+uZe4L2lsyb8V3WIeK9z46nNiPswk/V/0SGLJSfo8W9Hj4R7ak7bolazXGn3DErmb8QA== - dependencies: - "@typescript-eslint/utils" "5.25.0" - -"@typescript-eslint/parser@^5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.25.0.tgz#fb533487147b4b9efd999a4d2da0b6c263b64f7f" - integrity sha512-r3hwrOWYbNKP1nTcIw/aZoH+8bBnh/Lh1iDHoFpyG4DnCpvEdctrSl6LOo19fZbzypjQMHdajolxs6VpYoChgA== +"@typescript-eslint/parser@^5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.27.1.tgz#3a4dcaa67e45e0427b6ca7bb7165122c8b569639" + integrity sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ== dependencies: - "@typescript-eslint/scope-manager" "5.25.0" - "@typescript-eslint/types" "5.25.0" - "@typescript-eslint/typescript-estree" "5.25.0" + "@typescript-eslint/scope-manager" "5.27.1" + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/typescript-estree" "5.27.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.25.0.tgz#e78f1484bca7e484c48782075219c82c6b77a09f" - integrity sha512-p4SKTFWj+2VpreUZ5xMQsBMDdQ9XdRvODKXN4EksyBjFp2YvQdLkyHqOffakYZPuWJUDNu3jVXtHALDyTv3cww== +"@typescript-eslint/scope-manager@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.27.1.tgz#4d1504392d01fe5f76f4a5825991ec78b7b7894d" + integrity sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg== dependencies: - "@typescript-eslint/types" "5.25.0" - "@typescript-eslint/visitor-keys" "5.25.0" + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/visitor-keys" "5.27.1" -"@typescript-eslint/type-utils@5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.25.0.tgz#5750d26a5db4c4d68d511611e0ada04e56f613bc" - integrity sha512-B6nb3GK3Gv1Rsb2pqalebe/RyQoyG/WDy9yhj8EE0Ikds4Xa8RR28nHz+wlt4tMZk5bnAr0f3oC8TuDAd5CPrw== +"@typescript-eslint/type-utils@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.27.1.tgz#369f695199f74c1876e395ebea202582eb1d4166" + integrity sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw== dependencies: - "@typescript-eslint/utils" "5.25.0" + "@typescript-eslint/utils" "5.27.1" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.25.0.tgz#dee51b1855788b24a2eceeae54e4adb89b088dd8" - integrity sha512-7fWqfxr0KNHj75PFqlGX24gWjdV/FDBABXL5dyvBOWHpACGyveok8Uj4ipPX/1fGU63fBkzSIycEje4XsOxUFA== +"@typescript-eslint/types@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.27.1.tgz#34e3e629501349d38be6ae97841298c03a6ffbf1" + integrity sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg== -"@typescript-eslint/typescript-estree@5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.25.0.tgz#a7ab40d32eb944e3fb5b4e3646e81b1bcdd63e00" - integrity sha512-MrPODKDych/oWs/71LCnuO7NyR681HuBly2uLnX3r5i4ME7q/yBqC4hW33kmxtuauLTM0OuBOhhkFaxCCOjEEw== +"@typescript-eslint/typescript-estree@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.1.tgz#7621ee78607331821c16fffc21fc7a452d7bc808" + integrity sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw== dependencies: - "@typescript-eslint/types" "5.25.0" - "@typescript-eslint/visitor-keys" "5.25.0" + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/visitor-keys" "5.27.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.25.0.tgz#272751fd737733294b4ab95e16c7f2d4a75c2049" - integrity sha512-qNC9bhnz/n9Kba3yI6HQgQdBLuxDoMgdjzdhSInZh6NaDnFpTUlwNGxplUFWfY260Ya0TRPvkg9dd57qxrJI9g== +"@typescript-eslint/utils@5.27.1", "@typescript-eslint/utils@^5.10.0": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.27.1.tgz#b4678b68a94bc3b85bf08f243812a6868ac5128f" + integrity sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.25.0" - "@typescript-eslint/types" "5.25.0" - "@typescript-eslint/typescript-estree" "5.25.0" + "@typescript-eslint/scope-manager" "5.27.1" + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/typescript-estree" "5.27.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.25.0": - version "5.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.25.0.tgz#33aa5fdcc5cedb9f4c8828c6a019d58548d4474b" - integrity sha512-yd26vFgMsC4h2dgX4+LR+GeicSKIfUvZREFLf3DDjZPtqgLx5AJZr6TetMNwFP9hcKreTTeztQYBTNbNoOycwA== +"@typescript-eslint/visitor-keys@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.1.tgz#05a62666f2a89769dac2e6baa48f74e8472983af" + integrity sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ== dependencies: - "@typescript-eslint/types" "5.25.0" + "@typescript-eslint/types" "5.27.1" eslint-visitor-keys "^3.3.0" -"@ulixee/repo-tools@1.0.9": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.9.tgz#2775853d650da43645a6d8b8f3ce8ff90b40567d" - integrity sha512-jkJwuERasTm+agRu7gtWuXCeobqr/uBFwDRRX6THz3kpW2G/Ij5qadzD4790s2iiw7O2/lGCbNDn/OU97pN5VA== +"@ulixee/repo-tools@1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.11.tgz#57325e26adba2446a50c80c2cc7eddc7513b5c94" + integrity sha512-dphJpK2cX2+stYyx7kYk+gzNQgJr38R4SaU0ztZNpOQoj/1LmMyJrzni6wE5zgv2a1Qeh5ZzXxYvz3hnkspyfQ== dependencies: - "@typescript-eslint/eslint-plugin" "^5.25.0" - "@typescript-eslint/parser" "^5.25.0" + "@typescript-eslint/eslint-plugin" "^5.27.1" + "@typescript-eslint/parser" "^5.27.1" copyfiles "^2.4.1" - eslint "^7.21.0" + eslint "^8.17.0" + eslint-config-airbnb-base "^15.0.0" eslint-config-airbnb-typescript "^17.0.0" - eslint-config-prettier "^8.3.0" - eslint-import-resolver-typescript "^2.5.0" + eslint-config-prettier "^8.5.0" + eslint-import-resolver-typescript "^2.7.1" eslint-plugin-eslint-comments "^3.2.0" - eslint-plugin-import "^2.25.4" - eslint-plugin-jest "^25.2.2" - eslint-plugin-jsx-a11y "^6.4.1" + eslint-plugin-import "^2.26.0" + eslint-plugin-jest "^26.5.3" + eslint-plugin-jsx-a11y "^6.5.1" eslint-plugin-monorepo-cop "^1.0.2" eslint-plugin-prettier "^4.0.0" - eslint-plugin-promise "^5.1.1" - eslint-plugin-react "^7.22.0" - eslint-plugin-react-hooks "^4.2.0" - prettier "^2.2.1" + eslint-plugin-promise "^6.0.0" + prettier "^2.6.2" pretty-quick "^3.1.0" typescript "^4.7.2" @@ -1097,15 +1082,15 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -acorn-jsx@^5.3.1: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== agent-base@6: version "6.0.2" @@ -1132,16 +1117,6 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" @@ -1193,6 +1168,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -1211,7 +1191,7 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.4, array-includes@^3.1.5: +array-includes@^3.1.4: version "3.1.5" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== @@ -1237,16 +1217,6 @@ array.prototype.flat@^1.2.5: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" - integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -1654,7 +1624,7 @@ dargs@^7.0.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1786,7 +1756,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.5, enquirer@^2.3.6: +enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -1882,7 +1852,7 @@ eslint-config-airbnb-typescript@^17.0.0: dependencies: eslint-config-airbnb-base "^15.0.0" -eslint-config-prettier@^8.3.0: +eslint-config-prettier@^8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== @@ -1895,7 +1865,7 @@ eslint-import-resolver-node@^0.3.6: debug "^3.2.7" resolve "^1.20.0" -eslint-import-resolver-typescript@^2.5.0: +eslint-import-resolver-typescript@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== @@ -1922,7 +1892,7 @@ eslint-plugin-eslint-comments@^3.2.0: escape-string-regexp "^1.0.5" ignore "^5.0.5" -eslint-plugin-import@^2.25.4: +eslint-plugin-import@^2.26.0: version "2.26.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== @@ -1941,14 +1911,14 @@ eslint-plugin-import@^2.25.4: resolve "^1.22.0" tsconfig-paths "^3.14.1" -eslint-plugin-jest@^25.2.2: - version "25.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" - integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== +eslint-plugin-jest@^26.5.3: + version "26.5.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.5.3.tgz#a3ceeaf4a757878342b8b00eca92379b246e5505" + integrity sha512-sICclUqJQnR1bFRZGLN2jnSVsYOsmPYYnroGCIMVSvTS3y8XR3yjzy1EcTQmk6typ5pRgyIWzbjqxK6cZHEZuQ== dependencies: - "@typescript-eslint/experimental-utils" "^5.0.0" + "@typescript-eslint/utils" "^5.10.0" -eslint-plugin-jsx-a11y@^6.4.1: +eslint-plugin-jsx-a11y@^6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== @@ -1981,35 +1951,10 @@ eslint-plugin-prettier@^4.0.0: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-promise@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971" - integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw== - -eslint-plugin-react-hooks@^4.2.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" - integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== - -eslint-plugin-react@^7.22.0: - version "7.30.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz#8e7b1b2934b8426ac067a0febade1b13bd7064e3" - integrity sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A== - dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" - doctrine "^2.1.0" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" - prop-types "^15.8.1" - resolve "^2.0.0-next.3" - semver "^6.3.0" - string.prototype.matchall "^4.0.7" +eslint-plugin-promise@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" + integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== eslint-scope@^5.1.1: version "5.1.1" @@ -2019,12 +1964,13 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" eslint-utils@^3.0.0: version "3.0.0" @@ -2033,11 +1979,6 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -2048,60 +1989,55 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^7.21.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== +eslint@^8.17.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.17.0.tgz#1cfc4b6b6912f77d24b874ca1506b0fe09328c21" + integrity sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw== dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" + glob-parent "^6.0.1" + globals "^13.15.0" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" + regexpp "^3.2.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" esprima@^4.0.0: version "4.0.1" @@ -2127,7 +2063,7 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -2390,6 +2326,13 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -2414,7 +2357,7 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: +globals@^13.15.0: version "13.15.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== @@ -2524,11 +2467,6 @@ husky@^7.0.1: resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - ignore@^5.0.5, ignore@^5.1.4, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" @@ -2617,7 +2555,7 @@ is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== @@ -3190,7 +3128,7 @@ jest@^28.1.0: import-local "^3.0.2" jest-cli "^28.1.1" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -3203,6 +3141,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -3218,11 +3163,6 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -3254,7 +3194,7 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: +jsx-ast-utils@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== @@ -3364,11 +3304,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - lodash@^4.17.15, lodash@^4.17.19: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -3392,13 +3327,6 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -3587,11 +3515,6 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" @@ -3621,23 +3544,6 @@ object.entries@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" -object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" - integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== - dependencies: - define-properties "^1.1.4" - es-abstract "^1.19.5" - object.values@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" @@ -3769,7 +3675,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -3820,7 +3726,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.2.1: +prettier@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== @@ -3861,11 +3767,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -3874,15 +3775,6 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -3911,11 +3803,6 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" @@ -4006,7 +3893,7 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -4015,7 +3902,7 @@ regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^3.1.0, regexpp@^3.2.0: +regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -4025,11 +3912,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - requireindex@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" @@ -4073,14 +3955,6 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -4152,7 +4026,7 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -4315,20 +4189,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.matchall@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" - side-channel "^1.0.4" - string.prototype.trimend@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" @@ -4443,17 +4303,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" From 28bfcb44a7a317b3eef0f0a924f64f063897c0c8 Mon Sep 17 00:00:00 2001 From: Caleb Clark Date: Wed, 15 Jun 2022 06:28:08 -0400 Subject: [PATCH 011/147] feat: added nvmrc file --- shared/.nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 shared/.nvmrc diff --git a/shared/.nvmrc b/shared/.nvmrc new file mode 100644 index 000000000..62df50f1e --- /dev/null +++ b/shared/.nvmrc @@ -0,0 +1 @@ +14.17.0 From c754a0e0d9de08dfa40b556be4baa90ee582cb1f Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 28 Jun 2022 12:56:13 -0400 Subject: [PATCH 012/147] fix: handle * logger --- shared/config/index.ts | 14 +++++--------- shared/lib/Logger.ts | 4 +++- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/shared/config/index.ts b/shared/config/index.ts index 2de9b200d..42d69ae44 100644 --- a/shared/config/index.ts +++ b/shared/config/index.ts @@ -31,11 +31,6 @@ export default class UlixeeConfig { } } - public async setGlobalDefaults(): Promise { - this.serverHost ??= 'localhost:1337'; - await this.save(); - } - public save(): Promise { return safeOverwriteFile(this.configPath, JSON.stringify(this.getData(), null, 2)); } @@ -52,9 +47,10 @@ export default class UlixeeConfig { if (!this.cachedConfigObjects[key]) { const directory = this.findConfigDirectory(runtimeLocation); if (directory === this.globalConfigDirectory) return UlixeeConfig.global; - if (!this.isCacheEnabled) return new UlixeeConfig(directory); + const config = new UlixeeConfig(directory); + if (this.isCacheEnabled) this.cachedConfigObjects[key] = config; - this.cachedConfigObjects[key] = new UlixeeConfig(directory); + return config; } return this.cachedConfigObjects[key]; } @@ -64,9 +60,9 @@ export default class UlixeeConfig { const key = this.getLocationKey(runtimeLocation); if (!this.cachedConfigLocations[key]) { const configDirectory = this.traverseDirectories(runtimeLocation); - if (!this.isCacheEnabled) return configDirectory; + if (this.isCacheEnabled) this.cachedConfigLocations[key] = configDirectory; - this.cachedConfigLocations[key] = configDirectory; + return configDirectory; } return this.cachedConfigLocations[key]; diff --git a/shared/lib/Logger.ts b/shared/lib/Logger.ts index fe4205407..d999206c3 100644 --- a/shared/lib/Logger.ts +++ b/shared/lib/Logger.ts @@ -257,6 +257,8 @@ function isEnabled(modulePath: string): boolean { if (modulePath[modulePath.length - 1] === '*') { return true; } + if (logFilters.namespaces.active.has('*')) return true; + for (const ns of logFilters.skip) { if (ns.test(modulePath)) { logFilters.enabledNamesCache[modulePath] = false; @@ -299,7 +301,7 @@ registerNamespaceMapping((ns, active, skip) => { } else if (ns === 'ubk') { active.push(/agent\/.*/); skip.push(/DevtoolsSessionLogger/, /agent[/-]mitm.*/); - } else if (ns.includes('ubk:devtools')) { + } else if (ns.includes('ubk:devtools') || ns === '*') { active.push(/DevtoolsSessionLogger/); } }); From dcff38a10a79524eee84602e18e5795632b1a538 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 28 Jun 2022 12:56:42 -0400 Subject: [PATCH 013/147] v2.0.0-alpha.6 --- shared/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/package.json b/shared/package.json index d17ed071b..540892535 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.5", + "version": "2.0.0-alpha.6", "description": "Common utilities for Ulixee", "license": "MIT", "scripts": { From 4f5eba67ee71d1314e02c588ddbd68b830292a68 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 6 Jul 2022 16:58:07 -0400 Subject: [PATCH 014/147] feat: find project path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: add more hashing prefixes feat: don’t default to global config --- shared/config/index.ts | 15 +++++++++++---- shared/lib/Hasher.ts | 10 +++++----- shared/lib/dirUtils.ts | 28 ++++++++++++++++++++++++++++ shared/lib/fileUtils.ts | 1 + 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/shared/config/index.ts b/shared/config/index.ts index 42d69ae44..d888ffd38 100644 --- a/shared/config/index.ts +++ b/shared/config/index.ts @@ -55,11 +55,14 @@ export default class UlixeeConfig { return this.cachedConfigObjects[key]; } - public static findConfigDirectory(runtimeLocation?: IRuntimeLocation): string { + public static findConfigDirectory( + runtimeLocation?: IRuntimeLocation, + defaultToGlobal = true, + ): string { runtimeLocation = this.useRuntimeLocationDefaults(runtimeLocation); const key = this.getLocationKey(runtimeLocation); if (!this.cachedConfigLocations[key]) { - const configDirectory = this.traverseDirectories(runtimeLocation); + const configDirectory = this.traverseDirectories(runtimeLocation, defaultToGlobal); if (this.isCacheEnabled) this.cachedConfigLocations[key] = configDirectory; return configDirectory; @@ -79,12 +82,15 @@ export default class UlixeeConfig { return `${runtimeLocation.workingDirectory}_${runtimeLocation.entrypoint}`; } - private static traverseDirectories(runtimeLocation: IRuntimeLocation): string { + private static traverseDirectories( + runtimeLocation: IRuntimeLocation, + defaultToGlobal: boolean, + ): string { const { entrypoint, workingDirectory } = runtimeLocation; // look up hierarchy from the entrypoint of the script let currentPath = Path.dirname(entrypoint); do { - const upDirectory = Path.normalize(Path.join(currentPath, '..')); + const upDirectory = Path.dirname(currentPath); if (upDirectory === currentPath) break; currentPath = upDirectory; @@ -95,6 +101,7 @@ export default class UlixeeConfig { const configPath = this.hasConfigDirectory(workingDirectory); if (configPath) return configPath; + if (!defaultToGlobal) return null; // global directory is the working directory return this.globalConfigDirectory; } diff --git a/shared/lib/Hasher.ts b/shared/lib/Hasher.ts index 3367deb46..b985c9fe8 100644 --- a/shared/lib/Hasher.ts +++ b/shared/lib/Hasher.ts @@ -1,8 +1,8 @@ import { createHash } from 'crypto'; -import { bech32m } from 'bech32' +import { bech32m } from 'bech32'; -export function hashDatabox(script: Buffer): string { - const hash = createHash('sha3-256').update(script).digest(); - const words = bech32m.toWords(hash); - return bech32m.encode('dbx', words); +export function hash(data: Buffer, prefix: 'scr' | 'dbx'): string { + const digest = createHash('sha3-256').update(data).digest(); + const words = bech32m.toWords(digest); + return bech32m.encode(prefix, words); } diff --git a/shared/lib/dirUtils.ts b/shared/lib/dirUtils.ts index d59c2b513..ff0399c9d 100644 --- a/shared/lib/dirUtils.ts +++ b/shared/lib/dirUtils.ts @@ -1,5 +1,7 @@ import * as os from 'os'; import * as Path from 'path'; +import * as Fs from 'fs'; +import { existsAsync } from './fileUtils'; export function getCacheDirectory(): string { if (process.platform === 'linux') { @@ -16,3 +18,29 @@ export function getCacheDirectory(): string { throw new Error(`Unsupported platform: ${process.platform}`); } + +export function findProjectPathSync(startingDirectory: string): string { + let last: string; + let path = Path.resolve(startingDirectory); + do { + last = path; + if (Fs.existsSync(Path.join(path, 'package.json'))) { + return path; + } + path = Path.dirname(path); + } while (path && path !== last); + return path; +} + +export async function findProjectPathAsync(startingDirectory: string): Promise { + let last: string; + let path = Path.resolve(startingDirectory); + do { + last = path; + if (await existsAsync(Path.join(path, 'package.json'))) { + return path; + } + path = Path.dirname(path); + } while (path && path !== last); + return path; +} diff --git a/shared/lib/fileUtils.ts b/shared/lib/fileUtils.ts index 1e18f31b2..858c55293 100644 --- a/shared/lib/fileUtils.ts +++ b/shared/lib/fileUtils.ts @@ -13,6 +13,7 @@ export async function existsAsync(path: string): Promise { export async function readFileAsJson(path: string): Promise { const buffer = await Fs.readFile(path, 'utf8'); + if (!buffer) return null; return JSON.parse(buffer) as T; } From 3d637a048f4e01efe49bfa96ff673d169d0ea644 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 8 Jul 2022 15:53:16 -0400 Subject: [PATCH 015/147] feat: databoxesOutDir --- shared/config/index.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/shared/config/index.ts b/shared/config/index.ts index d888ffd38..91713b79a 100644 --- a/shared/config/index.ts +++ b/shared/config/index.ts @@ -19,6 +19,7 @@ export default class UlixeeConfig { private static cachedConfigObjects: { [cwd_entrypoint: string]: UlixeeConfig } = {}; public serverHost?: string; + public databoxOutDir?: string; private get configPath(): string { return Path.join(this.directoryPath, 'config.json'); @@ -28,6 +29,9 @@ export default class UlixeeConfig { if (Fs.existsSync(this.configPath)) { const data = JSON.parse(Fs.readFileSync(this.configPath, 'utf8')); this.serverHost = data.serverHost; + if (data.databoxOutDir) { + this.databoxOutDir = Path.isAbsolute(data.databoxOutDir) ? data.databoxOutDir : Path.resolve(this.directoryPath, data.databoxOutDir); + } } } @@ -38,6 +42,7 @@ export default class UlixeeConfig { private getData(): IUlixeeConfig { return { serverHost: this.serverHost, + databoxOutDir: this.databoxOutDir, }; } @@ -113,7 +118,8 @@ export default class UlixeeConfig { } export interface IUlixeeConfig { - serverHost: string; + serverHost?: string; + databoxOutDir?: string } export interface IRuntimeLocation { From b9ef9015b171199fee6977a349f859b6b601cab1 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 12 Jul 2022 13:33:35 -0400 Subject: [PATCH 016/147] chore: merge net and commons --- shared/README.md | 11 +- shared/{ => commons}/config/index.ts | 0 shared/{ => commons}/config/servers.ts | 0 shared/{ => commons}/interfaces/ILog.ts | 0 .../interfaces/IPendingWaitEvent.ts | 0 .../interfaces/IRegisteredEventListener.ts | 0 .../interfaces/IResolvablePromise.ts | 0 .../interfaces/ISourceCodeLocation.ts | 0 .../interfaces/ITypedEventEmitter.ts | 0 .../interfaces/SameSiteContext.ts | 0 .../{ => commons}/interfaces/TimeoutError.ts | 0 shared/{ => commons}/lib/EventSubscriber.ts | 0 shared/{ => commons}/lib/IpcUtils.ts | 0 shared/{ => commons}/lib/Logger.ts | 2 + shared/{ => commons}/lib/Queue.ts | 0 shared/{ => commons}/lib/Resolvable.ts | 0 .../lib/SessionClosedOrMissingError.ts | 0 shared/{ => commons}/lib/ShutdownHandler.ts | 0 shared/{ => commons}/lib/SourceLoader.ts | 0 shared/{ => commons}/lib/SourceMapSupport.ts | 0 shared/{ => commons}/lib/SqliteTable.ts | 0 shared/{ => commons}/lib/Timer.ts | 0 shared/{ => commons}/lib/TypeSerializer.ts | 30 +- .../lib/TypedEventEmitter.ts} | 6 +- shared/{ => commons}/lib/VersionUtils.ts | 0 shared/{ => commons}/lib/decodeBuffer.ts | 0 shared/{ => commons}/lib/dirUtils.ts | 7 + shared/{ => commons}/lib/downloadFile.ts | 0 shared/commons/lib/eventUtils.ts | 3 + shared/{ => commons}/lib/fileUtils.ts | 0 shared/{ => commons}/lib/getProxyForUrl.ts | 0 shared/commons/lib/hashUtils.ts | 29 + shared/{ => commons}/lib/utils.ts | 0 shared/commons/package.json | 16 + .../{ => commons}/test/SourceLoader.test.ts | 0 .../test/SourceMapSupport.test.ts | 0 .../{ => commons}/test/TypeSerializer.test.ts | 0 shared/{ => commons}/test/utils.test.ts | 0 shared/lerna.json | 5 + shared/lib/Hasher.ts | 8 - shared/net/README.md | 7 + shared/net/errors/DisconnectedError.ts | 11 + shared/net/interfaces/IApiHandlers.ts | 18 + shared/net/interfaces/IConnectionToClient.ts | 17 + shared/net/interfaces/ICoreEventPayload.ts | 5 + shared/net/interfaces/ICoreRequestPayload.ts | 14 + shared/net/interfaces/ICoreResponsePayload.ts | 9 + shared/net/interfaces/ITransportToClient.ts | 21 + shared/net/interfaces/ITransportToCore.ts | 28 + shared/net/interfaces/IUnixTime.ts | 3 + shared/net/lib/ConnectionToClient.ts | 78 + shared/net/lib/ConnectionToCore.ts | 239 ++ shared/net/lib/EmittingTransportToClient.ts | 32 + shared/net/lib/EmittingTransportToCore.ts | 29 + shared/net/lib/HttpTransportToClient.ts | 59 + shared/net/lib/PendingMessages.ts | 56 + shared/net/lib/TransportBridge.ts | 26 + shared/net/lib/WsTransportToClient.ts | 47 + shared/net/lib/WsTransportToCore.ts | 127 + shared/net/lib/WsUtils.ts | 29 + shared/net/package.json | 13 + shared/net/test/ConnectionToClient.test.ts | 27 + shared/net/test/ConnectionToCore.test.ts | 52 + shared/net/test/basic.test.ts | 57 + shared/package.build.json | 10 +- shared/package.json | 36 +- shared/tsconfig.json | 1 - shared/yarn.lock | 2959 ++++++++++++++++- 68 files changed, 4035 insertions(+), 92 deletions(-) rename shared/{ => commons}/config/index.ts (100%) rename shared/{ => commons}/config/servers.ts (100%) rename shared/{ => commons}/interfaces/ILog.ts (100%) rename shared/{ => commons}/interfaces/IPendingWaitEvent.ts (100%) rename shared/{ => commons}/interfaces/IRegisteredEventListener.ts (100%) rename shared/{ => commons}/interfaces/IResolvablePromise.ts (100%) rename shared/{ => commons}/interfaces/ISourceCodeLocation.ts (100%) rename shared/{ => commons}/interfaces/ITypedEventEmitter.ts (100%) rename shared/{ => commons}/interfaces/SameSiteContext.ts (100%) rename shared/{ => commons}/interfaces/TimeoutError.ts (100%) rename shared/{ => commons}/lib/EventSubscriber.ts (100%) rename shared/{ => commons}/lib/IpcUtils.ts (100%) rename shared/{ => commons}/lib/Logger.ts (99%) rename shared/{ => commons}/lib/Queue.ts (100%) rename shared/{ => commons}/lib/Resolvable.ts (100%) rename shared/{ => commons}/lib/SessionClosedOrMissingError.ts (100%) rename shared/{ => commons}/lib/ShutdownHandler.ts (100%) rename shared/{ => commons}/lib/SourceLoader.ts (100%) rename shared/{ => commons}/lib/SourceMapSupport.ts (100%) rename shared/{ => commons}/lib/SqliteTable.ts (100%) rename shared/{ => commons}/lib/Timer.ts (100%) rename shared/{ => commons}/lib/TypeSerializer.ts (90%) rename shared/{lib/eventUtils.ts => commons/lib/TypedEventEmitter.ts} (98%) rename shared/{ => commons}/lib/VersionUtils.ts (100%) rename shared/{ => commons}/lib/decodeBuffer.ts (100%) rename shared/{ => commons}/lib/dirUtils.ts (89%) rename shared/{ => commons}/lib/downloadFile.ts (100%) create mode 100644 shared/commons/lib/eventUtils.ts rename shared/{ => commons}/lib/fileUtils.ts (100%) rename shared/{ => commons}/lib/getProxyForUrl.ts (100%) create mode 100644 shared/commons/lib/hashUtils.ts rename shared/{ => commons}/lib/utils.ts (100%) create mode 100644 shared/commons/package.json rename shared/{ => commons}/test/SourceLoader.test.ts (100%) rename shared/{ => commons}/test/SourceMapSupport.test.ts (100%) rename shared/{ => commons}/test/TypeSerializer.test.ts (100%) rename shared/{ => commons}/test/utils.test.ts (100%) create mode 100644 shared/lerna.json delete mode 100644 shared/lib/Hasher.ts create mode 100644 shared/net/README.md create mode 100644 shared/net/errors/DisconnectedError.ts create mode 100644 shared/net/interfaces/IApiHandlers.ts create mode 100644 shared/net/interfaces/IConnectionToClient.ts create mode 100644 shared/net/interfaces/ICoreEventPayload.ts create mode 100644 shared/net/interfaces/ICoreRequestPayload.ts create mode 100644 shared/net/interfaces/ICoreResponsePayload.ts create mode 100644 shared/net/interfaces/ITransportToClient.ts create mode 100644 shared/net/interfaces/ITransportToCore.ts create mode 100644 shared/net/interfaces/IUnixTime.ts create mode 100644 shared/net/lib/ConnectionToClient.ts create mode 100644 shared/net/lib/ConnectionToCore.ts create mode 100644 shared/net/lib/EmittingTransportToClient.ts create mode 100644 shared/net/lib/EmittingTransportToCore.ts create mode 100644 shared/net/lib/HttpTransportToClient.ts create mode 100644 shared/net/lib/PendingMessages.ts create mode 100644 shared/net/lib/TransportBridge.ts create mode 100644 shared/net/lib/WsTransportToClient.ts create mode 100644 shared/net/lib/WsTransportToCore.ts create mode 100644 shared/net/lib/WsUtils.ts create mode 100644 shared/net/package.json create mode 100644 shared/net/test/ConnectionToClient.test.ts create mode 100644 shared/net/test/ConnectionToCore.test.ts create mode 100644 shared/net/test/basic.test.ts diff --git a/shared/README.md b/shared/README.md index 7d36768be..9fdb63697 100644 --- a/shared/README.md +++ b/shared/README.md @@ -1,6 +1,15 @@ -# Ulixee Commons +# Ulixee Shared + This is an internal set of utilities used by the Ulixee and Unblocked projects. +## Commons + +Helper utilities + +## Net + +Typed Networking utilities + ## License [MIT](LICENSE) diff --git a/shared/config/index.ts b/shared/commons/config/index.ts similarity index 100% rename from shared/config/index.ts rename to shared/commons/config/index.ts diff --git a/shared/config/servers.ts b/shared/commons/config/servers.ts similarity index 100% rename from shared/config/servers.ts rename to shared/commons/config/servers.ts diff --git a/shared/interfaces/ILog.ts b/shared/commons/interfaces/ILog.ts similarity index 100% rename from shared/interfaces/ILog.ts rename to shared/commons/interfaces/ILog.ts diff --git a/shared/interfaces/IPendingWaitEvent.ts b/shared/commons/interfaces/IPendingWaitEvent.ts similarity index 100% rename from shared/interfaces/IPendingWaitEvent.ts rename to shared/commons/interfaces/IPendingWaitEvent.ts diff --git a/shared/interfaces/IRegisteredEventListener.ts b/shared/commons/interfaces/IRegisteredEventListener.ts similarity index 100% rename from shared/interfaces/IRegisteredEventListener.ts rename to shared/commons/interfaces/IRegisteredEventListener.ts diff --git a/shared/interfaces/IResolvablePromise.ts b/shared/commons/interfaces/IResolvablePromise.ts similarity index 100% rename from shared/interfaces/IResolvablePromise.ts rename to shared/commons/interfaces/IResolvablePromise.ts diff --git a/shared/interfaces/ISourceCodeLocation.ts b/shared/commons/interfaces/ISourceCodeLocation.ts similarity index 100% rename from shared/interfaces/ISourceCodeLocation.ts rename to shared/commons/interfaces/ISourceCodeLocation.ts diff --git a/shared/interfaces/ITypedEventEmitter.ts b/shared/commons/interfaces/ITypedEventEmitter.ts similarity index 100% rename from shared/interfaces/ITypedEventEmitter.ts rename to shared/commons/interfaces/ITypedEventEmitter.ts diff --git a/shared/interfaces/SameSiteContext.ts b/shared/commons/interfaces/SameSiteContext.ts similarity index 100% rename from shared/interfaces/SameSiteContext.ts rename to shared/commons/interfaces/SameSiteContext.ts diff --git a/shared/interfaces/TimeoutError.ts b/shared/commons/interfaces/TimeoutError.ts similarity index 100% rename from shared/interfaces/TimeoutError.ts rename to shared/commons/interfaces/TimeoutError.ts diff --git a/shared/lib/EventSubscriber.ts b/shared/commons/lib/EventSubscriber.ts similarity index 100% rename from shared/lib/EventSubscriber.ts rename to shared/commons/lib/EventSubscriber.ts diff --git a/shared/lib/IpcUtils.ts b/shared/commons/lib/IpcUtils.ts similarity index 100% rename from shared/lib/IpcUtils.ts rename to shared/commons/lib/IpcUtils.ts diff --git a/shared/lib/Logger.ts b/shared/commons/lib/Logger.ts similarity index 99% rename from shared/lib/Logger.ts rename to shared/commons/lib/Logger.ts index d999206c3..a8f2ddf99 100644 --- a/shared/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -298,6 +298,8 @@ function loadNamespaces(namespaces: string): void { registerNamespaceMapping((ns, active, skip) => { if (ns.includes('ubk:*') || ns.includes('ubk*')) { active.push(/agent\/.*/); + } else if (ns === 'ubk:mitm') { + active.push(/agent[/-]mitm.*/); } else if (ns === 'ubk') { active.push(/agent\/.*/); skip.push(/DevtoolsSessionLogger/, /agent[/-]mitm.*/); diff --git a/shared/lib/Queue.ts b/shared/commons/lib/Queue.ts similarity index 100% rename from shared/lib/Queue.ts rename to shared/commons/lib/Queue.ts diff --git a/shared/lib/Resolvable.ts b/shared/commons/lib/Resolvable.ts similarity index 100% rename from shared/lib/Resolvable.ts rename to shared/commons/lib/Resolvable.ts diff --git a/shared/lib/SessionClosedOrMissingError.ts b/shared/commons/lib/SessionClosedOrMissingError.ts similarity index 100% rename from shared/lib/SessionClosedOrMissingError.ts rename to shared/commons/lib/SessionClosedOrMissingError.ts diff --git a/shared/lib/ShutdownHandler.ts b/shared/commons/lib/ShutdownHandler.ts similarity index 100% rename from shared/lib/ShutdownHandler.ts rename to shared/commons/lib/ShutdownHandler.ts diff --git a/shared/lib/SourceLoader.ts b/shared/commons/lib/SourceLoader.ts similarity index 100% rename from shared/lib/SourceLoader.ts rename to shared/commons/lib/SourceLoader.ts diff --git a/shared/lib/SourceMapSupport.ts b/shared/commons/lib/SourceMapSupport.ts similarity index 100% rename from shared/lib/SourceMapSupport.ts rename to shared/commons/lib/SourceMapSupport.ts diff --git a/shared/lib/SqliteTable.ts b/shared/commons/lib/SqliteTable.ts similarity index 100% rename from shared/lib/SqliteTable.ts rename to shared/commons/lib/SqliteTable.ts diff --git a/shared/lib/Timer.ts b/shared/commons/lib/Timer.ts similarity index 100% rename from shared/lib/Timer.ts rename to shared/commons/lib/Timer.ts diff --git a/shared/lib/TypeSerializer.ts b/shared/commons/lib/TypeSerializer.ts similarity index 90% rename from shared/lib/TypeSerializer.ts rename to shared/commons/lib/TypeSerializer.ts index 83f80c715..44cfac31b 100644 --- a/shared/lib/TypeSerializer.ts +++ b/shared/commons/lib/TypeSerializer.ts @@ -59,22 +59,38 @@ export default class TypeSerializer { return object; } - public static stringify(object: any): string { - const final = TypeSerializer.replace(object); + public static stringify( + object: T, + options?: { ignoreProperties?: (keyof T)[]; sortKeys?: boolean }, + ): string { + const final = TypeSerializer.replace(object, options); return JSON.stringify(final); } - public static replace(object: any): object { + public static replace( + object: T, + options?: { ignoreProperties?: (keyof T)[]; sortKeys?: boolean }, + ): unknown { if (!object) return object; + const replaced = this.replacer(null, object); if (replaced !== object || (typeof replaced === 'object' && '__type' in replaced)) { return replaced; } + if (object && typeof object === Types.object) { - if (Array.isArray(object)) return object.map(x => this.replace(x)); - const response = {}; - for (const [key, value] of Object.entries(object)) { - response[key] = this.replace(value); + if (Array.isArray(object)) { + return object.map(x => this.replace(x)); + } + + const keys = Object.keys(object); + if (options?.sortKeys) keys.sort(); + const response: any = {}; + for (const key of keys) { + if (options?.ignoreProperties) { + if (options.ignoreProperties.includes(key as any)) continue; + } + response[key] = this.replace(object[key]); } return response; } diff --git a/shared/lib/eventUtils.ts b/shared/commons/lib/TypedEventEmitter.ts similarity index 98% rename from shared/lib/eventUtils.ts rename to shared/commons/lib/TypedEventEmitter.ts index 79a4d9085..c0b0087f4 100644 --- a/shared/lib/eventUtils.ts +++ b/shared/commons/lib/TypedEventEmitter.ts @@ -1,11 +1,11 @@ import { EventEmitter } from 'events'; import ITypedEventEmitter from '../interfaces/ITypedEventEmitter'; -import IRegisteredEventListener from '../interfaces/IRegisteredEventListener'; import { IBoundLog } from '../interfaces/ILog'; -import { createPromise } from './utils'; import IPendingWaitEvent, { CanceledPromiseError } from '../interfaces/IPendingWaitEvent'; +import { createPromise } from './utils'; +import IRegisteredEventListener from '../interfaces/IRegisteredEventListener'; -export class TypedEventEmitter extends EventEmitter implements ITypedEventEmitter { +export default class TypedEventEmitter extends EventEmitter implements ITypedEventEmitter { public storeEventsWithoutListeners = false; public EventTypes: T; diff --git a/shared/lib/VersionUtils.ts b/shared/commons/lib/VersionUtils.ts similarity index 100% rename from shared/lib/VersionUtils.ts rename to shared/commons/lib/VersionUtils.ts diff --git a/shared/lib/decodeBuffer.ts b/shared/commons/lib/decodeBuffer.ts similarity index 100% rename from shared/lib/decodeBuffer.ts rename to shared/commons/lib/decodeBuffer.ts diff --git a/shared/lib/dirUtils.ts b/shared/commons/lib/dirUtils.ts similarity index 89% rename from shared/lib/dirUtils.ts rename to shared/commons/lib/dirUtils.ts index ff0399c9d..3eac6705f 100644 --- a/shared/lib/dirUtils.ts +++ b/shared/commons/lib/dirUtils.ts @@ -19,6 +19,13 @@ export function getCacheDirectory(): string { throw new Error(`Unsupported platform: ${process.platform}`); } +const homeDirReplace = new RegExp(os.homedir(), 'g'); + +export function cleanHomeDir(str: string): string { + return str.replace(homeDirReplace, '~'); +} + + export function findProjectPathSync(startingDirectory: string): string { let last: string; let path = Path.resolve(startingDirectory); diff --git a/shared/lib/downloadFile.ts b/shared/commons/lib/downloadFile.ts similarity index 100% rename from shared/lib/downloadFile.ts rename to shared/commons/lib/downloadFile.ts diff --git a/shared/commons/lib/eventUtils.ts b/shared/commons/lib/eventUtils.ts new file mode 100644 index 000000000..ff83260e5 --- /dev/null +++ b/shared/commons/lib/eventUtils.ts @@ -0,0 +1,3 @@ +import TypedEventEmitter from './TypedEventEmitter'; + +export { TypedEventEmitter }; diff --git a/shared/lib/fileUtils.ts b/shared/commons/lib/fileUtils.ts similarity index 100% rename from shared/lib/fileUtils.ts rename to shared/commons/lib/fileUtils.ts diff --git a/shared/lib/getProxyForUrl.ts b/shared/commons/lib/getProxyForUrl.ts similarity index 100% rename from shared/lib/getProxyForUrl.ts rename to shared/commons/lib/getProxyForUrl.ts diff --git a/shared/commons/lib/hashUtils.ts b/shared/commons/lib/hashUtils.ts new file mode 100644 index 000000000..f72847f66 --- /dev/null +++ b/shared/commons/lib/hashUtils.ts @@ -0,0 +1,29 @@ +import { createHash } from 'crypto'; +import { bech32m } from 'bech32'; +import TypeSerializer from './TypeSerializer'; + +export function sha3(data: Buffer | string): Buffer { + return createHash('sha3-256').update(data).digest(); +} + +export function encodeHash(digest: Buffer, prefix: 'scr' | 'dbx'): string { + const words = bech32m.toWords(digest); + return bech32m.encode(prefix, words); +} + +export function sortedJsonStringify(obj: T | null, ignoreProperties: (keyof T)[] = []): string { + if (!obj) { + return '{}'; + } + if (Array.isArray(obj) && !obj.length) { + return '[]'; + } + return TypeSerializer.stringify(obj, { ignoreProperties, sortKeys: true }); +} + +export function hashObject(obj: T, ignoreProperties: (keyof T)[] = []): Buffer { + // sort keys for consistent hash + const json = sortedJsonStringify(obj, ignoreProperties); + + return createHash('sha3-256').update(Buffer.from(json)).digest(); +} diff --git a/shared/lib/utils.ts b/shared/commons/lib/utils.ts similarity index 100% rename from shared/lib/utils.ts rename to shared/commons/lib/utils.ts diff --git a/shared/commons/package.json b/shared/commons/package.json new file mode 100644 index 000000000..6b7cf68d2 --- /dev/null +++ b/shared/commons/package.json @@ -0,0 +1,16 @@ +{ + "name": "@ulixee/commons", + "version": "2.0.0-alpha.6", + "description": "Common utilities for Ulixee", + "license": "MIT", + "dependencies": { + "devtools-protocol": "^0.0.981744", + "https-proxy-agent": "^5.0.0", + "semver": "^7.3.7", + "source-map-js": "^1.0.1", + "bech32": "^2.0.0" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.5.0" + } +} diff --git a/shared/test/SourceLoader.test.ts b/shared/commons/test/SourceLoader.test.ts similarity index 100% rename from shared/test/SourceLoader.test.ts rename to shared/commons/test/SourceLoader.test.ts diff --git a/shared/test/SourceMapSupport.test.ts b/shared/commons/test/SourceMapSupport.test.ts similarity index 100% rename from shared/test/SourceMapSupport.test.ts rename to shared/commons/test/SourceMapSupport.test.ts diff --git a/shared/test/TypeSerializer.test.ts b/shared/commons/test/TypeSerializer.test.ts similarity index 100% rename from shared/test/TypeSerializer.test.ts rename to shared/commons/test/TypeSerializer.test.ts diff --git a/shared/test/utils.test.ts b/shared/commons/test/utils.test.ts similarity index 100% rename from shared/test/utils.test.ts rename to shared/commons/test/utils.test.ts diff --git a/shared/lerna.json b/shared/lerna.json new file mode 100644 index 000000000..771e5859d --- /dev/null +++ b/shared/lerna.json @@ -0,0 +1,5 @@ +{ + "version": "2.0.0-alpha.6", + "npmClient": "yarn", + "useWorkspaces": true +} diff --git a/shared/lib/Hasher.ts b/shared/lib/Hasher.ts deleted file mode 100644 index b985c9fe8..000000000 --- a/shared/lib/Hasher.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createHash } from 'crypto'; -import { bech32m } from 'bech32'; - -export function hash(data: Buffer, prefix: 'scr' | 'dbx'): string { - const digest = createHash('sha3-256').update(data).digest(); - const words = bech32m.toWords(digest); - return bech32m.encode(prefix, words); -} diff --git a/shared/net/README.md b/shared/net/README.md new file mode 100644 index 000000000..97052453b --- /dev/null +++ b/shared/net/README.md @@ -0,0 +1,7 @@ +# Ulixee Net + +Ulixee networking library with built-in JSON serialization that preserves more complex types. + +## License + +[MIT](LICENSE) diff --git a/shared/net/errors/DisconnectedError.ts b/shared/net/errors/DisconnectedError.ts new file mode 100644 index 000000000..5cfd57832 --- /dev/null +++ b/shared/net/errors/DisconnectedError.ts @@ -0,0 +1,11 @@ +import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; +import { registerSerializableErrorType } from '@ulixee/commons/lib/TypeSerializer'; + +export default class DisconnectedError extends CanceledPromiseError { + public code = 'DisconnectedError'; + constructor(readonly host: string) { + super(`This transport has been disconnected (host: ${host})`); + this.name = 'DisconnectedError'; + } +} +registerSerializableErrorType(DisconnectedError); diff --git a/shared/net/interfaces/IApiHandlers.ts b/shared/net/interfaces/IApiHandlers.ts new file mode 100644 index 000000000..d82fd8303 --- /dev/null +++ b/shared/net/interfaces/IApiHandlers.ts @@ -0,0 +1,18 @@ +type IAsyncFunc = (...args: any) => Promise | any; +type IPromiseType = T extends PromiseLike ? U : T; +type RestParameters any> = T extends (...args: infer P) => any ? P : []; + +type IApiHandlers = { + [api: string]: IAsyncFunc; +}; + +export default IApiHandlers; + +type IApi = { + args: RestParameters; + result: IPromiseType>; +}; + +export type IApiSpec = { + [key in keyof Handlers]: IApi; +}; diff --git a/shared/net/interfaces/IConnectionToClient.ts b/shared/net/interfaces/IConnectionToClient.ts new file mode 100644 index 000000000..3e3ffb331 --- /dev/null +++ b/shared/net/interfaces/IConnectionToClient.ts @@ -0,0 +1,17 @@ +import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; +import ICoreEventPayload from './ICoreEventPayload'; +import IApiHandlers from './IApiHandlers'; +import ITransportToClient from './ITransportToClient'; + +export default interface IConnectionToClient + extends ITypedEventEmitter { + transport: ITransportToClient; + disconnectPromise: Promise; + disconnect(error?: Error): Promise; + sendEvent(event: ICoreEventPayload): void; +} + +export interface IConnectionToClientEvents { + 'send-error': Error; + disconnected: Error | null; +} diff --git a/shared/net/interfaces/ICoreEventPayload.ts b/shared/net/interfaces/ICoreEventPayload.ts new file mode 100644 index 000000000..5a60cee7f --- /dev/null +++ b/shared/net/interfaces/ICoreEventPayload.ts @@ -0,0 +1,5 @@ +export default interface ICoreEventPayload { + eventType: T; + listenerId?: string; + data: Spec[T]; +} diff --git a/shared/net/interfaces/ICoreRequestPayload.ts b/shared/net/interfaces/ICoreRequestPayload.ts new file mode 100644 index 000000000..e1dd33af3 --- /dev/null +++ b/shared/net/interfaces/ICoreRequestPayload.ts @@ -0,0 +1,14 @@ +import UnixTime from './IUnixTime'; +import IApiHandlers, { IApiSpec } from './IApiHandlers'; + +export default interface ICoreRequestPayload< + Handlers extends IApiHandlers, + Api extends keyof Handlers, +> { + command: Api; + commandId?: number; + messageId: string; + startTime?: UnixTime; + sendTime: UnixTime; + args: IApiSpec[Api]['args']; +} diff --git a/shared/net/interfaces/ICoreResponsePayload.ts b/shared/net/interfaces/ICoreResponsePayload.ts new file mode 100644 index 000000000..fa5dbeb35 --- /dev/null +++ b/shared/net/interfaces/ICoreResponsePayload.ts @@ -0,0 +1,9 @@ +import IApiHandlers, { IApiSpec } from './IApiHandlers'; + +export default interface ICoreResponsePayload< + ApiHandlers extends IApiHandlers, + Api extends keyof IApiSpec, +> { + responseId: string; + data: IApiSpec[Api]['result']; +} diff --git a/shared/net/interfaces/ITransportToClient.ts b/shared/net/interfaces/ITransportToClient.ts new file mode 100644 index 000000000..81894f9bb --- /dev/null +++ b/shared/net/interfaces/ITransportToClient.ts @@ -0,0 +1,21 @@ +import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; +import IApiHandlers from './IApiHandlers'; +import ICoreRequestPayload from './ICoreRequestPayload'; +import ICoreResponsePayload from './ICoreResponsePayload'; +import ICoreEventPayload from './ICoreEventPayload'; + +export default interface ITransportToClient< + IClientApiHandlers extends IApiHandlers, + IEventSpec = any, + OutMessagePayload = + | ICoreResponsePayload + | ICoreEventPayload, +> extends ITypedEventEmitter> { + send(message: OutMessagePayload): Promise; + disconnect?(fatalError?: Error): Promise | void; +} + +export interface ITransportToClientEvents { + message: ICoreRequestPayload; + disconnected: Error | null; +} diff --git a/shared/net/interfaces/ITransportToCore.ts b/shared/net/interfaces/ITransportToCore.ts new file mode 100644 index 000000000..7f6fad79c --- /dev/null +++ b/shared/net/interfaces/ITransportToCore.ts @@ -0,0 +1,28 @@ +import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; +import ICoreRequestPayload from './ICoreRequestPayload'; +import ICoreResponsePayload from './ICoreResponsePayload'; +import ICoreEventPayload from './ICoreEventPayload'; +import IApiHandlers from './IApiHandlers'; + +export default interface ITransportToCore< + ApiHandlers extends IApiHandlers = any, + EventSpec = any, + RequestPayload = ICoreRequestPayload, + ResponsePayload = ICoreResponsePayload | ICoreEventPayload, +> extends ITypedEventEmitter> { + host: string; + isConnected: boolean; + connect?(): Promise; + disconnect?(): Promise; + send(message: RequestPayload): Promise; +} + +export interface ITransportToCoreEvents< + ApiHandlers extends IApiHandlers, + EventSpec = any, + ResponsePayload = ICoreResponsePayload | ICoreEventPayload, +> { + message: ResponsePayload; + disconnected: void; + connected: void; +} diff --git a/shared/net/interfaces/IUnixTime.ts b/shared/net/interfaces/IUnixTime.ts new file mode 100644 index 000000000..1b8340a00 --- /dev/null +++ b/shared/net/interfaces/IUnixTime.ts @@ -0,0 +1,3 @@ +type UnixTime = number; + +export default UnixTime; diff --git a/shared/net/lib/ConnectionToClient.ts b/shared/net/lib/ConnectionToClient.ts new file mode 100644 index 000000000..19cd70c71 --- /dev/null +++ b/shared/net/lib/ConnectionToClient.ts @@ -0,0 +1,78 @@ +import Log from '@ulixee/commons/lib/Logger'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; +import ICoreEventPayload from '../interfaces/ICoreEventPayload'; +import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; +import IApiHandlers from '../interfaces/IApiHandlers'; +import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; +import ITransportToClient from '../interfaces/ITransportToClient'; +import IConnectionToClient, { IConnectionToClientEvents } from '../interfaces/IConnectionToClient'; + +const { log } = Log(module); + +export default class ConnectionToClient + extends TypedEventEmitter + implements IConnectionToClient +{ + public disconnectPromise: Promise; + + private events = new EventSubscriber(); + constructor( + readonly transport: ITransportToClient, + readonly apiHandlers: IClientApiHandlers, + ) { + super(); + + this.events.on(transport, 'message', (message) => this.handleRequest(message)); + this.events.once(transport, 'disconnected', (error) => this.disconnect(error)); + } + + public disconnect(error?: Error): Promise { + if (this.disconnectPromise) return this.disconnectPromise; + + this.disconnectPromise = new Promise(async (resolve) => { + await this.transport.disconnect?.(); + this.events.close(); + this.transport.emit('disconnected'); + this.emit('disconnected', error); + resolve(); + }); + return this.disconnectPromise; + } + + public sendEvent(event: ICoreEventPayload): void { + this.sendMessage(event); + } + + protected async handleRequest( + apiRequest: ICoreRequestPayload, + ): Promise { + const { command, messageId } = apiRequest; + let args: any[] = apiRequest.args ?? []; + if (!Array.isArray(args)) args = [apiRequest.args]; + + let data: any; + try { + const handler = this.apiHandlers[command]; + if (!handler) throw new Error(`Unknown api requested: ${String(command)}`); + data = await handler(...args); + } catch (error) { + log.error('Error running api', { error, sessionId: args[0]?.heroSessionId }); + data = error; + } + + const response: ICoreResponsePayload = { + responseId: messageId, + data, + }; + this.sendMessage(response); + } + + private sendMessage( + message: ICoreResponsePayload | ICoreEventPayload, + ): void { + this.transport.send(message).catch((error) => { + this.emit('send-error', error); + }); + } +} diff --git a/shared/net/lib/ConnectionToCore.ts b/shared/net/lib/ConnectionToCore.ts new file mode 100644 index 000000000..57e2f77c8 --- /dev/null +++ b/shared/net/lib/ConnectionToCore.ts @@ -0,0 +1,239 @@ +import { bindFunctions } from '@ulixee/commons/lib/utils'; +import IResolvablePromise from '@ulixee/commons/interfaces/IResolvablePromise'; +import Log from '@ulixee/commons/lib/Logger'; +import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; +import SessionClosedOrMissingError from '@ulixee/commons/lib/SessionClosedOrMissingError'; +import Resolvable from '@ulixee/commons/lib/Resolvable'; +import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import ICoreEventPayload from '../interfaces/ICoreEventPayload'; +import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; +import ITransportToCore from '../interfaces/ITransportToCore'; +import PendingMessages from './PendingMessages'; +import DisconnectedError from '../errors/DisconnectedError'; +import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; +import IApiHandlers, { IApiSpec } from '../interfaces/IApiHandlers'; +import IUnixTime from '../interfaces/IUnixTime'; + +const { log } = Log(module); + +export interface IConnectionToCoreEvents { + disconnected: void; + connected: void; + event: ICoreEventPayload; +} +export default class ConnectionToCore< + ICoreApiHandlers extends IApiHandlers, + IEventSpec, +> extends TypedEventEmitter> { + public connectPromise: IResolvablePromise; + public disconnectPromise: Promise; + + public connectStartTime: IUnixTime; + public didAutoConnect = false; + + public disconnectStartTime: IUnixTime; + public disconnectError: Error; + public get isConnectedToTransport(): boolean { + return this.transport.isConnected && this.connectPromise?.isResolved; + } + + public hooks: { + afterConnectFn?: () => Promise; + beforeDisconnectFn?: () => Promise; + } = {}; + + protected connectMessageId: string; + protected disconnectMessageId: string; + + protected pendingMessages = new PendingMessages< + ICoreResponsePayload['data'] + >(); + + protected isConnectionTerminated: boolean; + protected events = new EventSubscriber(); + + private isSendingConnect = false; + private isSendingDisconnect = false; + + constructor(public transport: ITransportToCore) { + super(); + bindFunctions(this); + this.events.once(transport, 'disconnected', this.onConnectionTerminated.bind(this)); + this.events.on(transport, 'message', this.onMessage.bind(this)); + } + + public async connect(isAutoConnect = false): Promise { + if (!this.connectPromise) { + this.didAutoConnect = isAutoConnect; + this.connectStartTime = Date.now(); + this.connectPromise = new Resolvable(); + try { + const connectError = await this.transport.connect?.(); + if (connectError) throw connectError; + + if (this.hasActiveSessions() && this.disconnectPromise && !this.didAutoConnect) { + throw new DisconnectedError(this.transport.host); + } + + // can be resolved if canceled by a disconnect + if (!this.connectPromise.isResolved && this.hooks.afterConnectFn) { + this.isSendingConnect = true; + await this.hooks.afterConnectFn(); + this.isSendingConnect = false; + } + this.connectPromise.resolve(); + this.emit('connected'); + + this.transport.isConnected = true; + this.transport.emit('connected'); + } catch (err) { + if (this.didAutoConnect) { + this.connectPromise.resolve(err); + } else { + this.connectPromise.reject(err); + } + } + } + + return this.connectPromise.promise; + } + + public async disconnect(fatalError?: Error): Promise { + // user triggered disconnect sends a disconnect to Core + this.disconnectStartTime = Date.now(); + this.disconnectError = fatalError; + if (this.disconnectPromise) return this.disconnectPromise; + const resolvable = new Resolvable(); + this.disconnectPromise = resolvable.promise; + + try { + const logid = log.stats('ConnectionToCore.Disconnecting', { + host: this.transport.host, + sessionId: null, + }); + this.pendingMessages.cancel(new DisconnectedError(this.transport.host)); + + this.isSendingDisconnect = true; + await this.hooks.beforeDisconnectFn?.(); + this.isSendingDisconnect = false; + + await this.transport.disconnect?.(); + this.transport.isConnected = false; + this.transport.emit('disconnected'); + this.emit('disconnected'); + log.stats('ConnectionToCore.Disconnected', { + parentLogId: logid, + host: this.transport.host, + sessionId: null, + }); + } finally { + resolvable.resolve(); + } + return this.disconnectPromise; + } + + public async sendRequest( + payload: { + command: T; + args: IApiSpec[T]['args']; + commandId?: number; + startTime?: IUnixTime; + }, + timeoutMs?: number, + ): Promise['data']> { + const isConnect = this.isSendingConnect; + const isDisconnect = this.isSendingDisconnect; + if (!isConnect && !isDisconnect) { + const result = await this.connect(); + if (result) throw result; + } + + const { promise, id } = this.pendingMessages.create(timeoutMs, isConnect || isDisconnect); + if (isConnect) this.connectMessageId = id; + if (isDisconnect) this.disconnectMessageId = id; + + try { + const [result] = await Promise.all([ + promise, + this.transport.send({ + ...payload, + messageId: id, + sendTime: Date.now(), + } as ICoreRequestPayload), + ]); + return result; + } catch (error) { + this.pendingMessages.delete(id); + if (this.disconnectPromise && error instanceof CanceledPromiseError) { + return; + } + throw error; + } finally { + if (isConnect) this.connectMessageId = null; + if (isDisconnect) this.disconnectMessageId = null; + } + } + + public hasActiveSessions(): boolean { + return false; + } + + protected onMessage( + payload: ICoreResponsePayload | ICoreEventPayload, + ): void { + if ('responseId' in payload) { + this.onResponse(payload); + } else if ('listenerId' in payload || 'eventType' in payload) { + this.onEvent(payload); + } else { + throw new Error(`message could not be processed: ${JSON.stringify(payload)}`); + } + } + + protected onResponse(message: ICoreResponsePayload): void { + const id = message.responseId; + if (message.data instanceof Error) { + let responseError = message.data; + const isDisconnected = + this.disconnectPromise || + responseError.name === SessionClosedOrMissingError.name || + (responseError as any).isDisconnecting === true; + delete (responseError as any).isDisconnecting; + + if (isDisconnected) { + responseError = new DisconnectedError(this.transport.host); + } + this.pendingMessages.reject(id, responseError); + } else { + this.pendingMessages.resolve(id, message.data); + } + } + + protected onEvent(event: ICoreEventPayload): void { + this.emit('event', event); + } + + protected async onConnectionTerminated(): Promise { + if (this.isConnectionTerminated) return; + this.isConnectionTerminated = true; + this.emit('disconnected'); + + if (this.connectMessageId) { + this.onResponse({ + responseId: this.connectMessageId, + data: !this.didAutoConnect ? new DisconnectedError(this.transport.host) : null, + }); + } + if (this.disconnectMessageId) { + this.onResponse({ + responseId: this.disconnectMessageId, + data: null, + }); + } + this.pendingMessages.cancel(new DisconnectedError(this.transport.host)); + this.isSendingDisconnect = true; + await this.hooks.beforeDisconnectFn?.(); + this.isSendingDisconnect = false; + } +} diff --git a/shared/net/lib/EmittingTransportToClient.ts b/shared/net/lib/EmittingTransportToClient.ts new file mode 100644 index 000000000..82d7924e5 --- /dev/null +++ b/shared/net/lib/EmittingTransportToClient.ts @@ -0,0 +1,32 @@ +import '@ulixee/commons/lib/SourceMapSupport'; +import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import ITransportToClient, { ITransportToClientEvents } from '../interfaces/ITransportToClient'; +import IApiHandlers from '../interfaces/IApiHandlers'; +import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; +import ICoreEventPayload from '../interfaces/ICoreEventPayload'; + +export default class EmittingTransportToClient< + IClientApiSpec extends IApiHandlers, + IEventSpec = any, + > + extends TypedEventEmitter< + ITransportToClientEvents & { + outbound: ICoreResponsePayload | ICoreEventPayload; + } + > + implements + ITransportToClient, + ITypedEventEmitter< + ITransportToClientEvents & { + outbound: ICoreResponsePayload | ICoreEventPayload; + } + > +{ + send( + message: ICoreResponsePayload | ICoreEventPayload, + ): Promise { + this.emit('outbound', message); + return Promise.resolve(); + } +} diff --git a/shared/net/lib/EmittingTransportToCore.ts b/shared/net/lib/EmittingTransportToCore.ts new file mode 100644 index 000000000..37138c006 --- /dev/null +++ b/shared/net/lib/EmittingTransportToCore.ts @@ -0,0 +1,29 @@ +import '@ulixee/commons/lib/SourceMapSupport'; +import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import ITransportToCore, { ITransportToCoreEvents } from '../interfaces/ITransportToCore'; +import IApiHandlers from '../interfaces/IApiHandlers'; +import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; + +export default class EmittingTransportToCore + extends TypedEventEmitter< + ITransportToCoreEvents & { + outbound: ICoreRequestPayload; + } + > + implements + ITransportToCore, + ITypedEventEmitter< + ITransportToCoreEvents & { + outbound: ICoreRequestPayload; + } + > +{ + host = 'direct'; + isConnected = true; + + send(message: ICoreRequestPayload): Promise { + this.emit('outbound', message); + return Promise.resolve(); + } +} diff --git a/shared/net/lib/HttpTransportToClient.ts b/shared/net/lib/HttpTransportToClient.ts new file mode 100644 index 000000000..7deef4fce --- /dev/null +++ b/shared/net/lib/HttpTransportToClient.ts @@ -0,0 +1,59 @@ +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import { IncomingMessage, ServerResponse } from 'http'; +import { URL } from 'url'; +import '@ulixee/commons/lib/SourceMapSupport'; +import * as QueryString from 'querystring'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import ITransportToClient, { ITransportToClientEvents } from '../interfaces/ITransportToClient'; +import IApiHandlers from '../interfaces/IApiHandlers'; + +export default class HttpTransportToClient + extends TypedEventEmitter> + implements ITransportToClient +{ + constructor(private request: IncomingMessage, private response: ServerResponse) { + super(); + } + + public send(message: any): Promise { + const res = this.response; + + try { + res.writeHead(200, { + 'Content-Type': 'text/json', + }); + res.end(TypeSerializer.stringify(message)); + } catch (err) { + res.writeHead(500); + res.end(err.toString()); + } + this.emit('disconnected'); + return Promise.resolve(); + } + + public async readRequest(): Promise { + const req = this.request; + const url = new URL(req.url, 'http://localhost/'); + + const body: Buffer[] = []; + for await (const chunk of req) { + body.push(chunk); + } + let args: any; + if (body.length) { + const bodyText = Buffer.concat(body).toString(); + if (req.headers['content-type'] === 'text/json') { + args = TypeSerializer.parse(bodyText); + } else { + args = QueryString.parse(bodyText); + } + } + args ??= {}; + const queryParams = Object.fromEntries(url.searchParams.entries()); + Object.assign(args, queryParams); + + const command = url.pathname.replace(/\//g, '') as any; + + this.emit('message', { args, command } as any); + } +} diff --git a/shared/net/lib/PendingMessages.ts b/shared/net/lib/PendingMessages.ts new file mode 100644 index 000000000..318589143 --- /dev/null +++ b/shared/net/lib/PendingMessages.ts @@ -0,0 +1,56 @@ +import IResolvablePromise from '@ulixee/commons/interfaces/IResolvablePromise'; +import { createPromise } from '@ulixee/commons/lib/utils'; +import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; + +export default class PendingMessages { + private lastId = 0; + private readonly pendingRequestsById = new Map>(); + private dontCancelIds = new Set(); + + constructor(private marker: string = `\n${'------CONNECTION'.padEnd(50, '-')}\n`) {} + + public cancel(error: CanceledPromiseError): void { + for (const id of this.pendingRequestsById.keys()) { + if (this.dontCancelIds.has(id)) { + continue; + } + this.reject(id, error); + } + } + + public resolve(id: string, data: IPayload): void { + this.pendingRequestsById.get(id)?.resolve(data); + this.pendingRequestsById.delete(id); + } + + public reject(id: string, error: Error): void { + const entry = this.pendingRequestsById.get(id); + if (!entry) return; + + this.pendingRequestsById.delete(id); + + if (!error.stack.includes(this.marker)) { + error.stack += `${this.marker}${entry.stack}`; + } + entry.reject(error); + } + + public delete(id: string): void { + this.pendingRequestsById.get(id)?.resolve(); + this.pendingRequestsById.delete(id); + } + + public create( + timeoutMs: number, + dontCancelId = false, + ): { id: string; promise: Promise } { + const resolvablePromise = createPromise(timeoutMs); + this.lastId += 1; + const id = this.lastId.toString(); + if (dontCancelId) { + this.dontCancelIds.add(id); + } + this.pendingRequestsById.set(id, resolvablePromise); + return { id, promise: resolvablePromise.promise }; + } +} diff --git a/shared/net/lib/TransportBridge.ts b/shared/net/lib/TransportBridge.ts new file mode 100644 index 000000000..43c4c77ee --- /dev/null +++ b/shared/net/lib/TransportBridge.ts @@ -0,0 +1,26 @@ +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; +import EmittingTransportToCore from './EmittingTransportToCore'; +import EmittingTransportToClient from './EmittingTransportToClient'; +import IApiHandlers from '../interfaces/IApiHandlers'; + +export default class TransportBridge { + public transportToClient = new EmittingTransportToClient(); + public transportToCore = new EmittingTransportToCore(); + + constructor(public shouldSerialize = false, private serializationMarker: string = 'DIRECT') { + this.transportToClient.on('outbound', (msg) => this.sendToTransport(msg, this.transportToCore)); + this.transportToCore.on('outbound', (msg) => this.sendToTransport(msg, this.transportToClient)); + } + + private async sendToTransport( + message: any, + transport: ITypedEventEmitter<{ message: any }>, + ): Promise { + await new Promise(process.nextTick); + if (this.shouldSerialize) { + message = TypeSerializer.parse(TypeSerializer.stringify(message), this.serializationMarker); + } + transport.emit('message', message); + } +} diff --git a/shared/net/lib/WsTransportToClient.ts b/shared/net/lib/WsTransportToClient.ts new file mode 100644 index 000000000..4a79c7962 --- /dev/null +++ b/shared/net/lib/WsTransportToClient.ts @@ -0,0 +1,47 @@ +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import * as WebSocket from 'ws'; +import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; +import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import ITransportToClient, { ITransportToClientEvents } from '../interfaces/ITransportToClient'; +import { sendWsCloseUnexpectedError, wsSend } from './WsUtils'; +import IApiHandlers from '../interfaces/IApiHandlers'; + +export default class WsTransportToClient + extends TypedEventEmitter> + implements ITransportToClient +{ + private events = new EventSubscriber(); + constructor(private webSocket: WebSocket) { + super(); + this.onMessage = this.onMessage.bind(this); + this.events.on(webSocket, 'message', this.onMessage); + this.events.on(webSocket, 'close', this.onClose); + this.events.on(webSocket, 'error', this.onError); + } + + public async send(payload: any): Promise { + const message = TypeSerializer.stringify(payload); + try { + await wsSend(this.webSocket, message); + } catch (error) { + if (!(error instanceof CanceledPromiseError)) { + sendWsCloseUnexpectedError(this.webSocket, error.message); + } + throw error; + } + } + + private onClose(): void { + this.emit('disconnected', null); + } + + private onError(error: Error): void { + this.emit('disconnected', error); + } + + private onMessage(message: WebSocket.Data): void { + const payload = TypeSerializer.parse(message.toString(), 'CLIENT'); + this.emit('message', payload); + } +} diff --git a/shared/net/lib/WsTransportToCore.ts b/shared/net/lib/WsTransportToCore.ts new file mode 100644 index 000000000..40272bddc --- /dev/null +++ b/shared/net/lib/WsTransportToCore.ts @@ -0,0 +1,127 @@ +import IResolvablePromise from '@ulixee/commons/interfaces/IResolvablePromise'; +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import * as WebSocket from 'ws'; +import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; +import Resolvable from '@ulixee/commons/lib/Resolvable'; +import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import DisconnectedError from '../errors/DisconnectedError'; +import { isWsOpen, sendWsCloseUnexpectedError, wsSend } from './WsUtils'; +import ITransportToCore, { ITransportToCoreEvents } from '../interfaces/ITransportToCore'; +import IApiHandlers from '../interfaces/IApiHandlers'; +import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; +import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; +import ICoreEventPayload from '../interfaces/ICoreEventPayload'; + +export default class WsTransportToCore< + ApiHandlers extends IApiHandlers = any, + EventSpec = any, + RequestPayload = ICoreRequestPayload, + ResponsePayload = ICoreResponsePayload | ICoreEventPayload, + > + extends TypedEventEmitter> + implements ITransportToCore +{ + public host: string; + + public isConnected = false; + public isDisconnecting = false; + + private connectPromise: IResolvablePromise; + private webSocket: WebSocket; + private events = new EventSubscriber(); + private readonly hostPromise: Promise; + + constructor(host: string | Promise) { + super(); + if (typeof host === 'string') { + this.setHost(host); + } + this.onMessage = this.onMessage.bind(this); + this.disconnect = this.disconnect.bind(this); + this.onConnectError = this.onConnectError.bind(this); + this.setHost = this.setHost.bind(this); + this.hostPromise = Promise.resolve(host).then(this.setHost); + } + + public async send(payload: RequestPayload): Promise { + await this.connect(); + + const message = TypeSerializer.stringify(payload); + try { + await wsSend(this.webSocket, message); + } catch (error) { + const { code } = error as any; + if (code === 'EPIPE' && this.isDisconnecting) { + throw new DisconnectedError(this.host); + } + if (!(error instanceof CanceledPromiseError)) { + sendWsCloseUnexpectedError(this.webSocket, error.message); + } + throw error; + } + } + + public disconnect(): Promise { + if (this.isDisconnecting) return; + this.isDisconnecting = true; + this.emit('disconnected'); + this.isConnected = false; + this.events.close(); + const webSocket = this.webSocket; + this.webSocket = null; + if (isWsOpen(webSocket)) { + try { + webSocket.terminate(); + } catch (_) { + // ignore errors terminating + } + } + return Promise.resolve(); + } + + public async connect(): Promise { + if (!this.connectPromise) { + this.connectPromise = new Resolvable(); + + await this.hostPromise; + const webSocket = new WebSocket(this.host); + this.events.group( + 'preConnect', + this.events.once(webSocket, 'close', this.onConnectError), + this.events.once(webSocket, 'error', this.onConnectError), + ); + this.events.once(webSocket, 'open', () => { + this.events.endGroup('preConnect'); + this.connectPromise.resolve(); + }); + + this.webSocket = webSocket; + this.events.once(webSocket, 'close', this.disconnect); + this.events.once(webSocket, 'error', this.disconnect); + this.events.on(webSocket, 'message', this.onMessage); + } + const connectOrError = await this.connectPromise; + if (connectOrError) throw connectOrError; + this.isConnected = true; + this.emit('connected'); + } + + private onMessage(message: WebSocket.Data): void { + const payload = TypeSerializer.parse(message.toString(), 'REMOTE CORE'); + this.emit('message', payload); + } + + private onConnectError(error: Error): void { + if (error instanceof Error) this.connectPromise.resolve(error); + else this.connectPromise.resolve(new Error(`Error connecting to Websocket host -> ${error}`)); + } + + private setHost(host: string): void { + if (!host.includes('://')) { + this.host = `ws://${host}`; + } else { + this.host = host; + } + } +} diff --git a/shared/net/lib/WsUtils.ts b/shared/net/lib/WsUtils.ts new file mode 100644 index 000000000..c6e05812b --- /dev/null +++ b/shared/net/lib/WsUtils.ts @@ -0,0 +1,29 @@ +import * as WebSocket from 'ws'; +import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; + +const CLOSE_UNEXPECTED_ERROR = 1011; + +export function isWsOpen(ws: WebSocket): boolean { + if (!ws) return false; + return ws.readyState === WebSocket.OPEN; +} + +export async function wsSend(ws: WebSocket, json: string): Promise { + // give it a second to breath + await new Promise(process.nextTick); + if (!isWsOpen(ws)) { + throw new CanceledPromiseError('Websocket was not open'); + } + await new Promise((resolve, reject) => { + ws.send(json, error => { + if (error) reject(error); + else resolve(); + }); + }); +} + +export function sendWsCloseUnexpectedError(ws: WebSocket, message: string): void { + if (isWsOpen(ws)) { + ws.close(CLOSE_UNEXPECTED_ERROR, JSON.stringify({ message })); + } +} diff --git a/shared/net/package.json b/shared/net/package.json new file mode 100644 index 000000000..12fc03101 --- /dev/null +++ b/shared/net/package.json @@ -0,0 +1,13 @@ +{ + "name": "@ulixee/net", + "version": "2.0.0-alpha.6", + "description": "Common networking for the Ulixee projects", + "license": "MIT", + "dependencies": { + "@ulixee/commons": "2.0.0-alpha.6", + "ws": "^7.4.6" + }, + "devDependencies": { + "@types/ws": "^7.4.7" + } +} diff --git a/shared/net/test/ConnectionToClient.test.ts b/shared/net/test/ConnectionToClient.test.ts new file mode 100644 index 000000000..3bf578258 --- /dev/null +++ b/shared/net/test/ConnectionToClient.test.ts @@ -0,0 +1,27 @@ +import EmittingTransportToClient from '../lib/EmittingTransportToClient'; +import ConnectionToClient from '../lib/ConnectionToClient'; +import IApiHandlers from '../interfaces/IApiHandlers'; +import ITransportToClient from '../interfaces/ITransportToClient'; + +test('should route messages from client to the right API', () => { + const apis = { 'Api.test': jest.fn() }; + const clientTransport = new EmittingTransportToClient(); + const connection = new ConnectionToClient(clientTransport, apis); + + connection.transport.emit('message', { + command: 'Api.test', + args: [], + messageId: '1', + sendTime: Date.now(), + }); + expect(apis['Api.test']).toHaveBeenCalledTimes(1); +}); + +test('should call disconnect once on a connection', async () => { + const clientTransport: ITransportToClient = new EmittingTransportToClient(); + const connection = new ConnectionToClient(clientTransport, {}); + clientTransport.disconnect = jest.fn(); + + await connection.disconnect(); + expect(clientTransport.disconnect).toHaveBeenCalledTimes(1); +}); diff --git a/shared/net/test/ConnectionToCore.test.ts b/shared/net/test/ConnectionToCore.test.ts new file mode 100644 index 000000000..6f4156aa6 --- /dev/null +++ b/shared/net/test/ConnectionToCore.test.ts @@ -0,0 +1,52 @@ +import EmittingTransportToCore from '../lib/EmittingTransportToCore'; +import ConnectionToCore from '../lib/ConnectionToCore'; +import TransportBridge from '../lib/TransportBridge'; +import ConnectionToClient from '../lib/ConnectionToClient'; + +test('should call connect callbacks a single time', async () => { + const coreTransport = new EmittingTransportToCore(); + const connection = new ConnectionToCore(coreTransport); + connection.hooks.afterConnectFn = jest.fn(); + + await Promise.all([connection.connect(), connection.connect()]); + expect(connection.hooks.afterConnectFn).toHaveBeenCalledTimes(1); +}); + +test('should be able to wait for a response to a message', async () => { + const bridge = new TransportBridge(); + const connectionToCore = new ConnectionToCore(bridge.transportToCore); + new ConnectionToClient(bridge.transportToClient, { + test () { + return 'called'; + }, + }); + + const response = await connectionToCore.sendRequest({ command: 'test', args: [] }); + expect(response).toBe('called'); +}); + +test('should cancel connect messages if a connection closes before connecting', async () => { + const bridge = new TransportBridge(); + const connectionToCore = new ConnectionToCore(bridge.transportToCore); + + let connectResult = 1; + connectionToCore.hooks.afterConnectFn = async function () { + try { + connectResult = await connectionToCore.sendRequest({ command: 'test', args: [] }); + } catch (err) { + connectResult = err; + throw err; + } + }; + const connectPromise = connectionToCore.connect(); + await new Promise(setImmediate); + // @ts-expect-error + expect(connectionToCore.connectMessageId).toBeTruthy(); + connectionToCore.transport.isConnected = false; + connectionToCore.transport.emit('disconnected'); + await expect(connectionToCore.connectPromise).rejects.toThrow('disconnected'); + // @ts-expect-error + expect(connectionToCore.connectMessageId).toBeFalsy(); + expect(connectResult?.toString()).toMatch('disconnected'); + await expect(connectPromise).rejects.toThrow(); +}); diff --git a/shared/net/test/basic.test.ts b/shared/net/test/basic.test.ts new file mode 100644 index 000000000..fc03ca5cf --- /dev/null +++ b/shared/net/test/basic.test.ts @@ -0,0 +1,57 @@ +import { AddressInfo, Server } from 'ws'; +import TransportBridge from '../lib/TransportBridge'; +import ConnectionToClient from '../lib/ConnectionToClient'; +import ConnectionToCore from '../lib/ConnectionToCore'; +import WsTransportToClient from '../lib/WsTransportToClient'; +import WsTransportToCore from '../lib/WsTransportToCore'; + +const apiSpy = jest.fn(); +const apiSpec = { + api(arg1: string, arg2: { test: boolean }) { + apiSpy(); + return { arg1, arg2, ok: new Date() }; + }, +}; + +beforeEach(() => { + apiSpy.mockReset(); +}); + +test('it can transport over a direct connection (bridge)', async () => { + const bridge = new TransportBridge(); + new ConnectionToClient(bridge.transportToClient, apiSpec); + const connectionToCore = new ConnectionToCore(bridge.transportToCore); + await expect( + connectionToCore.sendRequest({ command: 'api', args: ['1', { test: true }] }), + ).resolves.toEqual({ + arg1: '1', + arg2: { test: true }, + ok: expect.any(Date), + }); + expect(apiSpy).toHaveBeenCalledTimes(1); +}); + +test('it can transport over websockets', async () => { + const server = new Server({ port: 0 }); + try { + server.on('connection', (ws) => { + const transport = new WsTransportToClient(ws); + new ConnectionToClient(transport, apiSpec); + }); + const host = (await server.address()) as AddressInfo; + + const wsTransportToCore = new WsTransportToCore(`ws://localhost:${host.port}`); + + const connectionToCore = new ConnectionToCore(wsTransportToCore); + await expect( + connectionToCore.sendRequest({ command: 'api', args: ['1', { test: 2 }] }), + ).resolves.toEqual({ + arg1: '1', + arg2: { test: 2 }, + ok: expect.any(Date), + }); + expect(apiSpy).toHaveBeenCalledTimes(1); + } finally { + server.close(); + } +}); diff --git a/shared/package.build.json b/shared/package.build.json index 6ae64c052..d81643756 100644 --- a/shared/package.build.json +++ b/shared/package.build.json @@ -1,3 +1,11 @@ { - "devDependencies": {} + "scripts": { + "test:build": "cross-env NODE_ENV=test jest" + }, + "devDependencies": { + "jest": "^28.1.0", + "jest-environment-node": "^28.1.0", + "jest-summary-reporter": "^0.0.2", + "cross-env": "^7.0.3" + } } diff --git a/shared/package.json b/shared/package.json index 540892535..ade99ba7c 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,26 +1,25 @@ { - "name": "@ulixee/commons", + "name": "@ulixee/shared-monorepo", + "private": true, "version": "2.0.0-alpha.6", - "description": "Common utilities for Ulixee", + "description": "Shared Ulixee and Unblocked projects", "license": "MIT", "scripts": { "prepare": "husky install", - "build": "pwd && yarn tsc && ulx-repo-after-build && cd ./build && yarn install -focus", + "build": "yarn && yarn tsc && cd build && yarn", "build:dist": "shx rm -rf build-dist && tsc -b tsconfig.dist.json && ulx-repo-after-build --dist", - "tsc": "tsc -b -i tsconfig.json", - "watch": "tsc -b -i -w tsconfig.json", - "test": "cross-env NODE_ENV=test jest", - "lint": "eslint --cache ./" - }, - "dependencies": { - "devtools-protocol": "^0.0.981744", - "https-proxy-agent": "^5.0.0", - "semver": "^7.3.7", - "source-map-js": "^1.0.1", - "bech32": "^2.0.0" + "copy:dist": "ulx-repo-after-build --dist", + "copy:build": "ulx-repo-after-build", + "tsc": "tsc -b -i tsconfig.json && ulx-repo-after-build", + "watch": "tsc -b -w tsconfig.json", + "clean": "tsc -b --clean tsconfig.json", + "test": "yarn copy:build && yarn test:build", + "test:build": "cd ./build && cross-env NODE_ENV=test jest", + "lint": "eslint --cache ./", + "version": "ulx-repo-version-check fix", + "version:bump": "ulx-repo-version-bump" }, "devDependencies": { - "@types/better-sqlite3": "^7.5.0", "@commitlint/cli": "^12.0.1", "@commitlint/config-conventional": "^12.0.1", "@types/node": "^14.18.18", @@ -30,6 +29,7 @@ "jest": "^28.1.0", "jest-environment-node": "^28.1.0", "jest-summary-reporter": "^0.0.2", + "lerna": "^4.0.0", "husky": "^7.0.1", "lint-staged": "^10.5.2", "shx": "^0.3.3", @@ -42,5 +42,11 @@ "*.json": [ "prettier --write" ] + }, + "workspaces": { + "packages": [ + "commons", + "net" + ] } } diff --git a/shared/tsconfig.json b/shared/tsconfig.json index 07b6df79f..c77928b76 100644 --- a/shared/tsconfig.json +++ b/shared/tsconfig.json @@ -11,7 +11,6 @@ "build-dist", "node_modules", "**/node_modules", - "docs", "**/*.d.ts" ] } diff --git a/shared/yarn.lock b/shared/yarn.lock index 4d9992a6a..3c48c7bbd 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -531,6 +531,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + "@humanwhocodes/config-array@^0.9.2": version "0.9.5" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" @@ -545,6 +550,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@hutson/parse-repository-url@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" + integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -794,6 +804,677 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@lerna/add@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" + integrity sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng== + dependencies: + "@lerna/bootstrap" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/npm-conf" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + npm-package-arg "^8.1.0" + p-map "^4.0.0" + pacote "^11.2.6" + semver "^7.3.4" + +"@lerna/bootstrap@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-4.0.0.tgz#5f5c5e2c6cfc8fcec50cb2fbe569a8c607101891" + integrity sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/has-npm-version" "4.0.0" + "@lerna/npm-install" "4.0.0" + "@lerna/package-graph" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/rimraf-dir" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/symlink-binary" "4.0.0" + "@lerna/symlink-dependencies" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + get-port "^5.1.1" + multimatch "^5.0.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + p-map "^4.0.0" + p-map-series "^2.1.0" + p-waterfall "^2.1.1" + read-package-tree "^5.3.1" + semver "^7.3.4" + +"@lerna/changed@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-4.0.0.tgz#b9fc76cea39b9292a6cd263f03eb57af85c9270b" + integrity sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ== + dependencies: + "@lerna/collect-updates" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/listable" "4.0.0" + "@lerna/output" "4.0.0" + +"@lerna/check-working-tree@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-4.0.0.tgz#257e36a602c00142e76082a19358e3e1ae8dbd58" + integrity sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q== + dependencies: + "@lerna/collect-uncommitted" "4.0.0" + "@lerna/describe-ref" "4.0.0" + "@lerna/validation-error" "4.0.0" + +"@lerna/child-process@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-4.0.0.tgz#341b96a57dffbd9705646d316e231df6fa4df6e1" + integrity sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q== + dependencies: + chalk "^4.1.0" + execa "^5.0.0" + strong-log-transformer "^2.1.0" + +"@lerna/clean@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-4.0.0.tgz#8f778b6f2617aa2a936a6b5e085ae62498e57dc5" + integrity sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/rimraf-dir" "4.0.0" + p-map "^4.0.0" + p-map-series "^2.1.0" + p-waterfall "^2.1.1" + +"@lerna/cli@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-4.0.0.tgz#8eabd334558836c1664df23f19acb95e98b5bbf3" + integrity sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA== + dependencies: + "@lerna/global-options" "4.0.0" + dedent "^0.7.0" + npmlog "^4.1.2" + yargs "^16.2.0" + +"@lerna/collect-uncommitted@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-4.0.0.tgz#855cd64612969371cfc2453b90593053ff1ba779" + integrity sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g== + dependencies: + "@lerna/child-process" "4.0.0" + chalk "^4.1.0" + npmlog "^4.1.2" + +"@lerna/collect-updates@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-4.0.0.tgz#8e208b1bafd98a372ff1177f7a5e288f6bea8041" + integrity sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/describe-ref" "4.0.0" + minimatch "^3.0.4" + npmlog "^4.1.2" + slash "^3.0.0" + +"@lerna/command@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/command/-/command-4.0.0.tgz#991c7971df8f5bf6ae6e42c808869a55361c1b98" + integrity sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/package-graph" "4.0.0" + "@lerna/project" "4.0.0" + "@lerna/validation-error" "4.0.0" + "@lerna/write-log-file" "4.0.0" + clone-deep "^4.0.1" + dedent "^0.7.0" + execa "^5.0.0" + is-ci "^2.0.0" + npmlog "^4.1.2" + +"@lerna/conventional-commits@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-4.0.0.tgz#660fb2c7b718cb942ead70110df61f18c6f99750" + integrity sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw== + dependencies: + "@lerna/validation-error" "4.0.0" + conventional-changelog-angular "^5.0.12" + conventional-changelog-core "^4.2.2" + conventional-recommended-bump "^6.1.0" + fs-extra "^9.1.0" + get-stream "^6.0.0" + lodash.template "^4.5.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + pify "^5.0.0" + semver "^7.3.4" + +"@lerna/create-symlink@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-4.0.0.tgz#8c5317ce5ae89f67825443bd7651bf4121786228" + integrity sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig== + dependencies: + cmd-shim "^4.1.0" + fs-extra "^9.1.0" + npmlog "^4.1.2" + +"@lerna/create@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-4.0.0.tgz#b6947e9b5dfb6530321952998948c3e63d64d730" + integrity sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/npm-conf" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + fs-extra "^9.1.0" + globby "^11.0.2" + init-package-json "^2.0.2" + npm-package-arg "^8.1.0" + p-reduce "^2.1.0" + pacote "^11.2.6" + pify "^5.0.0" + semver "^7.3.4" + slash "^3.0.0" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^3.0.0" + whatwg-url "^8.4.0" + yargs-parser "20.2.4" + +"@lerna/describe-ref@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-4.0.0.tgz#53c53b4ea65fdceffa072a62bfebe6772c45d9ec" + integrity sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ== + dependencies: + "@lerna/child-process" "4.0.0" + npmlog "^4.1.2" + +"@lerna/diff@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-4.0.0.tgz#6d3071817aaa4205a07bf77cfc6e932796d48b92" + integrity sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/validation-error" "4.0.0" + npmlog "^4.1.2" + +"@lerna/exec@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-4.0.0.tgz#eb6cb95cb92d42590e9e2d628fcaf4719d4a8be6" + integrity sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/profiler" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/validation-error" "4.0.0" + p-map "^4.0.0" + +"@lerna/filter-options@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-4.0.0.tgz#ac94cc515d7fa3b47e2f7d74deddeabb1de5e9e6" + integrity sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw== + dependencies: + "@lerna/collect-updates" "4.0.0" + "@lerna/filter-packages" "4.0.0" + dedent "^0.7.0" + npmlog "^4.1.2" + +"@lerna/filter-packages@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-4.0.0.tgz#b1f70d70e1de9cdd36a4e50caa0ac501f8d012f2" + integrity sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA== + dependencies: + "@lerna/validation-error" "4.0.0" + multimatch "^5.0.0" + npmlog "^4.1.2" + +"@lerna/get-npm-exec-opts@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-4.0.0.tgz#dc955be94a4ae75c374ef9bce91320887d34608f" + integrity sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ== + dependencies: + npmlog "^4.1.2" + +"@lerna/get-packed@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-4.0.0.tgz#0989d61624ac1f97e393bdad2137c49cd7a37823" + integrity sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w== + dependencies: + fs-extra "^9.1.0" + ssri "^8.0.1" + tar "^6.1.0" + +"@lerna/github-client@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-4.0.0.tgz#2ced67721363ef70f8e12ffafce4410918f4a8a4" + integrity sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw== + dependencies: + "@lerna/child-process" "4.0.0" + "@octokit/plugin-enterprise-rest" "^6.0.1" + "@octokit/rest" "^18.1.0" + git-url-parse "^11.4.4" + npmlog "^4.1.2" + +"@lerna/gitlab-client@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-4.0.0.tgz#00dad73379c7b38951d4b4ded043504c14e2b67d" + integrity sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA== + dependencies: + node-fetch "^2.6.1" + npmlog "^4.1.2" + whatwg-url "^8.4.0" + +"@lerna/global-options@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-4.0.0.tgz#c7d8b0de6a01d8a845e2621ea89e7f60f18c6a5f" + integrity sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ== + +"@lerna/has-npm-version@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-4.0.0.tgz#d3fc3292c545eb28bd493b36e6237cf0279f631c" + integrity sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg== + dependencies: + "@lerna/child-process" "4.0.0" + semver "^7.3.4" + +"@lerna/import@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/import/-/import-4.0.0.tgz#bde656c4a451fa87ae41733ff8a8da60547c5465" + integrity sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + fs-extra "^9.1.0" + p-map-series "^2.1.0" + +"@lerna/info@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/info/-/info-4.0.0.tgz#b9fb0e479d60efe1623603958a831a88b1d7f1fc" + integrity sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/output" "4.0.0" + envinfo "^7.7.4" + +"@lerna/init@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/init/-/init-4.0.0.tgz#dadff67e6dfb981e8ccbe0e6a310e837962f6c7a" + integrity sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + fs-extra "^9.1.0" + p-map "^4.0.0" + write-json-file "^4.3.0" + +"@lerna/link@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/link/-/link-4.0.0.tgz#c3a38aabd44279d714e90f2451e31b63f0fb65ba" + integrity sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/package-graph" "4.0.0" + "@lerna/symlink-dependencies" "4.0.0" + p-map "^4.0.0" + slash "^3.0.0" + +"@lerna/list@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/list/-/list-4.0.0.tgz#24b4e6995bd73f81c556793fe502b847efd9d1d7" + integrity sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/listable" "4.0.0" + "@lerna/output" "4.0.0" + +"@lerna/listable@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-4.0.0.tgz#d00d6cb4809b403f2b0374fc521a78e318b01214" + integrity sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ== + dependencies: + "@lerna/query-graph" "4.0.0" + chalk "^4.1.0" + columnify "^1.5.4" + +"@lerna/log-packed@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-4.0.0.tgz#95168fe2e26ac6a71e42f4be857519b77e57a09f" + integrity sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ== + dependencies: + byte-size "^7.0.0" + columnify "^1.5.4" + has-unicode "^2.0.1" + npmlog "^4.1.2" + +"@lerna/npm-conf@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-4.0.0.tgz#b259fd1e1cee2bf5402b236e770140ff9ade7fd2" + integrity sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw== + dependencies: + config-chain "^1.1.12" + pify "^5.0.0" + +"@lerna/npm-dist-tag@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-4.0.0.tgz#d1e99b4eccd3414142f0548ad331bf2d53f3257a" + integrity sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw== + dependencies: + "@lerna/otplease" "4.0.0" + npm-package-arg "^8.1.0" + npm-registry-fetch "^9.0.0" + npmlog "^4.1.2" + +"@lerna/npm-install@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-4.0.0.tgz#31180be3ab3b7d1818a1a0c206aec156b7094c78" + integrity sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/get-npm-exec-opts" "4.0.0" + fs-extra "^9.1.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + signal-exit "^3.0.3" + write-pkg "^4.0.0" + +"@lerna/npm-publish@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-4.0.0.tgz#84eb62e876fe949ae1fd62c60804423dbc2c4472" + integrity sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w== + dependencies: + "@lerna/otplease" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + fs-extra "^9.1.0" + libnpmpublish "^4.0.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + pify "^5.0.0" + read-package-json "^3.0.0" + +"@lerna/npm-run-script@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-4.0.0.tgz#dfebf4f4601442e7c0b5214f9fb0d96c9350743b" + integrity sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/get-npm-exec-opts" "4.0.0" + npmlog "^4.1.2" + +"@lerna/otplease@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-4.0.0.tgz#84972eb43448f8a1077435ba1c5e59233b725850" + integrity sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw== + dependencies: + "@lerna/prompt" "4.0.0" + +"@lerna/output@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/output/-/output-4.0.0.tgz#b1d72215c0e35483e4f3e9994debc82c621851f2" + integrity sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w== + dependencies: + npmlog "^4.1.2" + +"@lerna/pack-directory@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-4.0.0.tgz#8b617db95d20792f043aaaa13a9ccc0e04cb4c74" + integrity sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ== + dependencies: + "@lerna/get-packed" "4.0.0" + "@lerna/package" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + npm-packlist "^2.1.4" + npmlog "^4.1.2" + tar "^6.1.0" + temp-write "^4.0.0" + +"@lerna/package-graph@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-4.0.0.tgz#16a00253a8ac810f72041481cb46bcee8d8123dd" + integrity sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw== + dependencies: + "@lerna/prerelease-id-from-version" "4.0.0" + "@lerna/validation-error" "4.0.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + semver "^7.3.4" + +"@lerna/package@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/package/-/package-4.0.0.tgz#1b4c259c4bcff45c876ee1d591a043aacbc0d6b7" + integrity sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q== + dependencies: + load-json-file "^6.2.0" + npm-package-arg "^8.1.0" + write-pkg "^4.0.0" + +"@lerna/prerelease-id-from-version@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-4.0.0.tgz#c7e0676fcee1950d85630e108eddecdd5b48c916" + integrity sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg== + dependencies: + semver "^7.3.4" + +"@lerna/profiler@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-4.0.0.tgz#8a53ab874522eae15d178402bff90a14071908e9" + integrity sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q== + dependencies: + fs-extra "^9.1.0" + npmlog "^4.1.2" + upath "^2.0.1" + +"@lerna/project@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/project/-/project-4.0.0.tgz#ff84893935833533a74deff30c0e64ddb7f0ba6b" + integrity sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg== + dependencies: + "@lerna/package" "4.0.0" + "@lerna/validation-error" "4.0.0" + cosmiconfig "^7.0.0" + dedent "^0.7.0" + dot-prop "^6.0.1" + glob-parent "^5.1.1" + globby "^11.0.2" + load-json-file "^6.2.0" + npmlog "^4.1.2" + p-map "^4.0.0" + resolve-from "^5.0.0" + write-json-file "^4.3.0" + +"@lerna/prompt@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-4.0.0.tgz#5ec69a803f3f0db0ad9f221dad64664d3daca41b" + integrity sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ== + dependencies: + inquirer "^7.3.3" + npmlog "^4.1.2" + +"@lerna/publish@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-4.0.0.tgz#f67011305adeba120066a3b6d984a5bb5fceef65" + integrity sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg== + dependencies: + "@lerna/check-working-tree" "4.0.0" + "@lerna/child-process" "4.0.0" + "@lerna/collect-updates" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/describe-ref" "4.0.0" + "@lerna/log-packed" "4.0.0" + "@lerna/npm-conf" "4.0.0" + "@lerna/npm-dist-tag" "4.0.0" + "@lerna/npm-publish" "4.0.0" + "@lerna/otplease" "4.0.0" + "@lerna/output" "4.0.0" + "@lerna/pack-directory" "4.0.0" + "@lerna/prerelease-id-from-version" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/validation-error" "4.0.0" + "@lerna/version" "4.0.0" + fs-extra "^9.1.0" + libnpmaccess "^4.0.1" + npm-package-arg "^8.1.0" + npm-registry-fetch "^9.0.0" + npmlog "^4.1.2" + p-map "^4.0.0" + p-pipe "^3.1.0" + pacote "^11.2.6" + semver "^7.3.4" + +"@lerna/pulse-till-done@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-4.0.0.tgz#04bace7d483a8205c187b806bcd8be23d7bb80a3" + integrity sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg== + dependencies: + npmlog "^4.1.2" + +"@lerna/query-graph@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-4.0.0.tgz#09dd1c819ac5ee3f38db23931143701f8a6eef63" + integrity sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg== + dependencies: + "@lerna/package-graph" "4.0.0" + +"@lerna/resolve-symlink@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-4.0.0.tgz#6d006628a210c9b821964657a9e20a8c9a115e14" + integrity sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA== + dependencies: + fs-extra "^9.1.0" + npmlog "^4.1.2" + read-cmd-shim "^2.0.0" + +"@lerna/rimraf-dir@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-4.0.0.tgz#2edf3b62d4eb0ef4e44e430f5844667d551ec25a" + integrity sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg== + dependencies: + "@lerna/child-process" "4.0.0" + npmlog "^4.1.2" + path-exists "^4.0.0" + rimraf "^3.0.2" + +"@lerna/run-lifecycle@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-4.0.0.tgz#e648a46f9210a9bcd7c391df6844498cb5079334" + integrity sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ== + dependencies: + "@lerna/npm-conf" "4.0.0" + npm-lifecycle "^3.1.5" + npmlog "^4.1.2" + +"@lerna/run-topologically@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-4.0.0.tgz#af846eeee1a09b0c2be0d1bfb5ef0f7b04bb1827" + integrity sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA== + dependencies: + "@lerna/query-graph" "4.0.0" + p-queue "^6.6.2" + +"@lerna/run@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/run/-/run-4.0.0.tgz#4bc7fda055a729487897c23579694f6183c91262" + integrity sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/npm-run-script" "4.0.0" + "@lerna/output" "4.0.0" + "@lerna/profiler" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/timer" "4.0.0" + "@lerna/validation-error" "4.0.0" + p-map "^4.0.0" + +"@lerna/symlink-binary@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-4.0.0.tgz#21009f62d53a425f136cb4c1a32c6b2a0cc02d47" + integrity sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA== + dependencies: + "@lerna/create-symlink" "4.0.0" + "@lerna/package" "4.0.0" + fs-extra "^9.1.0" + p-map "^4.0.0" + +"@lerna/symlink-dependencies@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-4.0.0.tgz#8910eca084ae062642d0490d8972cf2d98e9ebbd" + integrity sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw== + dependencies: + "@lerna/create-symlink" "4.0.0" + "@lerna/resolve-symlink" "4.0.0" + "@lerna/symlink-binary" "4.0.0" + fs-extra "^9.1.0" + p-map "^4.0.0" + p-map-series "^2.1.0" + +"@lerna/timer@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-4.0.0.tgz#a52e51bfcd39bfd768988049ace7b15c1fd7a6da" + integrity sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg== + +"@lerna/validation-error@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-4.0.0.tgz#af9d62fe8304eaa2eb9a6ba1394f9aa807026d35" + integrity sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw== + dependencies: + npmlog "^4.1.2" + +"@lerna/version@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/version/-/version-4.0.0.tgz#532659ec6154d8a8789c5ab53878663e244e3228" + integrity sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA== + dependencies: + "@lerna/check-working-tree" "4.0.0" + "@lerna/child-process" "4.0.0" + "@lerna/collect-updates" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/conventional-commits" "4.0.0" + "@lerna/github-client" "4.0.0" + "@lerna/gitlab-client" "4.0.0" + "@lerna/output" "4.0.0" + "@lerna/prerelease-id-from-version" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/validation-error" "4.0.0" + chalk "^4.1.0" + dedent "^0.7.0" + load-json-file "^6.2.0" + minimatch "^3.0.4" + npmlog "^4.1.2" + p-map "^4.0.0" + p-pipe "^3.1.0" + p-reduce "^2.1.0" + p-waterfall "^2.1.1" + semver "^7.3.4" + slash "^3.0.0" + temp-write "^4.0.0" + write-json-file "^4.3.0" + +"@lerna/write-log-file@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-4.0.0.tgz#18221a38a6a307d6b0a5844dd592ad53fa27091e" + integrity sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg== + dependencies: + npmlog "^4.1.2" + write-file-atomic "^3.0.3" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -815,6 +1496,177 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/ci-detect@^1.0.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1" + integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q== + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/git@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" + integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== + dependencies: + "@npmcli/promise-spawn" "^1.3.2" + lru-cache "^6.0.0" + mkdirp "^1.0.4" + npm-pick-manifest "^6.1.1" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^2.0.2" + +"@npmcli/installed-package-contents@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" + integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== + dependencies: + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/node-gyp@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33" + integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== + +"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" + integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== + dependencies: + infer-owner "^1.0.4" + +"@npmcli/run-script@^1.8.2": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7" + integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g== + dependencies: + "@npmcli/node-gyp" "^1.0.2" + "@npmcli/promise-spawn" "^1.3.2" + node-gyp "^7.1.0" + read-package-json-fast "^2.0.1" + +"@octokit/auth-token@^2.4.4": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" + integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g== + dependencies: + "@octokit/types" "^6.0.3" + +"@octokit/core@^3.5.1": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.6.0.tgz#3376cb9f3008d9b3d110370d90e0a1fcd5fe6085" + integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.6.3" + "@octokit/request-error" "^2.0.5" + "@octokit/types" "^6.0.3" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.12" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" + integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== + dependencies: + "@octokit/types" "^6.0.3" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.5.8": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3" + integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg== + dependencies: + "@octokit/request" "^5.6.0" + "@octokit/types" "^6.0.3" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^12.7.0": + version "12.8.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.8.0.tgz#f4708cf948724d6e8f7d878cfd91584c1c5c0523" + integrity sha512-ydcKLs2KKcxlhpdWLzJxEBDEk/U5MUeqtqkXlrtAUXXFPs6vLl1PEGghFC/BbpleosB7iXs0Z4P2DGe7ZT5ZNg== + +"@octokit/plugin-enterprise-rest@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" + integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== + +"@octokit/plugin-paginate-rest@^2.16.8": + version "2.21.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.2.tgz#070be9bb18cb78e52b471ddc3551d28355e2d5e2" + integrity sha512-S24H0a6bBVreJtoTaRHT/gnVASbOHVTRMOVIqd9zrJBP3JozsxJB56TDuTUmd1xLI4/rAE2HNmThvVKtIdLLEw== + dependencies: + "@octokit/types" "^6.39.0" + +"@octokit/plugin-request-log@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" + integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== + +"@octokit/plugin-rest-endpoint-methods@^5.12.0": + version "5.16.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz#7ee8bf586df97dd6868cf68f641354e908c25342" + integrity sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw== + dependencies: + "@octokit/types" "^6.39.0" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" + integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== + dependencies: + "@octokit/types" "^6.0.3" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.6.0", "@octokit/request@^5.6.3": + version "5.6.3" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0" + integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.1.0" + "@octokit/types" "^6.16.1" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/rest@^18.1.0": + version "18.12.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881" + integrity sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q== + dependencies: + "@octokit/core" "^3.5.1" + "@octokit/plugin-paginate-rest" "^2.16.8" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^5.12.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0": + version "6.39.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.39.0.tgz#46ce28ca59a3d4bac0e487015949008302e78eee" + integrity sha512-Mq4N9sOAYCitTsBtDdRVrBE80lIrMBhL9Jbrw0d+j96BAzlq4V+GLHFJbHokEsVvO/9tQupQdoFdgVYhD2C8UQ== + dependencies: + "@octokit/openapi-types" "^12.7.0" + "@sinclair/typebox@^0.23.3": version "0.23.5" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" @@ -834,6 +1686,11 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" @@ -958,6 +1815,13 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/ws@^7.4.7": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -1082,6 +1946,11 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -1092,13 +1961,27 @@ acorn@^8.7.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== -agent-base@6: +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== + +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" +agentkeepalive@^4.1.3: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -1107,7 +1990,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1129,6 +2012,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1161,6 +2049,24 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +aproba@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1217,6 +2123,17 @@ array.prototype.flat@^1.2.5: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" +array.prototype.reduce@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" + integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -1227,6 +2144,23 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -1237,11 +2171,26 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + axe-core@^4.3.5: version "4.4.2" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.2.tgz#dcf7fb6dea866166c3eab33d68208afe4d5f670c" @@ -1317,11 +2266,23 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + bech32@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== +before-after-hook@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" + integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1360,6 +2321,45 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== + +byline@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== + +byte-size@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.1.tgz#b1daf3386de7ab9d706b941a748dbfc71130dee3" + integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== + +cacache@^15.0.5, cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -1397,6 +2397,11 @@ caniuse-lite@^1.0.30001332: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz#59590c8ffa8b5939cf4161f00827b8873ad72498" integrity sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA== +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1427,6 +2432,26 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + ci-info@^3.2.0: version "3.3.1" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.1.tgz#58331f6f472a25fe3a50a351ae3052936c2c7f32" @@ -1457,6 +2482,11 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -1466,11 +2496,37 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +cmd-shim@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" + integrity sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw== + dependencies: + mkdirp-infer-owner "^2.0.0" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -1505,6 +2561,21 @@ colorette@^2.0.16: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== +columnify@^1.5.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" + integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== + dependencies: + strip-ansi "^6.0.1" + wcwidth "^1.0.0" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" @@ -1523,12 +2594,35 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + +config-chain@^1.1.12: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + confusing-browser-globals@^1.0.10: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -conventional-changelog-angular@^5.0.11: +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +conventional-changelog-angular@^5.0.11, conventional-changelog-angular@^5.0.12: version "5.0.13" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== @@ -1545,7 +2639,55 @@ conventional-changelog-conventionalcommits@^4.3.1: lodash "^4.17.15" q "^1.5.1" -conventional-commits-parser@^3.0.0: +conventional-changelog-core@^4.2.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" + integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^5.0.0" + conventional-commits-parser "^3.2.0" + dateformat "^3.0.0" + get-pkg-repo "^4.0.0" + git-raw-commits "^2.0.8" + git-remote-origin-url "^2.0.0" + git-semver-tags "^4.1.1" + lodash "^4.17.15" + normalize-package-data "^3.0.0" + q "^1.5.1" + read-pkg "^3.0.0" + read-pkg-up "^3.0.0" + through2 "^4.0.0" + +conventional-changelog-preset-loader@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" + integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== + +conventional-changelog-writer@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" + integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== + dependencies: + conventional-commits-filter "^2.0.7" + dateformat "^3.0.0" + handlebars "^4.7.7" + json-stringify-safe "^5.0.1" + lodash "^4.17.15" + meow "^8.0.0" + semver "^6.0.0" + split "^1.0.0" + through2 "^4.0.0" + +conventional-commits-filter@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" + integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== + dependencies: + lodash.ismatch "^4.4.0" + modify-values "^1.0.0" + +conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.2.0: version "3.2.4" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== @@ -1557,6 +2699,20 @@ conventional-commits-parser@^3.0.0: split2 "^3.0.0" through2 "^4.0.0" +conventional-recommended-bump@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" + integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== + dependencies: + concat-stream "^2.0.0" + conventional-changelog-preset-loader "^2.3.4" + conventional-commits-filter "^2.0.7" + conventional-commits-parser "^3.2.0" + git-raw-commits "^2.0.8" + git-semver-tags "^4.1.1" + meow "^8.0.0" + q "^1.5.1" + convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" @@ -1582,6 +2738,11 @@ core-js-pure@^3.20.2: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.5.tgz#bdee0ed2f9b78f2862cda4338a07b13a49b6c9a9" integrity sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA== +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -1624,7 +2785,19 @@ dargs@^7.0.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4: +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1645,6 +2818,11 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== + decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -1658,6 +2836,11 @@ decamelize@^1.1.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -1673,6 +2856,13 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== + dependencies: + clone "^1.0.2" + define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" @@ -1681,6 +2871,36 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== + +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -1691,6 +2911,14 @@ devtools-protocol@^0.0.981744: resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.981744.tgz#9960da0370284577d46c28979a0b32651022bacf" integrity sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg== +dezalgo@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + dependencies: + asap "^2.0.0" + wrappy "1" + diff-sequences@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" @@ -1729,6 +2957,26 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + electron-to-chromium@^1.4.118: version "1.4.137" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f" @@ -1749,6 +2997,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -1763,6 +3018,21 @@ enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@^7.7.4: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1770,7 +3040,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== @@ -1799,6 +3069,11 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19 string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -2073,6 +3348,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + execa@^4.0.0, execa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -2119,6 +3399,30 @@ expect@^28.1.1: jest-message-util "^28.1.1" jest-util "^28.1.1" +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2164,6 +3468,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2178,7 +3489,12 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-up@^2.1.0: +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -2214,7 +3530,21 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== -fs-extra@^9.0.0: +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@^9.0.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -2224,6 +3554,20 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2259,6 +3603,20 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -2288,6 +3646,21 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-pkg-repo@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" + integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== + dependencies: + "@hutson/parse-repository-url" "^3.0.0" + hosted-git-info "^4.0.0" + through2 "^2.0.0" + yargs "^16.2.0" + +get-port@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + get-stream@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -2308,18 +3681,63 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -git-raw-commits@^2.0.0: +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +git-raw-commits@^2.0.0, git-raw-commits@^2.0.8: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== dependencies: - dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" + integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== + dependencies: + meow "^8.0.0" + semver "^6.0.0" + +git-up@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.5.tgz#e7bb70981a37ea2fb8fe049669800a1f9a01d759" + integrity sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA== + dependencies: + is-ssh "^1.3.0" + parse-url "^6.0.0" + +git-url-parse@^11.4.4: + version "11.6.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.6.0.tgz#c634b8de7faa66498a2b88932df31702c67df605" + integrity sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g== + dependencies: + git-up "^4.0.0" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== + dependencies: + ini "^1.3.2" -glob-parent@^5.1.2: +glob-parent@^5.1.1, glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -2333,7 +3751,7 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" -glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: +glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -2364,7 +3782,7 @@ globals@^13.15.0: dependencies: type-fest "^0.20.2" -globby@^11.1.0: +globby@^11.0.2, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -2376,11 +3794,36 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +handlebars@^4.7.7: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -2420,6 +3863,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.0, has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -2432,7 +3880,7 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^4.0.1: +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== @@ -2444,6 +3892,29 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -2462,11 +3933,39 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + husky@^7.0.1: version "7.0.4" resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore-walk@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== + dependencies: + minimatch "^3.0.4" + ignore@^5.0.5, ignore@^5.1.4, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" @@ -2498,6 +3997,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2511,11 +4015,43 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.4: +ini@^1.3.2, ini@^1.3.4: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +init-package-json@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.5.tgz#78b85f3c36014db42d8f32117252504f68022646" + integrity sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA== + dependencies: + npm-package-arg "^8.1.5" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "^4.1.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^3.0.0" + +inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -2530,6 +4066,11 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +ip@^1.1.5: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2555,6 +4096,13 @@ is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" @@ -2574,6 +4122,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -2591,6 +4146,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -2618,11 +4178,28 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-plain-obj@^1.1.0: +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -2643,6 +4220,13 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" +is-ssh@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" + integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== + dependencies: + protocols "^2.0.1" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -2669,6 +4253,11 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typedarray@^1.0.0, 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-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -2696,6 +4285,16 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -3148,11 +4747,21 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -3163,11 +4772,21 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -3189,11 +4808,21 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonparse@^1.2.0: +jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + jsx-ast-utils@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" @@ -3202,7 +4831,7 @@ jsx-ast-utils@^3.2.1: array-includes "^3.1.4" object.assign "^4.1.2" -kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -3224,6 +4853,30 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "~0.3.2" +lerna@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-4.0.0.tgz#b139d685d50ea0ca1be87713a7c2f44a5b678e9e" + integrity sha512-DD/i1znurfOmNJb0OBw66NmNqiM8kF6uIrzrJ0wGE3VNdzeOhz9ziWLYiRaZDGGwgbcjOo6eIfcx9O5Qynz+kg== + dependencies: + "@lerna/add" "4.0.0" + "@lerna/bootstrap" "4.0.0" + "@lerna/changed" "4.0.0" + "@lerna/clean" "4.0.0" + "@lerna/cli" "4.0.0" + "@lerna/create" "4.0.0" + "@lerna/diff" "4.0.0" + "@lerna/exec" "4.0.0" + "@lerna/import" "4.0.0" + "@lerna/info" "4.0.0" + "@lerna/init" "4.0.0" + "@lerna/link" "4.0.0" + "@lerna/list" "4.0.0" + "@lerna/publish" "4.0.0" + "@lerna/run" "4.0.0" + "@lerna/version" "4.0.0" + import-local "^3.0.2" + npmlog "^4.1.2" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -3237,6 +4890,27 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +libnpmaccess@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" + integrity sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ== + dependencies: + aproba "^2.0.0" + minipass "^3.1.1" + npm-package-arg "^8.1.2" + npm-registry-fetch "^11.0.0" + +libnpmpublish@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-4.0.2.tgz#be77e8bf5956131bcb45e3caa6b96a842dec0794" + integrity sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw== + dependencies: + normalize-package-data "^3.0.2" + npm-package-arg "^8.1.2" + npm-registry-fetch "^11.0.0" + semver "^7.1.3" + ssri "^8.0.1" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -3277,6 +4951,26 @@ listr2@^3.2.2: through "^2.3.8" wrap-ansi "^7.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +load-json-file@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== + dependencies: + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -3299,12 +4993,37 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== + +lodash.ismatch@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" + integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.15, lodash@^4.17.19: +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3334,6 +5053,14 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -3341,6 +5068,49 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +make-fetch-happen@^8.0.9: + version "8.0.14" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" + integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.0.5" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + promise-retry "^2.0.1" + socks-proxy-agent "^5.0.0" + ssri "^8.0.0" + +make-fetch-happen@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -3393,6 +5163,18 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" 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" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -3419,16 +5201,114 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -mkdirp@^1.0.4: +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + dependencies: + yallist "^4.0.0" + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp-infer-owner@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" + integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== + dependencies: + chownr "^2.0.0" + infer-owner "^1.0.4" + mkdirp "^1.0.3" + +mkdirp@^0.5.1, mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + mri@^1.1.5: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" @@ -3444,7 +5324,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.1: +ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -3460,11 +5340,77 @@ multimatch@^4.0.0: arrify "^2.0.1" minimatch "^3.0.4" +multimatch@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + +mute-stream@0.0.8, mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +negotiator@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp@^5.0.2: + version "5.1.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" + integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" + +node-gyp@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" + integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.3" + nopt "^5.0.0" + npmlog "^4.1.2" + request "^2.88.2" + rimraf "^3.0.2" + semver "^7.3.2" + tar "^6.0.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -3483,7 +5429,22 @@ noms@0.0.0: inherits "^2.0.1" readable-stream "~1.0.31" -normalize-package-data@^2.5.0: +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -3493,7 +5454,7 @@ normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^3.0.0: +normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== @@ -3508,6 +5469,99 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-bundled@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-install-checks@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== + dependencies: + semver "^7.1.1" + +npm-lifecycle@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" + integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== + dependencies: + byline "^5.0.0" + graceful-fs "^4.1.15" + node-gyp "^5.0.2" + resolve-from "^4.0.0" + slide "^1.1.6" + uid-number "0.0.6" + umask "^1.1.0" + which "^1.3.1" + +npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5: + version "8.1.5" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" + integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.4" + validate-npm-package-name "^3.0.0" + +npm-packlist@^2.1.4: + version "2.2.2" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" + integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== + dependencies: + glob "^7.1.6" + ignore-walk "^3.0.3" + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" + integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== + dependencies: + npm-install-checks "^4.0.0" + npm-normalize-package-bin "^1.0.1" + npm-package-arg "^8.1.2" + semver "^7.3.4" + +npm-registry-fetch@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" + integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== + dependencies: + make-fetch-happen "^9.0.1" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + +npm-registry-fetch@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz#86f3feb4ce00313bc0b8f1f8f69daae6face1661" + integrity sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA== + dependencies: + "@npmcli/ci-detect" "^1.0.0" + lru-cache "^6.0.0" + make-fetch-happen "^8.0.9" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -3515,6 +5569,31 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" @@ -3544,6 +5623,16 @@ object.entries@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" +object.getownpropertydescriptors@^2.0.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" + integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== + dependencies: + array.prototype.reduce "^1.0.4" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.1" + object.values@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" @@ -3579,6 +5668,29 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -3621,6 +5733,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-map-series@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" + integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -3628,6 +5745,31 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-pipe@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-reduce@^2.0.0, p-reduce@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -3638,12 +5780,52 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +p-waterfall@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" + integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== + dependencies: + p-reduce "^2.0.0" + +pacote@^11.2.6: + version "11.3.5" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2" + integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg== + dependencies: + "@npmcli/git" "^2.1.0" + "@npmcli/installed-package-contents" "^1.0.6" + "@npmcli/promise-spawn" "^1.2.0" + "@npmcli/run-script" "^1.8.2" + cacache "^15.0.5" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.3" + mkdirp "^1.0.3" + npm-package-arg "^8.0.1" + npm-packlist "^2.1.4" + npm-pick-manifest "^6.0.0" + npm-registry-fetch "^11.0.0" + promise-retry "^2.0.1" + read-package-json-fast "^2.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.1.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: - callsites "^3.0.0" + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" @@ -3655,6 +5837,26 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-path@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.4.tgz#4bf424e6b743fb080831f03b536af9fc43f0ffea" + integrity sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + qs "^6.9.4" + query-string "^6.13.8" + +parse-url@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.2.tgz#4a30b057bfc452af64512dfb1a7755c103db3ea1" + integrity sha512-uCSjOvD3T+6B/sPWhR+QowAZcU/o4bjPrVBQBGFxcDF6J6FraCGIaDBsdoQawiaaAVdHvtqBe3w3vKlfBKySOQ== + dependencies: + is-ssh "^1.3.0" + normalize-url "^6.1.0" + parse-path "^4.0.4" + protocols "^1.4.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -3680,11 +5882,23 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -3695,6 +5909,26 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + pirates@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" @@ -3767,6 +6001,19 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -3775,6 +6022,33 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== + dependencies: + read "1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +protocols@^1.4.0: + version "1.4.8" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" + integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== + +protocols@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" + integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -3783,7 +6057,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -3793,6 +6067,28 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +qs@^6.9.4: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +query-string@^6.13.8: + version "6.14.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" + integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -3813,6 +6109,66 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== +read-cmd-shim@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" + integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== + +read-package-json-fast@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" + integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== + dependencies: + json-parse-even-better-errors "^2.3.0" + npm-normalize-package-bin "^1.0.1" + +read-package-json@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^2.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-json@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-3.0.1.tgz#c7108f0b9390257b08c21e3004d2404c806744b9" + integrity sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^3.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-json@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.2.tgz#b444d047de7c75d4a160cb056d00c0693c1df703" + integrity sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^3.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-tree@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" + integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== + dependencies: + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + util-promisify "^2.1.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg-up@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" @@ -3831,6 +6187,15 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + read-pkg@^5.1.1, read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -3841,7 +6206,14 @@ read-pkg@^5.1.1, read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@3, readable-stream@^3.0.0: +read@1, read@~1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== + dependencies: + mute-stream "~0.0.4" + +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -3850,17 +6222,7 @@ readable-stream@3, readable-stream@^3.0.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~2.3.6: +readable-stream@^2.0.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -3873,6 +6235,26 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdir-scoped-modules@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" + integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -3907,6 +6289,32 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +request@^2.88.0, request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -3963,6 +6371,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -3973,6 +6386,13 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -3980,6 +6400,11 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -3987,6 +6412,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + rxjs@^7.5.1: version "7.5.5" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" @@ -3994,22 +6426,27 @@ rxjs@^7.5.1: dependencies: tslib "^2.1.0" +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5": +"semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -4026,13 +6463,25 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: +semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4071,7 +6520,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -4104,6 +6553,56 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slide@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" + integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== + dependencies: + agent-base "^6.0.2" + debug "4" + socks "^2.3.3" + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.3.3, socks@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" + integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.2.0" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== + dependencies: + is-plain-obj "^1.0.0" + +sort-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-4.2.0.tgz#6b7638cee42c506fff8c1cecde7376d21315be18" + integrity sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== + dependencies: + is-plain-obj "^2.0.0" + source-map-js@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -4148,6 +6647,11 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split2@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -4155,11 +6659,40 @@ split2@^3.0.0: dependencies: readable-stream "^3.0.0" +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + stack-utils@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" @@ -4167,6 +6700,11 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + string-argv@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" @@ -4180,7 +6718,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4235,6 +6782,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -4269,6 +6823,15 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strong-log-transformer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" + integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== + dependencies: + duplexer "^0.1.1" + minimist "^1.2.0" + through "^2.3.4" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -4303,6 +6866,47 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +tar@^4.4.12: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +tar@^6.0.2, tar@^6.1.0: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== + +temp-write@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" + integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== + dependencies: + graceful-fs "^4.1.15" + is-stream "^2.0.0" + make-dir "^3.0.0" + temp-dir "^1.0.0" + uuid "^3.3.2" + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -4335,7 +6939,7 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== -through2@^2.0.1: +through2@^2.0.0, through2@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -4350,11 +6954,18 @@ through2@^4.0.0: dependencies: readable-stream "3" -"through@>=2.2.7 <3", through@^2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -4372,6 +6983,26 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -4387,7 +7018,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: +tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -4404,6 +7035,18 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -4431,6 +7074,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-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + type-fest@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" @@ -4446,11 +7094,38 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +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" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + typescript@^4.7.2, typescript@~4.7.3: version "4.7.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== +uglify-js@^3.1.4: + version "3.16.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.2.tgz#0481e1dbeed343ad1c2ddf3c6d42e89b7a6d4def" + integrity sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg== + +uid-number@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w== + +umask@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + integrity sha512-lE/rxOhmiScJu9L6RTNVgB/zZbF+vGC0/p6D3xnkAePI2o0sMyFG966iR5Ki50OI/0mNi2yaRnxfLsPmEZF/JA== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -4461,6 +7136,25 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -4471,6 +7165,11 @@ untildify@^4.0.0: resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +upath@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -4483,6 +7182,18 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util-promisify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" + integrity sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA== + dependencies: + object.getownpropertydescriptors "^2.0.3" + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -4497,7 +7208,7 @@ v8-to-istanbul@^9.0.0: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" -validate-npm-package-license@^3.0.1: +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -4505,6 +7216,22 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== + dependencies: + builtins "^1.0.3" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -4512,6 +7239,40 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^8.4.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -4523,18 +7284,37 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which@^2.0.1: +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -4558,6 +7338,25 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^2.4.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: + 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== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write-file-atomic@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" @@ -4566,6 +7365,44 @@ write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" +write-json-file@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" + integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.15" + make-dir "^2.1.0" + pify "^4.0.1" + sort-keys "^2.0.0" + write-file-atomic "^2.4.2" + +write-json-file@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-4.3.0.tgz#908493d6fd23225344af324016e4ca8f702dd12d" + integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== + dependencies: + detect-indent "^6.0.0" + graceful-fs "^4.1.15" + is-plain-obj "^2.0.0" + make-dir "^3.0.0" + sort-keys "^4.0.0" + write-file-atomic "^3.0.0" + +write-pkg@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" + integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== + dependencies: + sort-keys "^2.0.0" + type-fest "^0.4.1" + write-json-file "^3.2.0" + +ws@^7.4.6: + version "7.5.8" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" + integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -4576,6 +7413,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.0, yallist@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -4586,6 +7428,11 @@ 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.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" From 368dfb96127f1dde578a1fd05f32e880dd043ac5 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 13 Jul 2022 10:27:34 -0400 Subject: [PATCH 017/147] v2.0.0-alpha.7 --- shared/CHANGELOG.md | 22 ++++++++++++++++++++++ shared/commons/CHANGELOG.md | 8 ++++++++ shared/commons/package.build.json | 3 +++ shared/commons/package.json | 7 ++++--- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/index.ts | 6 ++++++ shared/net/package.build.json | 3 +++ shared/net/package.json | 5 +++-- shared/package.json | 6 +++--- shared/tsconfig.json | 2 +- 11 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 shared/commons/CHANGELOG.md create mode 100644 shared/commons/package.build.json create mode 100644 shared/net/CHANGELOG.md create mode 100644 shared/net/index.ts create mode 100644 shared/net/package.build.json diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index f8019dd1a..f861519a5 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,28 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# 2.0.0-alpha.7 (2022-07-13) + + +### Bug Fixes + +* another lint issue ([21d03c5](https://github.com/ulixee/commons/commit/21d03c5321f712657697571a816d6e64feb45a81)) +* handle * logger ([0610dfa](https://github.com/ulixee/commons/commit/0610dfa3e306718e7088644189b076b41037fc0a)) +* readme ([1eac5ba](https://github.com/ulixee/commons/commit/1eac5bab9e860e3a414fab3c5242492c018afa8a)) +* scoped loggers ([b431cc7](https://github.com/ulixee/commons/commit/b431cc71d5878cd4172616cef8ab8066b137df15)) + + +### Features + +* add bech32m hasher ([65691e8](https://github.com/ulixee/commons/commit/65691e8ebe2f8cae841e45457fd4cc4ccdfbbab1)) +* added nvmrc file ([871c936](https://github.com/ulixee/commons/commit/871c936aaa5974a5021af054ab84b8c25213306c)) +* databoxesOutDir ([fdd4dd5](https://github.com/ulixee/commons/commit/fdd4dd51549677b29332ba0bc2ddbdc6fd24f61d)) +* find project path ([e3e84d1](https://github.com/ulixee/commons/commit/e3e84d19e6af38e533f536a4627a0dfe3f769006)) + + + + + # [2.0.0-alpha.3](https://github.com/ulixee/ulixee/compare/v2.0.0-alpha.2...v2.0.0-alpha.3) (2022-05-19) **Note:** Version bump only for package @ulixee/commons diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md new file mode 100644 index 000000000..c7a33c6a8 --- /dev/null +++ b/shared/commons/CHANGELOG.md @@ -0,0 +1,8 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 2.0.0-alpha.7 (2022-07-13) + +**Note:** Version bump only for package @ulixee/commons diff --git a/shared/commons/package.build.json b/shared/commons/package.build.json new file mode 100644 index 000000000..d5e32482e --- /dev/null +++ b/shared/commons/package.build.json @@ -0,0 +1,3 @@ +{ + "private": false +} diff --git a/shared/commons/package.json b/shared/commons/package.json index 6b7cf68d2..64c2e428e 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,14 +1,15 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.6", + "version": "2.0.0-alpha.7", + "private": true, "description": "Common utilities for Ulixee", "license": "MIT", "dependencies": { + "bech32": "^2.0.0", "devtools-protocol": "^0.0.981744", "https-proxy-agent": "^5.0.0", "semver": "^7.3.7", - "source-map-js": "^1.0.1", - "bech32": "^2.0.0" + "source-map-js": "^1.0.1" }, "devDependencies": { "@types/better-sqlite3": "^7.5.0" diff --git a/shared/lerna.json b/shared/lerna.json index 771e5859d..dbc664463 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.6", + "version": "2.0.0-alpha.7", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md new file mode 100644 index 000000000..a7b685998 --- /dev/null +++ b/shared/net/CHANGELOG.md @@ -0,0 +1,8 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 2.0.0-alpha.7 (2022-07-13) + +**Note:** Version bump only for package @ulixee/net diff --git a/shared/net/index.ts b/shared/net/index.ts new file mode 100644 index 000000000..00df73a77 --- /dev/null +++ b/shared/net/index.ts @@ -0,0 +1,6 @@ +import ConnectionToCore from './lib/ConnectionToCore'; +import ConnectionToClient from './lib/ConnectionToClient'; +import WsTransportToCore from './lib/WsTransportToCore'; +import WsTransportToClient from './lib/WsTransportToClient'; + +export { ConnectionToCore, WsTransportToClient, WsTransportToCore, ConnectionToClient }; diff --git a/shared/net/package.build.json b/shared/net/package.build.json new file mode 100644 index 000000000..d5e32482e --- /dev/null +++ b/shared/net/package.build.json @@ -0,0 +1,3 @@ +{ + "private": false +} diff --git a/shared/net/package.json b/shared/net/package.json index 12fc03101..dee6cabac 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,10 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.6", + "version": "2.0.0-alpha.7", + "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.6", + "@ulixee/commons": "2.0.0-alpha.7", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/package.json b/shared/package.json index ade99ba7c..4f4d269ef 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,7 +1,7 @@ { "name": "@ulixee/shared-monorepo", "private": true, - "version": "2.0.0-alpha.6", + "version": "0.0.1", "description": "Shared Ulixee and Unblocked projects", "license": "MIT", "scripts": { @@ -11,12 +11,12 @@ "copy:dist": "ulx-repo-after-build --dist", "copy:build": "ulx-repo-after-build", "tsc": "tsc -b -i tsconfig.json && ulx-repo-after-build", - "watch": "tsc -b -w tsconfig.json", + "watch": "tsc -b -i -w tsconfig.json", "clean": "tsc -b --clean tsconfig.json", "test": "yarn copy:build && yarn test:build", "test:build": "cd ./build && cross-env NODE_ENV=test jest", "lint": "eslint --cache ./", - "version": "ulx-repo-version-check fix", + "version:check": "ulx-repo-version-check fix", "version:bump": "ulx-repo-version-bump" }, "devDependencies": { diff --git a/shared/tsconfig.json b/shared/tsconfig.json index c77928b76..14b8d3a80 100644 --- a/shared/tsconfig.json +++ b/shared/tsconfig.json @@ -4,7 +4,7 @@ "rootDir": ".", "outDir": "./build" }, - "include": ["**/*.ts", "*.json", ".eslintrc.js"], + "include": ["**/*.ts", "*.json", ".eslintrc.js", "*.js"], "exclude": [ "**/tsconfig*.json", "build", From 0228c7d384bea384aeb3f70a35e793be30bcdb0d Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 14 Jul 2022 09:58:46 -0400 Subject: [PATCH 018/147] v2.0.0-alpha.8 --- shared/CHANGELOG.md | 8 ++++++++ shared/commons/CHANGELOG.md | 8 ++++++++ shared/commons/package.json | 2 +- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index f861519a5..acfdc7813 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.8](https://github.com/ulixee/commons/compare/v2.0.0-alpha.7...v2.0.0-alpha.8) (2022-07-14) + +**Note:** Version bump only for package @ulixee/shared-monorepo + + + + + # 2.0.0-alpha.7 (2022-07-13) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index c7a33c6a8..78d9a0f6e 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.8](https://github.com/ulixee/commons/compare/v2.0.0-alpha.7...v2.0.0-alpha.8) (2022-07-14) + +**Note:** Version bump only for package @ulixee/commons + + + + + # 2.0.0-alpha.7 (2022-07-13) **Note:** Version bump only for package @ulixee/commons diff --git a/shared/commons/package.json b/shared/commons/package.json index 64c2e428e..fa37a52cb 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.7", + "version": "2.0.0-alpha.8", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/lerna.json b/shared/lerna.json index dbc664463..e2429eec3 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.7", + "version": "2.0.0-alpha.8", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index a7b685998..624ee8f7d 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.8](https://github.com/ulixee/commons/compare/v2.0.0-alpha.7...v2.0.0-alpha.8) (2022-07-14) + +**Note:** Version bump only for package @ulixee/net + + + + + # 2.0.0-alpha.7 (2022-07-13) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index dee6cabac..cc390618b 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.7", + "version": "2.0.0-alpha.8", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.7", + "@ulixee/commons": "2.0.0-alpha.8", "ws": "^7.4.6" }, "devDependencies": { From 55392955848fcfc293e2c90d51d63befd22d3379 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 14 Jul 2022 10:29:05 -0400 Subject: [PATCH 019/147] chore: auto-test --- shared/.github/FUNDING.yml | 3 ++ shared/.github/workflows/lint-and-test.yml | 40 ++++++++++++++++++++++ shared/commons/package.dist.json | 3 ++ shared/net/package.dist.json | 3 ++ 4 files changed, 49 insertions(+) create mode 100644 shared/.github/FUNDING.yml create mode 100644 shared/.github/workflows/lint-and-test.yml create mode 100644 shared/commons/package.dist.json create mode 100644 shared/net/package.dist.json diff --git a/shared/.github/FUNDING.yml b/shared/.github/FUNDING.yml new file mode 100644 index 000000000..fb8b82f3c --- /dev/null +++ b/shared/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: ulixee diff --git a/shared/.github/workflows/lint-and-test.yml b/shared/.github/workflows/lint-and-test.yml new file mode 100644 index 000000000..be314a9c3 --- /dev/null +++ b/shared/.github/workflows/lint-and-test.yml @@ -0,0 +1,40 @@ +name: Test Matrix + +on: + push: + branches: + - '*' + workflow_dispatch: + +jobs: + lint-and-test: + name: Test Node.js ${{ matrix.node-version }} on ${{ matrix.os }} + timeout-minutes: 30 + + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest, ubuntu-latest] + node-version: [14, 16] + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + with: + submodules: 'true' + + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: 'yarn' + + - name: Yarn build + run: yarn build + + - name: Run Lint + if: ${{ matrix.os == 'ubuntu-latest' && matrix.node-version == 14 }} + run: NODE_OPTIONS=--max-old-space-size=4096 yarn lint + + - name: Run tests + run: yarn test diff --git a/shared/commons/package.dist.json b/shared/commons/package.dist.json new file mode 100644 index 000000000..d5e32482e --- /dev/null +++ b/shared/commons/package.dist.json @@ -0,0 +1,3 @@ +{ + "private": false +} diff --git a/shared/net/package.dist.json b/shared/net/package.dist.json new file mode 100644 index 000000000..d5e32482e --- /dev/null +++ b/shared/net/package.dist.json @@ -0,0 +1,3 @@ +{ + "private": false +} From 6687f93f6669e2dfad6cdfe94be7258eaa87c946 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 26 Jul 2022 12:19:21 -0400 Subject: [PATCH 020/147] feat: specification, crypto projects --- shared/commons/lib/Logger.ts | 13 +- shared/commons/lib/TypeSerializer.ts | 7 +- shared/commons/lib/errors.ts | 70 ++++++ shared/commons/lib/hashUtils.ts | 26 +- shared/crypto/bin/cli.ts | 6 + shared/crypto/cli.ts | 133 ++++++++++ shared/crypto/index.ts | 0 shared/crypto/interfaces/IKeyringSettings.ts | 13 + shared/crypto/lib/Keypair.ts | 142 +++++++++++ shared/crypto/lib/Keyring.ts | 193 +++++++++++++++ shared/crypto/lib/KeyringSignature.ts | 160 ++++++++++++ shared/crypto/lib/KeyringTree.ts | 116 +++++++++ shared/crypto/lib/MerkleTree.ts | 213 ++++++++++++++++ shared/crypto/lib/errors.ts | 20 ++ shared/crypto/lib/pkiUtils.ts | 17 ++ shared/crypto/package.json | 14 ++ shared/crypto/test/Keypair.test.ts | 29 +++ shared/crypto/test/Keyring.test.ts | 53 ++++ shared/crypto/test/Merkle.model.test.ts | 234 ++++++++++++++++++ shared/net/errors/RemoteError.ts | 32 +++ shared/net/lib/ConnectionToClient.ts | 10 +- shared/net/lib/ConnectionToCore.ts | 2 +- shared/net/lib/HttpTransportToClient.ts | 38 ++- shared/net/lib/HttpTransportToCore.ts | 136 ++++++++++ shared/package.json | 4 +- shared/specification/.eslintrc.js | 8 + shared/specification/common.ts | 35 +++ shared/specification/index.ts | 43 ++++ shared/specification/mainchain/BlockApis.ts | 66 +++++ .../mainchain/BlockHeaderApis.ts | 28 +++ shared/specification/mainchain/CoinageApis.ts | 35 +++ .../mainchain/SidechainGovernanceApis.ts | 33 +++ .../mainchain/TransactionApis.ts | 69 ++++++ shared/specification/mainchain/index.ts | 28 +++ shared/specification/package.json | 10 + .../sidechain/FundingTransferApis.ts | 41 +++ .../specification/sidechain/MicronoteApis.ts | 67 +++++ .../sidechain/MicronoteBatchApis.ts | 51 ++++ shared/specification/sidechain/NoteApis.ts | 23 ++ .../sidechain/SidechainSnapshot.proto | 67 +++++ shared/specification/sidechain/StakeApis.ts | 46 ++++ shared/specification/sidechain/WalletApis.ts | 27 ++ shared/specification/sidechain/index.ts | 31 +++ shared/specification/tsconfig.json | 8 + shared/specification/types/BlockError.ts | 41 +++ shared/specification/types/CoinageType.ts | 6 + .../types/IArithmeticEncoding.ts | 9 + .../types/IAuthorizedSidechain.ts | 21 ++ .../specification/types/IBitDatumHistory.ts | 17 ++ shared/specification/types/IBlock.ts | 27 ++ shared/specification/types/IBlockHeader.ts | 28 +++ shared/specification/types/IBlockSettings.ts | 29 +++ shared/specification/types/ICoinage.ts | 25 ++ shared/specification/types/ICoordinator.ts | 15 ++ shared/specification/types/IDatum.ts | 16 ++ shared/specification/types/IDatumSummary.ts | 17 ++ shared/specification/types/IGrantTransfer.ts | 12 + shared/specification/types/IMerkleProof.ts | 16 ++ shared/specification/types/IMicronoteBatch.ts | 14 ++ .../types/IMicronoteBatchDatums.ts | 13 + shared/specification/types/INote.ts | 18 ++ shared/specification/types/IPayment.ts | 26 ++ .../specification/types/IProofOfKnowedge.ts | 33 +++ shared/specification/types/IStakeSettings.ts | 23 ++ shared/specification/types/IStakeSignature.ts | 12 + shared/specification/types/ITransaction.ts | 19 ++ .../specification/types/ITransactionOutput.ts | 15 ++ .../specification/types/ITransactionSource.ts | 18 ++ .../types/ITransactionSourceSignatureData.ts | 24 ++ .../types/IWalletOwnershipProof.ts | 13 + .../specification/types/IWalletSignature.ts | 16 ++ .../types/IWebhitsClaimAddress.ts | 16 ++ shared/specification/types/IXoredCandidate.ts | 38 +++ .../types/IXoredCandidateSummary.ts | 16 ++ shared/specification/types/LedgerType.ts | 5 + shared/specification/types/NoteType.ts | 14 ++ .../specification/types/TransactionError.ts | 26 ++ shared/specification/types/TransactionType.ts | 8 + shared/specification/utils/IZodApi.ts | 13 + shared/tsconfig.json | 8 +- shared/yarn.lock | 15 ++ 81 files changed, 3056 insertions(+), 23 deletions(-) create mode 100644 shared/commons/lib/errors.ts create mode 100644 shared/crypto/bin/cli.ts create mode 100644 shared/crypto/cli.ts create mode 100644 shared/crypto/index.ts create mode 100644 shared/crypto/interfaces/IKeyringSettings.ts create mode 100644 shared/crypto/lib/Keypair.ts create mode 100644 shared/crypto/lib/Keyring.ts create mode 100644 shared/crypto/lib/KeyringSignature.ts create mode 100644 shared/crypto/lib/KeyringTree.ts create mode 100644 shared/crypto/lib/MerkleTree.ts create mode 100644 shared/crypto/lib/errors.ts create mode 100644 shared/crypto/lib/pkiUtils.ts create mode 100644 shared/crypto/package.json create mode 100644 shared/crypto/test/Keypair.test.ts create mode 100644 shared/crypto/test/Keyring.test.ts create mode 100644 shared/crypto/test/Merkle.model.test.ts create mode 100644 shared/net/errors/RemoteError.ts create mode 100644 shared/net/lib/HttpTransportToCore.ts create mode 100644 shared/specification/.eslintrc.js create mode 100644 shared/specification/common.ts create mode 100644 shared/specification/index.ts create mode 100644 shared/specification/mainchain/BlockApis.ts create mode 100644 shared/specification/mainchain/BlockHeaderApis.ts create mode 100644 shared/specification/mainchain/CoinageApis.ts create mode 100644 shared/specification/mainchain/SidechainGovernanceApis.ts create mode 100644 shared/specification/mainchain/TransactionApis.ts create mode 100644 shared/specification/mainchain/index.ts create mode 100644 shared/specification/package.json create mode 100644 shared/specification/sidechain/FundingTransferApis.ts create mode 100644 shared/specification/sidechain/MicronoteApis.ts create mode 100644 shared/specification/sidechain/MicronoteBatchApis.ts create mode 100644 shared/specification/sidechain/NoteApis.ts create mode 100644 shared/specification/sidechain/SidechainSnapshot.proto create mode 100644 shared/specification/sidechain/StakeApis.ts create mode 100644 shared/specification/sidechain/WalletApis.ts create mode 100644 shared/specification/sidechain/index.ts create mode 100644 shared/specification/tsconfig.json create mode 100644 shared/specification/types/BlockError.ts create mode 100644 shared/specification/types/CoinageType.ts create mode 100644 shared/specification/types/IArithmeticEncoding.ts create mode 100644 shared/specification/types/IAuthorizedSidechain.ts create mode 100644 shared/specification/types/IBitDatumHistory.ts create mode 100644 shared/specification/types/IBlock.ts create mode 100644 shared/specification/types/IBlockHeader.ts create mode 100644 shared/specification/types/IBlockSettings.ts create mode 100644 shared/specification/types/ICoinage.ts create mode 100644 shared/specification/types/ICoordinator.ts create mode 100644 shared/specification/types/IDatum.ts create mode 100644 shared/specification/types/IDatumSummary.ts create mode 100644 shared/specification/types/IGrantTransfer.ts create mode 100644 shared/specification/types/IMerkleProof.ts create mode 100644 shared/specification/types/IMicronoteBatch.ts create mode 100644 shared/specification/types/IMicronoteBatchDatums.ts create mode 100644 shared/specification/types/INote.ts create mode 100644 shared/specification/types/IPayment.ts create mode 100644 shared/specification/types/IProofOfKnowedge.ts create mode 100644 shared/specification/types/IStakeSettings.ts create mode 100644 shared/specification/types/IStakeSignature.ts create mode 100644 shared/specification/types/ITransaction.ts create mode 100644 shared/specification/types/ITransactionOutput.ts create mode 100644 shared/specification/types/ITransactionSource.ts create mode 100644 shared/specification/types/ITransactionSourceSignatureData.ts create mode 100644 shared/specification/types/IWalletOwnershipProof.ts create mode 100644 shared/specification/types/IWalletSignature.ts create mode 100644 shared/specification/types/IWebhitsClaimAddress.ts create mode 100644 shared/specification/types/IXoredCandidate.ts create mode 100644 shared/specification/types/IXoredCandidateSummary.ts create mode 100644 shared/specification/types/LedgerType.ts create mode 100644 shared/specification/types/NoteType.ts create mode 100644 shared/specification/types/TransactionError.ts create mode 100644 shared/specification/types/TransactionType.ts create mode 100644 shared/specification/utils/IZodApi.ts diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index a8f2ddf99..2a3b600d3 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -121,15 +121,23 @@ function translateValueToPrintable(value: any, depth = 0): any { if (value instanceof RegExp) { return `/${value.source}/${value.flags}`; } - if ((value as any).toJSON) { - return (value as any).toJSON(); + if (value instanceof BigInt || typeof value === 'bigint') { + return `${value.toString()}n`; } + if (Buffer.isBuffer(value)) { + if ((value as Buffer).length <= 256) return `0x${value.toString('hex')}`; + } + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { return value; } if (depth > 2) return value; + if ((value as any).toJSON) { + return (value as any).toJSON(); + } + if (typeof value === 'object') { if (Array.isArray(value)) { return value.map(x => translateValueToPrintable(x, depth + 1)); @@ -252,6 +260,7 @@ export function registerNamespaceMapping( } function isEnabled(modulePath: string): boolean { + if (process.env.ULX_DEBUG === '1' || process.env.ULX_DEBUG === 'true') return true; if (modulePath in logFilters.enabledNamesCache) return logFilters.enabledNamesCache[modulePath]; if (modulePath[modulePath.length - 1] === '*') { diff --git a/shared/commons/lib/TypeSerializer.ts b/shared/commons/lib/TypeSerializer.ts index 44cfac31b..d758e0254 100644 --- a/shared/commons/lib/TypeSerializer.ts +++ b/shared/commons/lib/TypeSerializer.ts @@ -61,10 +61,10 @@ export default class TypeSerializer { public static stringify( object: T, - options?: { ignoreProperties?: (keyof T)[]; sortKeys?: boolean }, + options?: { ignoreProperties?: (keyof T)[]; sortKeys?: boolean; format?: boolean }, ): string { const final = TypeSerializer.replace(object, options); - return JSON.stringify(final); + return JSON.stringify(final, null, options?.format ? 2 : null); } public static replace( @@ -99,6 +99,7 @@ export default class TypeSerializer { private static replacer(_: string, value: any): any { if (value === null || value === undefined) return value; + if (value === true || value === false) return value; if (Number.isNaN(value)) { return { __type: Types.NaN }; @@ -114,7 +115,7 @@ export default class TypeSerializer { const type = typeof value; if (type === Types.boolean || type === Types.string || type === Types.number) return value; - if (type === Types.bigint) { + if (type === Types.bigint || value instanceof BigInt) { return { __type: Types.bigint, value: value.toString() }; } diff --git a/shared/commons/lib/errors.ts b/shared/commons/lib/errors.ts new file mode 100644 index 000000000..41bdb44a8 --- /dev/null +++ b/shared/commons/lib/errors.ts @@ -0,0 +1,70 @@ +// eslint-disable-next-line max-classes-per-file +class UlixeeError extends Error { + constructor(override readonly message, readonly code, protected data?: object) { + // Calling parent constructor of base Error class. + super(message); + + this.code = code; + + // Capturing stack trace, excluding constructor call from it. + Error.captureStackTrace(this, this.constructor); + } + + public toJSON(): unknown { + return { + message: this.message, + ...this, + }; + } + + public override toString(): string { + const extras = this.data ? `\n${JSON.stringify(this.data, null, 2)}` : ''; + return `${this.message} [${this.code}] ${extras}`; + } +} + +class InsufficientResourcesError extends UlixeeError { + constructor(message, resourceType) { + super(message || 'Insufficient network resources', 'processing::resources', { resourceType }); + } +} + +class ValidationError extends UlixeeError { + constructor(errors) { + super('Invalid request', 'invalid::parameters', { errors }); + } +} + +class UnapprovedSidechainError extends UlixeeError { + constructor() { + super('Unapproved sidechain used', 'invalid::sidechain'); + } +} + +class APIError extends UlixeeError { + constructor(readonly status, json) { + super(json.message || 'Unexpected error', json.code, json); + } +} + +class ClientError extends UlixeeError { + constructor(code, message) { + super(message, code); + } +} + +class MalformedRequestError extends UlixeeError { + constructor(message) { + super(message, 'invalid::request'); + } +} + +export { + APIError, + UlixeeError, + ValidationError, + InsufficientResourcesError, + ClientError, + UnapprovedSidechainError, + MalformedRequestError, +}; diff --git a/shared/commons/lib/hashUtils.ts b/shared/commons/lib/hashUtils.ts index f72847f66..62d9ec5a3 100644 --- a/shared/commons/lib/hashUtils.ts +++ b/shared/commons/lib/hashUtils.ts @@ -6,9 +6,19 @@ export function sha3(data: Buffer | string): Buffer { return createHash('sha3-256').update(data).digest(); } -export function encodeHash(digest: Buffer, prefix: 'scr' | 'dbx'): string { +export function encodeHash(digest: Buffer, prefix: 'scr' | 'dbx' | 'ar'): string { const words = bech32m.toWords(digest); - return bech32m.encode(prefix, words); + return bech32m.encode(prefix, words, 256); +} + +export function decodeHash(hash: string, expectedPrefix: 'scr' | 'dbx' | 'ar'): Buffer { + const { prefix, words } = bech32m.decode(hash, 256); + if (prefix !== expectedPrefix) { + throw new Error( + `The encoded hash had a different prefix (${prefix}) than expected (${expectedPrefix}).`, + ); + } + return Buffer.from(bech32m.fromWords(words)); } export function sortedJsonStringify(obj: T | null, ignoreProperties: (keyof T)[] = []): string { @@ -21,9 +31,15 @@ export function sortedJsonStringify(obj: T | null, ignoreProperties: (keyof T return TypeSerializer.stringify(obj, { ignoreProperties, sortKeys: true }); } -export function hashObject(obj: T, ignoreProperties: (keyof T)[] = []): Buffer { +export function hashObject( + obj: T, + options?: { prefix?: Buffer; ignoreProperties?: (keyof T)[] }, +): Buffer { // sort keys for consistent hash - const json = sortedJsonStringify(obj, ignoreProperties); + const json = sortedJsonStringify(obj, options?.ignoreProperties); + + let buffer = Buffer.from(json); + if (options?.prefix) buffer = Buffer.concat([options.prefix, buffer]); - return createHash('sha3-256').update(Buffer.from(json)).digest(); + return createHash('sha3-256').update(buffer).digest(); } diff --git a/shared/crypto/bin/cli.ts b/shared/crypto/bin/cli.ts new file mode 100644 index 000000000..d39c39f46 --- /dev/null +++ b/shared/crypto/bin/cli.ts @@ -0,0 +1,6 @@ +#!/usr/bin/env node + +import '@ulixee/commons/lib/SourceMapSupport'; +import cli from '../cli'; + +cli().name('@ulixee/crypto').parse(); diff --git a/shared/crypto/cli.ts b/shared/crypto/cli.ts new file mode 100644 index 000000000..f9a3a092a --- /dev/null +++ b/shared/crypto/cli.ts @@ -0,0 +1,133 @@ +import { Command } from 'commander'; +import { APIError } from '@ulixee/commons/lib/errors'; +import { assert } from '@ulixee/commons/lib/utils'; +import { randomBytes } from 'crypto'; +import Keypair from '@ulixee/crypto/lib/Keypair'; +import * as Path from 'path'; +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import Keyring from './lib/Keyring'; +import IKeyringSettings, { IKeyType } from './interfaces/IKeyringSettings'; + +const logError = (err: Error): void => { + if (err instanceof APIError) { + console.log(`KEYS API ERROR: ${err.toString()}`); // eslint-disable-line no-console + } else { + console.log(`\nKEYS ERROR: ${err.message}\n`); // eslint-disable-line no-console + } +}; + +const { version } = require('./package.json'); + +export default function cliCommands(): Command { + const cryptoCommands = new Command().version(version); + + cryptoCommands + .command('keyring') + .description('Create a new Wallet keyring (multi-capability + multisig keys).') + .argument( + '[keyPattern]', + 'The key pattern you wish to create. Specify which actions each key in your Keyring should be used for. T=Transfer, C=Claim, U=Universal. eg, TTC = 3 key ring with 2 transfer keys and 1 claim key', + 'U', + ) + .argument('[filename]', 'Where do you want to save this Keyring?', 'UlixeeKeyring.json') + .option( + '-t, --transfer-signatures ', + 'How many signatures should be required for transfers?', + parseInt, + 1, + ) + .option( + '-s, --transfer-salt ', + 'Add salt (noise) to your transfer signatures', + randomBytes(32).toString('base64'), + ) + .option( + '-c, --claim-signatures ', + 'How many signatures should be required for claims (coinage claims, voting)?', + parseInt, + 1, + ) + .option( + '-d, --claim-salt ', + 'Add salt (noise) to your claims signatures', + randomBytes(32).toString('base64'), + ) + .action(async (keyPattern: string, filename: string, args): Promise => { + try { + const { transferSignatures, claimSignatures, transferSalt, claimSalt } = args; + const keys = keyPattern.length; + assert(keyPattern.length <= 6, 'A max of 6 keys is allowed in a keyring.'); + assert(keyPattern.length > 0, 'You must specify at least one key'); + assert( + keyPattern.match(/[TCU]+/i), + 'Valid key options are T=Transfer, C=Claim, U=Universal', + ); + assert( + transferSignatures > 0, + 'You must require at least one transfer signature (-t, --transfer-signatures).', + ); + assert( + claimSignatures > 0, + 'You must require at least one claim signature (-c, --claim-signatures)', + ); + assert( + transferSignatures <= keys, + 'You cannot have more transfer signatures required than total keys', + ); + assert( + claimSignatures <= keys, + 'You cannot have more claim signatures required than total keys', + ); + + const keyTypes = [...keyPattern] as IKeyType[]; + const keypairs = await Promise.all(keyTypes.map(Keypair.create)); + const keyringSettings: IKeyringSettings = { + keyTypes, + transferSignatureSettings: transferSignatures, + transferSignatureSalt: transferSalt ? Buffer.from(transferSalt) : null, + claimSignatureSettings: claimSignatures, + claimSignatureSalt: claimSalt ? Buffer.from(claimSalt) : null, + }; + + const keyring = Keyring.createFromKeypairs(keypairs, keyringSettings); + + if (filename.endsWith('.json')) { + filename = filename.replace(Path.extname(filename), ''); + } + const filepath = await keyring.save(true, Path.basename(filename), Path.dirname(filename)); + console.log('Wrote address: %s to %s', keyring.address, filepath); // eslint-disable-line no-console + console.log(TypeSerializer.stringify(keyring.toJSON(), { format: true })); // eslint-disable-line no-console + } catch (err) { + logError(err); + } + }); + + cryptoCommands + .command('key') + .description( + 'Create a Network key (ed25519 key). It will be used to anonymously secure your requests.', + ) + .option('-p, --passphrase ', 'Save this key with a passphrase (pkcs8 format).') + .option( + '-c, --passphrase-cipher ', + 'Encrypt the key with a cipher (pkcs8 format).', + Keypair.defaultPkcsCipher, + ) + .option( + '-f, --filename ', + 'Save this keypair to a filepath. If not specified, will be console logged.', + ) + .action(async ({ path, passphrase, cipher }) => { + const keypair = await Keypair.create(); + + if (path) { + await keypair.save(path, { passphrase, cipher }); + const finalPath = await this.lockfile.save(path); + console.log('Saved to %s', finalPath); // eslint-disable-line no-console + } else { + console.log(keypair.export(passphrase, cipher)); // eslint-disable-line no-console + } + }); + + return cryptoCommands; +} diff --git a/shared/crypto/index.ts b/shared/crypto/index.ts new file mode 100644 index 000000000..e69de29bb diff --git a/shared/crypto/interfaces/IKeyringSettings.ts b/shared/crypto/interfaces/IKeyringSettings.ts new file mode 100644 index 000000000..5784f109f --- /dev/null +++ b/shared/crypto/interfaces/IKeyringSettings.ts @@ -0,0 +1,13 @@ +export default interface IKeyringSettings { + keyTypes: IKeyType[]; + transferSignatureSettings?: number; // default is all public keys + transferSignatureSalt?: Buffer; + claimSignatureSettings?: number; // default is only 1 key for claims + claimSignatureSalt?: Buffer; +} + +const UniversalKey = 'U'; +const ClaimsKey = 'C'; +const TransferKey = 'T'; +type IKeyType = typeof UniversalKey | typeof ClaimsKey | typeof TransferKey; +export { UniversalKey, ClaimsKey, IKeyType, TransferKey }; diff --git a/shared/crypto/lib/Keypair.ts b/shared/crypto/lib/Keypair.ts new file mode 100644 index 000000000..d380b6d3d --- /dev/null +++ b/shared/crypto/lib/Keypair.ts @@ -0,0 +1,142 @@ +import { promises as fs, readFileSync } from 'fs'; +import * as path from 'path'; +import { promisify } from 'util'; +import { + createPrivateKey, + generateKeyPair, + generateKeyPairSync, + KeyObject, + sign, + verify, +} from 'crypto'; +import { sha3 } from '@ulixee/commons/lib/hashUtils'; +import { existsAsync } from '@ulixee/commons/lib/fileUtils'; +import Log from '@ulixee/commons/lib/Logger'; +import { createPublicKeyFromBytes, getPublicKeyBytes } from './pkiUtils'; +import { UnreadableKeysError } from './errors'; + +const { log } = Log(module); + +const generateKeyPairAsync = promisify(generateKeyPair); + +export default class Keypair { + public static defaultPkcsCipher = 'aes-256-cbc'; + public readonly privateKey: KeyObject; + + public get publicKey(): Buffer { + this.#publicKeyBytes ??= getPublicKeyBytes(this.privateKey); + return this.#publicKeyBytes; + } + + #publicKeyBytes: Buffer; + + constructor(privateKey: KeyObject) { + if (!privateKey) { + throw new UnreadableKeysError(`Cannot read private key`); + } + this.privateKey = privateKey; + } + + public sign(hashedMessage: Buffer): Buffer { + return sign(null, hashedMessage, this.privateKey); + } + + public verifyKeys(): void { + const hashedMessage = sha3(Buffer.from('signed_test_message')); + const signature = this.sign(hashedMessage); + const isValid = Keypair.verify(this.publicKey, hashedMessage, signature); + if (!isValid) { + throw new UnreadableKeysError('This keypair does not match the ED25519 spec'); + } + } + + public export(passphrase?: string, cipher?: string): string { + if (passphrase) { + cipher ??= Keypair.defaultPkcsCipher; + } + return this.privateKey.export({ + type: 'pkcs8', + format: 'pem', + cipher, + passphrase, + }) as string; + } + + public async save( + filepath: string, + options?: { passphrase?: string; cipher?: string }, + ): Promise { + if (filepath) { + if (!path.isAbsolute(filepath)) { + filepath = path.join(process.cwd(), filepath); + } + if (!(await existsAsync(path.dirname(filepath)))) { + await fs.mkdir(path.dirname(filepath), { recursive: true }); + } + } + if (!filepath) throw new Error('keypair is missing filepath'); + + await fs.writeFile(filepath, this.export(options?.passphrase, options?.cipher)); + return filepath; + } + + // CLASS METHODS //////////////////////// + + public static loadFromFile(filepath: string, options?: { keyPassphrase?: string }): Keypair { + if (!path.isAbsolute(filepath)) { + filepath = path.join(process.cwd(), filepath); + } + const data = readFileSync(filepath, 'utf8'); + return this.loadFromPem(data, options); + } + + public static loadFromPem(data: string, options?: { keyPassphrase?: string }): Keypair { + const privateKey = createPrivateKey({ + key: data, + format: 'pem', + type: 'pkcs8', + passphrase: options?.keyPassphrase, + }); + const keypair = new Keypair(privateKey); + keypair.verifyKeys(); + return keypair; + } + + public static createSync(): Keypair { + const key = generateKeyPairSync('ed25519'); + const pair = new Keypair(key.privateKey); + pair.verifyKeys(); + return pair; + } + + public static async create(): Promise { + const key = await generateKeyPairAsync('ed25519'); + const pair = new Keypair(key.privateKey); + pair.verifyKeys(); + return pair; + } + + public static verify( + publicKey: string | Buffer | KeyObject, + hashedMessage: Buffer, + signature: Buffer, + ): boolean { + if (!signature || !signature.length || !hashedMessage || !hashedMessage.length || !publicKey) + return false; + + if (typeof publicKey === 'string') { + publicKey = Buffer.from(publicKey, 'hex'); + } + + if (publicKey instanceof Buffer) { + publicKey = createPublicKeyFromBytes(publicKey); + } + + try { + return verify(null, hashedMessage, publicKey, signature); + } catch (err) { + log.error('Error validating signature', err); + return false; + } + } +} diff --git a/shared/crypto/lib/Keyring.ts b/shared/crypto/lib/Keyring.ts new file mode 100644 index 000000000..2686a3669 --- /dev/null +++ b/shared/crypto/lib/Keyring.ts @@ -0,0 +1,193 @@ +import { decodeHash, encodeHash } from '@ulixee/commons/lib/hashUtils'; +import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; +import * as path from 'path'; +import * as fs from 'fs'; +import Keypair from '@ulixee/crypto/lib/Keypair'; +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import IWalletSignature from '@ulixee/specification/types/IWalletSignature'; +import IKeyringSettings, { + ClaimsKey, + TransferKey, + UniversalKey, +} from '../interfaces/IKeyringSettings'; +import KeyringTree from './KeyringTree'; +import KeyringSignature from './KeyringSignature'; + +let isFilepathInitialized = false; + +export default class Keyring { + public readonly address: string; + public keyringSettings: IKeyringSettings; + public keyringMerkleTree: MerkleTree; + + public readonly transferKeys: Keypair[] = []; + public readonly claimKeys: Keypair[] = []; + + private readonly loadedKeypairsAtIndexes: Keypair[] = []; + + constructor( + merkleTreeLeaves: Buffer[], + settings: IKeyringSettings, + loadedKeypairsAtIndexes: (Keypair | undefined)[], + ) { + this.loadedKeypairsAtIndexes = loadedKeypairsAtIndexes; + + this.keyringSettings = settings ?? ({} as any); + this.keyringSettings.keyTypes ??= loadedKeypairsAtIndexes.map(() => UniversalKey); + for (let i = 0; i <= loadedKeypairsAtIndexes.length; i += 1) { + if (loadedKeypairsAtIndexes[i]) { + const keyType = this.keyringSettings.keyTypes[i]; + + if (keyType === UniversalKey || keyType === TransferKey) { + this.transferKeys.push(loadedKeypairsAtIndexes[i]); + } + if (keyType === UniversalKey || keyType === ClaimsKey) { + this.claimKeys.push(loadedKeypairsAtIndexes[i]); + } + } + } + this.keyringSettings.transferSignatureSettings ||= this.transferKeys.length; + this.keyringSettings.claimSignatureSettings ||= 1; + this.keyringMerkleTree = new MerkleTree(merkleTreeLeaves); + this.address = Keyring.encodeAddress(this.keyringMerkleTree.getRoot()); + } + + public async save(format = false, filename?: string, relativeTo?: string): Promise { + const basePath = relativeTo || path.join(process.cwd(), 'keyrings'); + if (!isFilepathInitialized) { + if (!fs.existsSync(basePath)) fs.mkdirSync(basePath, { recursive: true }); + isFilepathInitialized = true; + } + + const json = TypeSerializer.stringify(this.toJSON(), { format }); + const filepath = path.resolve(basePath, `${filename || this.address}.json`); + await fs.promises.writeFile(filepath, json, { encoding: 'utf8' }); + return filepath; + } + + public sign(hash: Buffer, keypairIndexes: number[], isClaim = false): IWalletSignature { + const keypairs: Keypair[] = []; + + for (let i = 0; i < this.loadedKeypairsAtIndexes.length; i += 1) { + if (!keypairIndexes.includes(i)) continue; + this.verifyKeyType(i, isClaim); + const key = this.loadedKeypairsAtIndexes[i]; + if (key) keypairs.push(key); + } + + return KeyringSignature.create( + hash, + keypairs, + this.keyringMerkleTree, + this.keyringSettings, + isClaim, + ); + } + + public verifyKeyType(index: number, isClaim: boolean): void { + const keyType = this.keyringSettings.keyTypes[index]; + const isUniversalKey = keyType === UniversalKey; + + if (!isUniversalKey) { + if (isClaim && keyType !== ClaimsKey) + throw new Error( + `Invalid key index provided (${index}). Index not valid for claim transactions.`, + ); + if (!isClaim && keyType !== TransferKey) + throw new Error( + `Invalid key index provided (${index}). Index not valid for transfer transactions.`, + ); + } + } + + public toJSON(): IKeyringJson { + return { + settings: this.keyringSettings, + address: this.address, + merkleLeaves: this.keyringMerkleTree.leaves, + loadedKeysAtIndexes: this.loadedKeypairsAtIndexes.map(x => (x ? x.export() : null)), + }; + } + + public static verify( + address: string, + hashedMessage: Buffer, + signature: IWalletSignature, + isClaim = false, + ): boolean { + const treeRoot = this.decodeAddress(address); + const keyringSignature = new KeyringSignature(treeRoot, signature); + return !keyringSignature.isInvalid(hashedMessage, isClaim); + } + + public static createFromKeypairs(keypairs: Keypair[], settings?: IKeyringSettings): Keyring { + settings ??= { keyTypes: keypairs.map(() => UniversalKey) }; + + settings.transferSignatureSettings ??= settings.keyTypes.filter( + x => x === UniversalKey || x === TransferKey, + ).length; + settings.claimSignatureSettings ??= 1; + + const merkleTree = KeyringTree.create( + keypairs.map(x => x.publicKey), + settings, + ); + settings.keyTypes ??= keypairs.map(() => UniversalKey); + + return new Keyring(merkleTree.leaves, settings, keypairs); + } + + public static fromStored(stored: IKeyringJson): Keyring { + const { merkleLeaves, loadedKeysAtIndexes, address, settings } = stored; + + const keyring = new Keyring( + merkleLeaves, + settings, + loadedKeysAtIndexes.map(x => (x ? Keypair.loadFromPem(x) : null)), + ); + if (keyring.address !== address) + throw new Error( + `Failed to load Address Keyring. Different key calculated. (calculated: ${keyring.address}, stored: ${address})`, + ); + return keyring; + } + + public static readFromPath(filepath: string, relativeToDir = process.cwd()): Keyring { + if (!path.isAbsolute(filepath)) filepath = path.resolve(relativeToDir, filepath); + const data = fs.readFileSync(filepath, { encoding: 'utf8' }); + const keyring = TypeSerializer.parse(data); + return Keyring.fromStored(keyring); + } + + public static readFromFile(address: string, relativeToDir = process.cwd()): Keyring { + const filepath = path.resolve(relativeToDir, 'keyrings', `${address}.json`); + return Keyring.readFromPath(filepath); + } + + public static getKeyIndices(settings: IKeyringSettings, isClaim: boolean): number[] { + const publicKeyIndices: number[] = []; + for (let i = 0; i < settings.keyTypes.length; i += 1) { + const type = settings.keyTypes[i]; + + if (type === UniversalKey) publicKeyIndices.push(i); + else if (isClaim && type === ClaimsKey) publicKeyIndices.push(i); + else if (!isClaim && type === TransferKey) publicKeyIndices.push(i); + } + return publicKeyIndices; + } + + public static encodeAddress(treeRoot: Buffer): string { + return encodeHash(treeRoot, 'ar'); + } + + public static decodeAddress(address: string): Buffer { + return decodeHash(address, 'ar'); + } +} + +interface IKeyringJson { + address: string; + merkleLeaves: Buffer[]; + settings: IKeyringSettings; + loadedKeysAtIndexes: (string | null)[]; +} diff --git a/shared/crypto/lib/KeyringSignature.ts b/shared/crypto/lib/KeyringSignature.ts new file mode 100644 index 000000000..50e546e2f --- /dev/null +++ b/shared/crypto/lib/KeyringSignature.ts @@ -0,0 +1,160 @@ +import { IWalletOwnershipProof, IWalletSignature } from '@ulixee/specification'; +import Keypair from '@ulixee/crypto/lib/Keypair'; +import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; +import { sha3 } from '@ulixee/commons/lib/hashUtils'; +import { MerklePosition } from '@ulixee/specification/types/IMerkleProof'; +import IKeyringSettings from '../interfaces/IKeyringSettings'; +import KeyringTree from './KeyringTree'; +import Keyring from './Keyring'; + +export default class KeyringSignature { + public get signatureSettings(): IWalletSignature['signatureSettings'] { + return this.signature.signatureSettings; + } + + constructor(readonly treeRoot: Buffer, readonly signature: IWalletSignature) {} + + public isValidSignaturePosition(isClaim: boolean): boolean { + const proofsToRight = this.signatureSettings.settingsMerkleProofs.filter( + x => x.position === MerklePosition.Right, + ).length; + + // if this is a claim, must have no proofs to the right + if (isClaim && proofsToRight > 0) { + return false; + } + // if this is a transfer, there must be 1 proof to the right + if ( + isClaim === false && + (proofsToRight !== 1 || + this.signatureSettings.settingsMerkleProofs[0].position !== MerklePosition.Right) + ) { + return false; + } + return true; + } + + public isValidPublicKeyProof(owner: IWalletOwnershipProof): boolean { + const isValidProof = MerkleTree.verify( + owner.ownershipMerkleProofs, + sha3(owner.publicKey), + this.treeRoot, + ); + if (!isValidProof) return false; + + const publicKeyIndices = this.signature.signatureSettings.publicKeyIndices; + if (publicKeyIndices && publicKeyIndices.length) { + const index = MerkleTree.getLeafIndex(owner.ownershipMerkleProofs); + if (publicKeyIndices.includes(index) === false) { + return false; + } + } + return true; + } + + public isValidSignatureSettingsProof(): boolean { + // verify the signature count location + return MerkleTree.verify( + this.signatureSettings.settingsMerkleProofs, + KeyringTree.createLeaf( + this.signatureSettings.countRequired, + this.signatureSettings.salt, + this.signatureSettings.publicKeyIndices, + ), + this.treeRoot, + ); + } + + public isInvalid(messageHash: Buffer, isClaim: boolean): string { + const isValidSignatureSettings = + this.isValidSignatureSettingsProof() && this.isValidSignaturePosition(isClaim); + if (!isValidSignatureSettings) { + return 'Invalid signature required proof provided'; + } + + const signatures: Buffer[] = []; + const seenPublicKeys = new Set(); + for (const signer of this.signature.signers) { + const publicKey = signer.publicKey.toString('hex'); + if (seenPublicKeys.has(publicKey)) { + continue; + } + seenPublicKeys.add(publicKey); + const isValidPublicKey = this.isValidPublicKeyProof(signer); + if (isValidPublicKey === false) { + return 'Invalid public key provided'; + } + + /** + * verify signatures of each public key + */ + const isMatch = Keypair.verify( + signer.publicKey, + sha3(Buffer.concat([messageHash, ...signatures])), + signer.signature, + ); + if (isMatch === false) { + return 'Invalid signature provided'; + } + signatures.push(signer.signature); + } + + // ensure signatures are unique + if (seenPublicKeys.size < this.signatureSettings.countRequired) { + return `Insufficient public key signatures provided ${seenPublicKeys.size} vs ${this.signatureSettings.countRequired} required`; + } + return null; + } + + public static buildSignatureSettings( + addressTree: MerkleTree, + keyringSettings: IKeyringSettings, + isClaim = false, + ): IWalletSignature['signatureSettings'] { + return { + countRequired: isClaim + ? keyringSettings.claimSignatureSettings + : keyringSettings.transferSignatureSettings, + settingsMerkleProofs: addressTree.getProofForIndex(isClaim ? -1 : -2), // notes are all transfers + salt: isClaim ? keyringSettings.claimSignatureSalt : keyringSettings.transferSignatureSalt, + publicKeyIndices: Keyring.getKeyIndices(keyringSettings, isClaim), + }; + } + + public static create( + hash: Buffer, + keypairs: Keypair[], + addressTree: MerkleTree, + keyringSettings: IKeyringSettings, + isClaim = false, + ): IWalletSignature { + const signatures: Buffer[] = []; + return { + signers: keypairs.map(key => { + const publicKeyProof = KeyringTree.getPublicKeyProof(addressTree, key.publicKey); + const ownerProof: IWalletOwnershipProof = { + ownershipMerkleProofs: publicKeyProof, + publicKey: key.publicKey, + signature: key.sign(sha3(Buffer.concat([hash, ...signatures]))), + }; + signatures.push(ownerProof.signature); + return ownerProof; + }), + signatureSettings: KeyringSignature.buildSignatureSettings( + addressTree, + keyringSettings, + isClaim, + ), + }; + } + + public static verify( + address: string, + signature: IWalletSignature, + messageHash: Buffer, + isClaim: boolean, + ): string | null { + const root = Keyring.decodeAddress(address); + return new KeyringSignature(root, signature).isInvalid(messageHash, isClaim); + } +} diff --git a/shared/crypto/lib/KeyringTree.ts b/shared/crypto/lib/KeyringTree.ts new file mode 100644 index 000000000..1a3ec10fa --- /dev/null +++ b/shared/crypto/lib/KeyringTree.ts @@ -0,0 +1,116 @@ +import { sha3 } from '@ulixee/commons/lib/hashUtils'; +import * as assert from 'assert'; +import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; +import { IMerkleProof } from '@ulixee/specification'; +import IKeyringSettings, { + ClaimsKey, + TransferKey, + UniversalKey, +} from '../interfaces/IKeyringSettings'; + +export default class KeyringTree { + public static getProof( + publicKey: Buffer, + isClaim: boolean, + merkleTree: MerkleTree, + ): { + signatureSettings: IMerkleProof[]; + publicKeyProof: IMerkleProof[]; + } { + const signatureSettings = KeyringTree.getSignatureSettingsProof(merkleTree, isClaim); + const publicKeyProof = KeyringTree.getPublicKeyProof(merkleTree, publicKey); + return { + signatureSettings, + publicKeyProof, + }; + } + + public static getPublicKeyProof(merkleTree: MerkleTree, publicKey: Buffer): IMerkleProof[] { + return merkleTree.getProof(sha3(publicKey)); + } + + public static getSignatureSettingsProof( + merkleTree: MerkleTree, + isClaim: boolean, + ): IMerkleProof[] { + return merkleTree.getProofForIndex(isClaim ? -1 : -2); + } + + public static create(publicKeys: Buffer[], details: IKeyringSettings): MerkleTree { + const { claimSignatureSettings } = details; + + let signatureSettings = details.transferSignatureSettings; + + assert(publicKeys.length > 0 && publicKeys.length <= 6, 'Must provide 1-6 valid public key(s)'); + assert( + signatureSettings ? signatureSettings < 7 : true, + 'Must require 6 or less signatures in a multisig', + ); + if (!signatureSettings) { + signatureSettings = publicKeys.length; + } + + const claimKeyIndices: number[] = []; + const transferKeyIndices: number[] = []; + for (let i = 0; i < details.keyTypes.length; i += 1) { + const type = details.keyTypes[i]; + if (type === UniversalKey || type === ClaimsKey) claimKeyIndices.push(i); + if (type === UniversalKey || type === TransferKey) transferKeyIndices.push(i); + } + + if (claimKeyIndices && claimKeyIndices.length) { + assert( + claimKeyIndices.length >= details.claimSignatureSettings, + 'Must provide enough valid public key indices to make claims', + ); + for (const index of claimKeyIndices) { + assert(index < publicKeys.length, 'Claim index must be within range of public keys'); + } + } + + if (transferKeyIndices && transferKeyIndices.length) { + assert( + transferKeyIndices.length >= signatureSettings, + 'Must provide enough valid public key indices to make transfers', + ); + for (const index of transferKeyIndices) { + assert(index < publicKeys.length, 'Transfer index must be within range of public keys'); + } + } + + const leaves = publicKeys.map(sha3); + let fillLeaves = 2; + if (leaves.length > 2) { + fillLeaves = 6; + } + // fill up to 4 or 8 leaves so tree is balanced + while (leaves.length < fillLeaves) { + leaves.push( + // empty string hashed + Buffer.from('1111111111111111111111111111111111111111111111111111111111111111', 'hex'), + ); + } + + leaves.push( + this.createLeaf(signatureSettings, details.transferSignatureSalt, transferKeyIndices), + ); + leaves.push( + this.createLeaf(claimSignatureSettings ?? 1, details.claimSignatureSalt, claimKeyIndices), + ); + + return new MerkleTree(leaves); + } + + public static createLeaf( + signatureSettings: number, + salt: Buffer, + publicKeyIndices: number[], + ): Buffer { + const parts = [ + signatureSettings ?? '', + salt?.toString('hex') ?? '', + publicKeyIndices?.join(',') ?? '', + ]; + return sha3(parts.join('')); + } +} diff --git a/shared/crypto/lib/MerkleTree.ts b/shared/crypto/lib/MerkleTree.ts new file mode 100644 index 000000000..546f83aee --- /dev/null +++ b/shared/crypto/lib/MerkleTree.ts @@ -0,0 +1,213 @@ +import { sha3 } from '@ulixee/commons/lib/hashUtils'; +import IMerkleProof, { MerklePosition } from '@ulixee/specification/types/IMerkleProof'; + +/** + * Use sha3 instead of default keccak used in the network. + * This ensures the leaves have a different (albeit slight) encoding + * + * Keccak has different padding than sha3 + * @param content + */ +function createHash(content: Buffer | string): Buffer { + return sha3(content); +} + +interface Layer { + nodes: Buffer[]; +} + +/** + * Class reprensenting a Merkle Tree - converted to typescript from: + * https://github.com/miguelmota/merkletreejs + * + * @namespace MerkleTree + */ +export default class MerkleTree { + public readonly leaves: Buffer[]; + public layers: Layer[]; + // NOTE: should be different than leaf algorithm to block second pre-image attacks + public nodeHashAlgorithm: (data: Buffer | string) => Buffer = createHash; + + /** + * @desc Constructs a Merkle Tree. + * All nodes and leaves are stored as Buffers. + * Lonely leaf nodes are promoted to the next level up without being hashed again. + * @param {Buffer[]} leaves - Array of hashed leaves. Each leaf must be a Buffer. + * @param nodeHashAlgorithm? {(data: Buffer | string) => Buffer}: Buffer) - if you need to override the algorithm for creating nodes + * + * const leaves = ['a', 'b', 'c'].map(x => createHash(x)) + * + * const tree = new MerkleTree(leaves) + */ + constructor(leaves: Buffer[], nodeHashAlgorithm?: (data: Buffer | string) => Buffer) { + this.leaves = leaves; + this.layers = [{ nodes: this.leaves }]; + if (nodeHashAlgorithm) { + this.nodeHashAlgorithm = nodeHashAlgorithm; + } + + this.createPyramid(this.leaves); + } + + /** + * getRoot + * @desc Returns the Merkle root hash as a Buffer. + * @return {Buffer} + * @example + * const root = tree.getRoot() + */ + public getRoot(): Buffer { + return this.layers[this.layers.length - 1].nodes[0] || Buffer.from([]); + } + + /** + * getProof + * @desc Returns the proof for a target leaf. + * @param {Buffer} leaf - Target leaf + * @param {Number} [index] - Target leaf index in leaves array. + * Use if there are leaves containing duplicate data in order to distinguish it. + * @return {IMerkleProof[]} - Array of objects containing a position property of type string + * with values of 'left' or 'right' and a data property of type Buffer. + * @example + * const proof = tree.getProof(leaves[2]) + * + * @example + * const leaves = ['a', 'b', 'a'].map(x => sha3(x)) + * const tree = new MerkleTree(leaves, sha3) + * const proof = tree.getProof(leaves[2], 2) + */ + public getProof(leaf: Buffer, index?: number): IMerkleProof[] { + let finalIndex = index; + if (typeof index !== 'number') { + finalIndex = this.leaves.findIndex(x => Buffer.compare(x, leaf) === 0); + } + + if (finalIndex <= -1) { + return []; + } + + return this.getProofForIndex(finalIndex); + } + + public getProofForIndex(index: number): IMerkleProof[] { + const proof: IMerkleProof[] = []; + + let finalIndex = index; + if (finalIndex < 0) { + finalIndex = this.leaves.length + finalIndex; + } + + for (const layer of this.layers) { + const isRightNode = finalIndex % 2; + const pairIndex = isRightNode ? finalIndex - 1 : finalIndex + 1; + + if (pairIndex < layer.nodes.length) { + const position = isRightNode ? MerklePosition.Left : MerklePosition.Right; + const thisProof = { hash: layer.nodes[pairIndex], position }; + proof.push(thisProof); + } + + // set finalIndex to parent finalIndex + finalIndex = (finalIndex / 2) | 0; + } + + return proof; + } + + private buildLayer(nodes: Buffer[]): Layer { + const layer: Layer = { nodes: [] }; + /** + * Go bottom up creating layers in a pyramid + */ + for (let i = 0; i < nodes.length - 1; i += 2) { + const left = nodes[i]; + const right = nodes[i + 1]; + const data = Buffer.concat([left, right]); + const hash = this.nodeHashAlgorithm(data); + + layer.nodes.push(hash); + } + + // is odd number of nodeTraversal + if (nodes.length % 2 === 1) { + // don't double hash - just push + const alreadyHashed = nodes[nodes.length - 1]; + layer.nodes.push(alreadyHashed); + } + return layer; + } + + private createPyramid(nodes: Buffer[]): void { + let nodeTraversal = nodes; + while (nodeTraversal.length > 1) { + /** + * create layer of the pyramid + */ + this.layers.push(this.buildLayer(nodeTraversal)); + + /** + * now combine entries from top layer (we keep going until there's only 1 entry) + */ + nodeTraversal = this.layers[this.layers.length - 1].nodes; + } + } + + /** + * verify + * @desc Returns true if the proof path (array of hashes) can connect the target node + * to the Merkle root. + * @param {IMerkleProof[]} proof - Array of proof objects that should connect + * target node to Merkle root. + * @param {Buffer} targetNode - Target node Buffer + * @param {Buffer} root - Merkle root Buffer + * @param {function} nodeHashAlgorithm - Function to hash nodes + * @return {Boolean} + * @example + * const root = tree.getRoot() + * const proof = tree.getProof(leaves[2]) + * const verified = tree.verify(proof, leaves[2], root) + * + */ + public static verify( + proof: IMerkleProof[], + targetNode: Buffer, + root: Buffer, + nodeHashAlgorithm: (data: Buffer | string) => Buffer = createHash, + ): boolean { + let hash = targetNode; + + if (!proof.length || !targetNode || !root) { + return false; + } + + for (const node of proof) { + const buffers = [hash]; + const nodeBuffer = node.hash; + if (node.position === MerklePosition.Left) { + buffers.unshift(nodeBuffer); + } else { + buffers.push(nodeBuffer); + } + + hash = nodeHashAlgorithm(Buffer.concat(buffers)); + } + + return Buffer.compare(hash, root) === 0; + } + + /** + * Get the index that the given proof correlates to. NOTE: only works in a balanced tree + * @param proof {IMerkleProof[]} + */ + public static getLeafIndex(proof: IMerkleProof[]): number { + let position = 0; + let layer = 0; + for (const p of proof) { + if (p.position === MerklePosition.Left) { + position += 2 ** layer; + } + layer += 1; + } + return position; + } +} diff --git a/shared/crypto/lib/errors.ts b/shared/crypto/lib/errors.ts new file mode 100644 index 000000000..3f104d7a0 --- /dev/null +++ b/shared/crypto/lib/errors.ts @@ -0,0 +1,20 @@ +// eslint-disable-next-line max-classes-per-file +import { UlixeeError } from '@ulixee/commons/lib/errors'; + +export class InvalidSignatureError extends UlixeeError { + constructor(message, readonly details = {}) { + super(message, 'ERR_SIGNATURE_INVALID', { details }); + } +} + +export class UnreadableKeysError extends UlixeeError { + constructor(message) { + super(message, 'ERR_KEY_UNREADABLE'); + } +} + +export class InvalidKeypairError extends UlixeeError { + constructor(message) { + super(message, 'ERR_KEY_INVALID'); + } +} diff --git a/shared/crypto/lib/pkiUtils.ts b/shared/crypto/lib/pkiUtils.ts new file mode 100644 index 000000000..818eeb323 --- /dev/null +++ b/shared/crypto/lib/pkiUtils.ts @@ -0,0 +1,17 @@ +import { createPublicKey, KeyObject } from 'crypto'; + +const ed25519DerPrefix = Buffer.from('302a300506032b6570032100', 'hex'); +export function getPublicKeyBytes(key: KeyObject): Buffer { + return createPublicKey(key).export({ type: 'spki', format: 'der' }).slice(ed25519DerPrefix.length); +} + +export function createPublicKeyFromBytes(bytes: Buffer): KeyObject { + if (bytes.length !== 32) { + throw new Error( + `Wrong key length (${bytes.length}) provided to importPublicKey. Must be 32 bytes (20 hex chars)`, + ); + } + const keyDer = Buffer.concat([ed25519DerPrefix, bytes]); + + return createPublicKey({ key: keyDer, format: 'der', type: 'spki' }); +} diff --git a/shared/crypto/package.json b/shared/crypto/package.json new file mode 100644 index 000000000..bb2592c78 --- /dev/null +++ b/shared/crypto/package.json @@ -0,0 +1,14 @@ +{ + "name": "@ulixee/crypto", + "version": "2.0.0-alpha.8", + "description": "Common crypto tools for Ulixee", + "license": "MIT", + "bin": "./bin/cli.js", + "dependencies": { + "bignumber.js": "^9.0.2", + "commander": "^9.3.0", + "@ulixee/commons": "2.0.0-alpha.8", + "@ulixee/specification": "2.0.0-alpha.8", + "@ulixee/crypto": "2.0.0-alpha.8" + } +} diff --git a/shared/crypto/test/Keypair.test.ts b/shared/crypto/test/Keypair.test.ts new file mode 100644 index 000000000..37b01a5bc --- /dev/null +++ b/shared/crypto/test/Keypair.test.ts @@ -0,0 +1,29 @@ +import Keypair from '../lib/Keypair'; + +test('can create a keypair', async () => { + await expect(Keypair.create()).resolves.toBeTruthy(); +}); + +test('can reload a keypair', async () => { + const keypair = await Keypair.create(); + const pem = keypair.export(); + + const keypair2 = Keypair.loadFromPem(pem); + expect(keypair2.publicKey).toEqual(keypair.publicKey); + expect(keypair2.publicKey).toHaveLength(32); + expect(keypair2.privateKey.type).toBe(keypair.privateKey.type); + expect(keypair2.privateKey.asymmetricKeyType).toBe(keypair.privateKey.asymmetricKeyType); + expect(keypair2.privateKey.asymmetricKeySize).toBe(keypair.privateKey.asymmetricKeySize); +}); + +test('can create a passphrase protected private key', async () => { + const keypair = await Keypair.create(); + const pem = keypair.export('password1'); + + expect(() => { + Keypair.loadFromPem(pem, { keyPassphrase: 'p' }); + }).toThrow(); + + const keypair2 = Keypair.loadFromPem(pem, { keyPassphrase: 'password1' }); + expect(keypair2.publicKey).toEqual(keypair.publicKey); +}); diff --git a/shared/crypto/test/Keyring.test.ts b/shared/crypto/test/Keyring.test.ts new file mode 100644 index 000000000..d4335d0a7 --- /dev/null +++ b/shared/crypto/test/Keyring.test.ts @@ -0,0 +1,53 @@ +import Keypair from '@ulixee/crypto/lib/Keypair'; +import Keyring from '../lib/Keyring'; +import KeyringSignature from '../lib/KeyringSignature'; +import { ClaimsKey, UniversalKey } from '../interfaces/IKeyringSettings'; + +let address: Keyring; +let keypair1: Keypair; +let keypair2: Keypair; + +beforeAll(async () => { + [keypair1, keypair2] = await Promise.all([Keypair.create(), Keypair.create()]); + address = Keyring.createFromKeypairs([keypair1, keypair2], { + claimSignatureSettings: 1, + transferSignatureSettings: 1, + keyTypes: [UniversalKey, ClaimsKey], + }); +}); + +test('should validate the keys match the allowed keys', async () => { + expect(address.address).toBeTruthy(); + expect(address.transferKeys).toHaveLength(1); + expect(address.claimKeys).toHaveLength(2); + const hash = Buffer.from('hash'); + jest.spyOn(address, 'verifyKeyType').mockImplementationOnce(() => null); + const signature = address.sign(hash, [1]); + + expect(KeyringSignature.verify(address.address, signature, hash, false)).toBe( + 'Invalid public key provided', + ); +}); + +test('should allow the proper keys if provided', async () => { + const signature = address.sign(Buffer.from('hash'), [0]); + + expect( + KeyringSignature.verify(address.address, signature, Buffer.from('hash'), false), + ).toBeNull(); +}); + +test('should be able to save to a file and recreate', async () => { + const filePath = await address.save(); + expect(filePath.endsWith(`${address.address}.json`)).toBe(true); + + const wallet2 = Keyring.readFromFile(address.address); + + expect(wallet2.keyringMerkleTree).toBeTruthy(); + expect(wallet2.transferKeys.map(x => x.publicKey.toString('hex'))).toEqual( + address.transferKeys.map(x => x.publicKey.toString('hex')), + ); + const signature = wallet2.sign(Buffer.from('claim'), [0], true); + + expect(Keyring.verify(wallet2.address, Buffer.from('claim'), signature, true)).toBe(true); +}); diff --git a/shared/crypto/test/Merkle.model.test.ts b/shared/crypto/test/Merkle.model.test.ts new file mode 100644 index 000000000..c88c8f045 --- /dev/null +++ b/shared/crypto/test/Merkle.model.test.ts @@ -0,0 +1,234 @@ +import { createHash } from 'crypto'; +import { MerklePosition } from '@ulixee/specification/types/IMerkleProof'; +import MerkleTree from '../lib/MerkleTree'; + +function sha256(data: string): Buffer { + return createHash('sha256').update(Buffer.from(data, 'hex')).digest(); +} + +function sha3(data: string | Buffer): Buffer { + return createHash('sha3-256').update(data).digest(); +} + +test('sha256 nodes with sha3 leaves', () => { + const leaves = ['a', 'b', 'c'].map(sha3); + + const tree = new MerkleTree(leaves, sha256); + + const root = '49d2d1a14929a8f556bd6f4a698d90a48c9d1ca5a562773010dfdc93f8340ab9'; + expect(tree.getRoot().toString('hex')).toBe(root); +}); + +test('sha3', () => { + expect.assertions(20); + + const leaves = ['a', 'b', 'c'].map(sha3); + + const aHash = Buffer.from( + '80084bf2fba02475726feb2cab2d8215eab14bc6bdd8bfb2c8151257032ecd8b', + 'hex', + ); + const bHash = Buffer.from( + 'b039179a8a4ce2c252aa6f2f25798251c19b75fc1508d9d511a191e0487d64a7', + 'hex', + ); + const cHash = Buffer.from( + '263ab762270d3b73d3e2cddf9acc893bb6bd41110347e5d5e4bd1d3c128ea90a', + 'hex', + ); + + expect(leaves).toEqual([aHash, bHash, cHash]); + + const tree = new MerkleTree(leaves, sha3); + + const layers = tree.layers.slice(1); // no leaves + + const layer1 = sha3(Buffer.concat([leaves[0], leaves[1]])); + expect(layers[0].nodes[0]).toEqual(layer1); + expect(layers[0].nodes[1]).toEqual(cHash); + + const root = Buffer.from( + 'b940dc53d707e4d9dfe9300664c6bbc4ab0c9f045d74441bfeda030cedbdbcba', + 'hex', + ); + expect(tree.getRoot().toString('hex')).toEqual(root.toString('hex')); + + const proof0 = tree.getProof(leaves[0]); + expect(proof0.length).toBe(2); + expect(proof0[0].position).toBe(MerklePosition.Right); + expect(proof0[0].hash).toEqual(bHash); + expect(proof0[1].position).toBe(MerklePosition.Right); + expect(proof0[1].hash).toEqual(cHash); + + expect(MerkleTree.verify(proof0, leaves[0], root, sha3)).toBe(true); + + const proof1 = tree.getProof(leaves[1]); + expect(proof1.length).toBe(2); + expect(proof1[0].position).toBe(MerklePosition.Left); + expect(proof1[0].hash).toEqual(aHash); + expect(proof1[1].position).toBe(MerklePosition.Right); + expect(proof1[1].hash).toEqual(cHash); + + expect(MerkleTree.verify(proof1, leaves[1], root, sha3)).toBe(true); + + const proof2 = tree.getProof(leaves[2]); + expect(proof2.length).toBe(1); + expect(proof2[0].position).toBe(MerklePosition.Left); + expect(proof2[0].hash).toEqual(layer1); + + expect(MerkleTree.verify(proof2, leaves[2], root, sha3)).toBe(true); +}); + +test('sha3 [keccak-256] with duplicate leaves', () => { + const leaves = ['a', 'b', 'a'].map(sha3); + + const aHash = '80084bf2fba02475726feb2cab2d8215eab14bc6bdd8bfb2c8151257032ecd8b'; + const bHash = 'b039179a8a4ce2c252aa6f2f25798251c19b75fc1508d9d511a191e0487d64a7'; + + const tree = new MerkleTree(leaves, sha3); + + expect(leaves.map(x => x.toString('hex'))).toEqual([aHash, bHash, aHash]); + + expect(tree.getRoot().toString('hex')).toEqual('e0c866810cf325979eca6987adb9bc627720a3b9502d620b1d6608ee765f07dd'); + + const layer1 = sha3(Buffer.concat([leaves[0], leaves[1]])); + + const proof0 = tree.getProof(leaves[2], 2); + expect(proof0.length).toBe(1); + expect(proof0[0].position).toBe(MerklePosition.Left); + expect(proof0[0].hash).toEqual(layer1); +}); + +test('sha256 - no leaves', () => { + const leaves = []; + const tree = new MerkleTree(leaves, sha256); + + const root = ''; + expect(tree.getRoot().toString('hex')).toBe(root); +}); + +test('should be able to find indices by proof (balanced trees only)', () => { + const leaves2x = ['a', 'b', 'c', 'd'].map(sha3); + const tree2x = new MerkleTree(leaves2x, sha256); + { + // proof 0 + const proof = tree2x.getProofForIndex(0); + expect(proof).toHaveLength(2); + expect(proof[0].position).toBe(MerklePosition.Right); + expect(proof[1].position).toBe(MerklePosition.Right); + expect(MerkleTree.getLeafIndex(proof)).toBe(0); + } + { + // proof 1 + const proof = tree2x.getProofForIndex(1); + expect(proof).toHaveLength(2); + expect(proof[0].position).toBe(MerklePosition.Left); // 1 + expect(proof[1].position).toBe(MerklePosition.Right); // 0 + expect(MerkleTree.getLeafIndex(proof)).toBe(1); + } + { + // proof 2 + const proof = tree2x.getProofForIndex(2); + expect(proof).toHaveLength(2); + expect(proof[0].position).toBe(MerklePosition.Right); // 0 + expect(proof[1].position).toBe(MerklePosition.Left); // 2 + expect(MerkleTree.getLeafIndex(proof)).toBe(2); + } + { + // proof 3 + const proof = tree2x.getProofForIndex(3); + expect(proof).toHaveLength(2); + expect(proof[0].position).toBe(MerklePosition.Left); // 1 + expect(proof[1].position).toBe(MerklePosition.Left); // 2 + expect(MerkleTree.getLeafIndex(proof)).toBe(3); + } + + const leaves = ['a', 'b', 'c', 'd', '0', '0', '1', '2'].map(sha3); + const tree = new MerkleTree(leaves, sha256); + { + // proof 0 + const proof = tree.getProofForIndex(0); + expect(proof).toHaveLength(3); + expect(proof[0].position).toBe(MerklePosition.Right); + expect(proof[1].position).toBe(MerklePosition.Right); + expect(proof[2].position).toBe(MerklePosition.Right); + expect(MerkleTree.getLeafIndex(proof)).toBe(0); + } + { + // proof 1 + const proof = tree.getProofForIndex(1); + expect(proof).toHaveLength(3); + expect(proof[0].position).toBe(MerklePosition.Left); // 1 + expect(proof[1].position).toBe(MerklePosition.Right); // 0 + expect(proof[2].position).toBe(MerklePosition.Right); // 0 + expect(MerkleTree.getLeafIndex(proof)).toBe(1); + } + { + // proof 2 + const proof = tree.getProofForIndex(2); + expect(proof).toHaveLength(3); + expect(proof[0].position).toBe(MerklePosition.Right); // 0 + expect(proof[1].position).toBe(MerklePosition.Left); // 2 + expect(proof[2].position).toBe(MerklePosition.Right); // 0 + expect(MerkleTree.getLeafIndex(proof)).toBe(2); + } + { + // proof 3 + const proof = tree.getProofForIndex(3); + expect(proof).toHaveLength(3); + expect(proof[0].position).toBe(MerklePosition.Left); // 1 + expect(proof[1].position).toBe(MerklePosition.Left); // 2 + expect(proof[2].position).toBe(MerklePosition.Right); // 0 + expect(MerkleTree.getLeafIndex(proof)).toBe(3); + } + { + // proof 4 + const proof = tree.getProofForIndex(4); + expect(proof).toHaveLength(3); + expect(proof[0].position).toBe(MerklePosition.Right); // 0 + expect(proof[1].position).toBe(MerklePosition.Right); // 0 + expect(proof[2].position).toBe(MerklePosition.Left); // 4 + expect(MerkleTree.getLeafIndex(proof)).toBe(4); + } + { + // proof 5 + const proof = tree.getProofForIndex(5); + expect(proof).toHaveLength(3); + expect(proof[0].position).toBe(MerklePosition.Left); // 1 + expect(proof[1].position).toBe(MerklePosition.Right); // 0 + expect(proof[2].position).toBe(MerklePosition.Left); // 4 + expect(MerkleTree.getLeafIndex(proof)).toBe(5); + } + { + // proof 6 + const proof = tree.getProofForIndex(6); + expect(proof).toHaveLength(3); + expect(proof[0].position).toBe(MerklePosition.Right); // 0 + expect(proof[1].position).toBe(MerklePosition.Left); // 2 + expect(proof[2].position).toBe(MerklePosition.Left); // 4 + expect(MerkleTree.getLeafIndex(proof)).toBe(6); + } + { + // proof 7 + const proof = tree.getProofForIndex(7); + expect(proof).toHaveLength(3); + expect(proof[0].position).toBe(MerklePosition.Left); + expect(proof[1].position).toBe(MerklePosition.Left); + expect(proof[2].position).toBe(MerklePosition.Left); + expect(MerkleTree.getLeafIndex(proof)).toBe(7); + } +}); + +test('sha3 - 100,000 leaves', () => { + const values = []; + for (let i = 0; i < 1e5; i += 1) { + values.push(`${i}`); + } + + const leaves = values.map(x => sha3(x)); + + const tree = new MerkleTree(leaves, sha3); + + const root = '9ae5005173e8c0f54cebb774855398cc1613c5b8237e42b944b2c6a8f4483efc'; + expect(tree.getRoot().toString('hex')).toBe(root); +}); diff --git a/shared/net/errors/RemoteError.ts b/shared/net/errors/RemoteError.ts new file mode 100644 index 000000000..16b7f625c --- /dev/null +++ b/shared/net/errors/RemoteError.ts @@ -0,0 +1,32 @@ +export default class RemoteError extends Error { + private readonly type: string; + private readonly code: string; + private readonly description: string; + private readonly data: object; + + constructor( + error: Partial & { + type?: string; + code?: string; + description?: string; + data?: any; + }, + ) { + const { type, code, description, stack, data } = error; + const message = `Remote threw error (${type ?? error.name ?? code}): ${ + description ?? error.message + }`; + super(message); + this.type = type; + this.code = code; + this.description = description; + this.stack = stack ?? this.stack; + this.data = data; + } + + public override toString(): string { + const extras = this.data ? `\n${JSON.stringify(this.data, null, 2)}` : ''; + const codeMessage = this.code ? `[${this.code}] ` : ''; + return `${this.message}: ${codeMessage}${extras}`; + } +} diff --git a/shared/net/lib/ConnectionToClient.ts b/shared/net/lib/ConnectionToClient.ts index 19cd70c71..c201d9dcb 100644 --- a/shared/net/lib/ConnectionToClient.ts +++ b/shared/net/lib/ConnectionToClient.ts @@ -15,6 +15,7 @@ export default class ConnectionToClient { public disconnectPromise: Promise; + public handlerMetadata?: any; private events = new EventSubscriber(); constructor( @@ -23,14 +24,14 @@ export default class ConnectionToClient this.handleRequest(message)); - this.events.once(transport, 'disconnected', (error) => this.disconnect(error)); + this.events.on(transport, 'message', message => this.handleRequest(message)); + this.events.once(transport, 'disconnected', error => this.disconnect(error)); } public disconnect(error?: Error): Promise { if (this.disconnectPromise) return this.disconnectPromise; - this.disconnectPromise = new Promise(async (resolve) => { + this.disconnectPromise = new Promise(async resolve => { await this.transport.disconnect?.(); this.events.close(); this.transport.emit('disconnected'); @@ -50,6 +51,7 @@ export default class ConnectionToClient | ICoreEventPayload, ): void { - this.transport.send(message).catch((error) => { + this.transport.send(message).catch(error => { this.emit('send-error', error); }); } diff --git a/shared/net/lib/ConnectionToCore.ts b/shared/net/lib/ConnectionToCore.ts index 57e2f77c8..3f3fce058 100644 --- a/shared/net/lib/ConnectionToCore.ts +++ b/shared/net/lib/ConnectionToCore.ts @@ -133,7 +133,7 @@ export default class ConnectionToCore< return this.disconnectPromise; } - public async sendRequest( + public async sendRequest( payload: { command: T; args: IApiSpec[T]['args']; diff --git a/shared/net/lib/HttpTransportToClient.ts b/shared/net/lib/HttpTransportToClient.ts index 7deef4fce..3f28226cf 100644 --- a/shared/net/lib/HttpTransportToClient.ts +++ b/shared/net/lib/HttpTransportToClient.ts @@ -6,16 +6,25 @@ import * as QueryString from 'querystring'; import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; import ITransportToClient, { ITransportToClientEvents } from '../interfaces/ITransportToClient'; import IApiHandlers from '../interfaces/IApiHandlers'; +import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; +import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; +import ICoreEventPayload from '../interfaces/ICoreEventPayload'; + +const Kb = 1024; export default class HttpTransportToClient extends TypedEventEmitter> implements ITransportToClient { + private static requestCounter = 1; + constructor(private request: IncomingMessage, private response: ServerResponse) { super(); } - public send(message: any): Promise { + public send( + message: ICoreResponsePayload | ICoreEventPayload, + ): Promise { const res = this.response; try { @@ -31,18 +40,28 @@ export default class HttpTransportToClient { + public async readRequest( + maxPayloadKb = 1024, + dontEmit = false, + ): Promise> { const req = this.request; const url = new URL(req.url, 'http://localhost/'); + let size = 0; const body: Buffer[] = []; + const maxPayloadSize = maxPayloadKb * Kb; for await (const chunk of req) { + size += (chunk as Buffer).length; + if (size > maxPayloadSize) throw new Error('Max size exceeded!'); body.push(chunk); } let args: any; if (body.length) { const bodyText = Buffer.concat(body).toString(); - if (req.headers['content-type'] === 'text/json') { + if ( + req.headers['content-type'] === 'text/json' || + req.headers['content-type'] === 'application/json' + ) { args = TypeSerializer.parse(bodyText); } else { args = QueryString.parse(bodyText); @@ -52,8 +71,15 @@ export default class HttpTransportToClient; + if (!('command' in message)) { + const command = url.pathname.replace(/\//g, '') as any; + message = { command, args } as any; + } + message.messageId ??= String((HttpTransportToClient.requestCounter += 1)); + if (!dontEmit) { + this.emit('message', message); + } + return message; } } diff --git a/shared/net/lib/HttpTransportToCore.ts b/shared/net/lib/HttpTransportToCore.ts new file mode 100644 index 000000000..6b3da16ad --- /dev/null +++ b/shared/net/lib/HttpTransportToCore.ts @@ -0,0 +1,136 @@ +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import * as https from 'https'; +import * as http from 'http'; +import { ClientRequest, IncomingHttpHeaders } from 'http'; +import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; +import Resolvable from '@ulixee/commons/lib/Resolvable'; +import ITransportToCore, { ITransportToCoreEvents } from '../interfaces/ITransportToCore'; +import IApiHandlers from '../interfaces/IApiHandlers'; +import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; +import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; +import ICoreEventPayload from '../interfaces/ICoreEventPayload'; +import RemoteError from '../errors/RemoteError'; + +export default class HttpTransportToCore< + ApiHandlers extends IApiHandlers = any, + RequestPayload = ICoreRequestPayload, + ResponsePayload = ICoreResponsePayload | ICoreEventPayload, + > + extends TypedEventEmitter> + implements ITransportToCore +{ + public readonly host: string; + + public isConnected = false; + public isDisconnecting = false; + + private pendingRequestsToPromise = new Map>(); + + private httpAgent = new http.Agent({ + keepAlive: true, + keepAliveMsecs: 5e3, + }); + + private httpsAgent = new https.Agent({ + keepAlive: true, + keepAliveMsecs: 5e3, + }); + + constructor(host: string) { + super(); + this.host = host; + this.disconnect = this.disconnect.bind(this); + } + + public async send(payload: RequestPayload): Promise { + await this.connect(); + + const message = Buffer.from(TypeSerializer.stringify(payload)); + const url = new URL(`${(payload as any).command}`, `${this.host}/`); + const result = await this.request(url, message, { + method: 'POST', + headers: { + 'content-type': 'application/json', + }, + }); + const responseId = (payload as any).messageId; + let responsePayload: ICoreResponsePayload = { + data: null, + responseId, + }; + try { + if (!result.headers['content-type']?.includes('json')) { + throw new RemoteError({ code: result.statusCode as any, message: result.body }); + } + responsePayload = TypeSerializer.parse(result.body); + if (result.statusCode !== 200 && !(responsePayload instanceof Error)) { + responsePayload.data = new RemoteError(responsePayload.data); + } + } catch (error) { + responsePayload.data = error; + } + responsePayload.responseId ??= responseId; + this.emit('message', responsePayload as any); + } + + public async disconnect(): Promise { + if (this.isDisconnecting) return; + this.isDisconnecting = true; + await Promise.allSettled(this.pendingRequestsToPromise.values()); + this.emit('disconnected'); + this.isConnected = false; + return Promise.resolve(); + } + + public connect(): Promise { + if (!this.isConnected) { + this.isConnected = true; + this.emit('connected'); + } + return Promise.resolve(); + } + + private request( + url: URL, + payload: Buffer, + options: https.RequestOptions, + ): Promise<{ statusCode: number; body: string; headers: IncomingHttpHeaders }> { + if (this.isDisconnecting) { + throw new CanceledPromiseError('Canceling request due to disconnected state'); + } + const httpModule = url.protocol === 'https:' ? https : http; + options.agent ??= url.protocol === 'https:' ? this.httpsAgent : this.httpAgent; + + const resolvable = new Resolvable<{ + statusCode: number; + body: string; + headers: IncomingHttpHeaders; + }>(); + + const request = httpModule.request(url, options, async res => { + this.pendingRequestsToPromise.delete(request); + + if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { + const redirectUrl = new URL(res.headers.location, url); + return resolvable.resolve(this.request(redirectUrl, payload, options)); + } + res.once('error', resolvable.reject); + + const body: Buffer[] = []; + for await (const chunk of res) { + body.push(chunk); + } + resolvable.resolve({ + body: Buffer.concat(body).toString(), + statusCode: res.statusCode, + headers: res.headers, + }); + }); + this.pendingRequestsToPromise.set(request, resolvable.promise); + request.setSocketKeepAlive(true); + request.once('error', resolvable.reject); + request.end(payload); + return resolvable.promise; + } +} diff --git a/shared/package.json b/shared/package.json index 4f4d269ef..ddd906b56 100644 --- a/shared/package.json +++ b/shared/package.json @@ -45,8 +45,10 @@ }, "workspaces": { "packages": [ + "net", + "crypto", "commons", - "net" + "specification" ] } } diff --git a/shared/specification/.eslintrc.js b/shared/specification/.eslintrc.js new file mode 100644 index 000000000..ff0effca8 --- /dev/null +++ b/shared/specification/.eslintrc.js @@ -0,0 +1,8 @@ +const Path = require('path'); + +module.exports = { + parserOptions: { + project: Path.join(__dirname, 'tsconfig.json'), + }, + extends: '../.eslintrc.js', +}; diff --git a/shared/specification/common.ts b/shared/specification/common.ts new file mode 100644 index 000000000..d9a5b5aa9 --- /dev/null +++ b/shared/specification/common.ts @@ -0,0 +1,35 @@ +import { z } from 'zod'; + +export const addressValidation = z + .string() + .length(61) + .regex(/^ar1[ac-hj-np-z02-9]{58}/) // no 1 b i o + .refine(x => x.startsWith('ar'), { message: 'This is not an Argon address.' }); + +export const hashValidation = z + .instanceof(Buffer) + .refine(x => x.length === 32, { message: 'Hashes must be 32 bytes' }); + +export const publicKeyValidation = z + .instanceof(Buffer) + .refine(x => x.length === 32, { message: 'Public keys must be 32 bytes' }); + +export const isHex = /^(0x|0h)?[0-9A-F]+$/i; + +export const signatureValidation = z + .instanceof(Buffer) + .refine(x => x.length === 64, { message: 'Signatures must be 64 bytes' }); + +export const blockHeightValidation = z.number().int().nonnegative(); + +export const micronoteBatchSlugValidation = z.string().regex(isHex).length(10); + +export const micronoteIdValidation = z + .instanceof(Buffer) + .refine(x => x.length === 32, { message: 'Micronote ids must be 32 bytes' }); + +export const centagonTokenValidation = z.bigint().refine(x => x > 0n); + +export const nodeIdValidation = z.string().length(32); + +export const micronoteTokenValidation = z.number().int().positive(); diff --git a/shared/specification/index.ts b/shared/specification/index.ts new file mode 100644 index 000000000..71fc3397b --- /dev/null +++ b/shared/specification/index.ts @@ -0,0 +1,43 @@ +import INote from './types/INote'; +import IMerkleProof from './types/IMerkleProof'; +import IWalletOwnershipProof from './types/IWalletOwnershipProof'; +import IWalletSignature from './types/IWalletSignature'; +import IStakeSettings from './types/IStakeSettings'; +import IStakeSignature from './types/IStakeSignature'; +import ICoinage from './types/ICoinage'; +import CoinageType from './types/CoinageType'; +import NoteType from './types/NoteType'; +import ITransaction from './types/ITransaction'; +import ITransactionOutput from './types/ITransactionOutput'; +import ITransactionSource from './types/ITransactionSource'; +import ITransactionSourceSignatureData from './types/ITransactionSourceSignatureData'; +import TransactionType from './types/TransactionType'; +import IBlock from './types/IBlock'; +import LedgerType from './types/LedgerType'; +import IBlockHeader from './types/IBlockHeader'; +import IBlockSettings from './types/IBlockSettings'; +import TransactionError from './types/TransactionError'; +import IPayment from './types/IPayment'; + +export { + IBlock, + IBlockHeader, + IBlockSettings, + INote, + ICoinage, + CoinageType, + NoteType, + LedgerType, + IMerkleProof, + IStakeSettings, + ITransaction, + ITransactionSource, + ITransactionOutput, + ITransactionSourceSignatureData, + TransactionType, + IStakeSignature, + IWalletSignature, + IWalletOwnershipProof, + TransactionError, + IPayment, +}; diff --git a/shared/specification/mainchain/BlockApis.ts b/shared/specification/mainchain/BlockApis.ts new file mode 100644 index 000000000..7bfbf5be8 --- /dev/null +++ b/shared/specification/mainchain/BlockApis.ts @@ -0,0 +1,66 @@ +import { z } from 'zod'; +import { addressValidation, blockHeightValidation, hashValidation } from '../common'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { DatumSummarySchema } from '../types/IDatumSummary'; +import { BlockSchema } from '../types/IBlock'; +import BlockError from '../types/BlockError'; +import { BitDatumHistorySchema } from '../types/IBitDatumHistory'; +import { BlockSettingsSchema } from '../types/IBlockSettings'; +import { LedgerType } from '../index'; + +export const BlockApiSchemas = { + 'Block.create': { + args: z.object({ + prevBlockHash: hashValidation, + payoutAddress: addressValidation, + linkNonce: hashValidation, // since already calculated, send it through + datumSummary: DatumSummarySchema, + bitSampling: z.object({ + bitDatumHistories: BitDatumHistorySchema.array(), + }), // sampling of node jobs + }), + result: z.object({ + success: z.boolean(), + }), + }, + 'Block.created': { + args: z.object({ + block: BlockSchema, + nodeIdsAlreadySent: z.string().array(), + }), + result: z.object({ + accept: z.boolean(), + error: z.nativeEnum(BlockError), + message: z.string(), + }), + }, + 'Block.findWithTransaction': { + args: z.object({ + transactionHash: hashValidation, + ledgerType: z.nativeEnum(LedgerType), + }), + result: z.object({ + blockHeight: blockHeightValidation, + merkleRoot: hashValidation, + blockHash: hashValidation, + }), + }, + 'Block.getMany': { + args: z.object({ + blockHeights: blockHeightValidation.array(), + blockHashes: hashValidation.array(), + }), + result: z.object({ + blocks: BlockSchema.array(), + }), + }, + 'Block.settings': { + args: z.object({ + blockHeight: blockHeightValidation.optional(), + }), + result: BlockSettingsSchema, + }, +}; + +type IBlockApis = IZodSchemaToApiTypes; +export default IBlockApis; diff --git a/shared/specification/mainchain/BlockHeaderApis.ts b/shared/specification/mainchain/BlockHeaderApis.ts new file mode 100644 index 000000000..a12e0e5c9 --- /dev/null +++ b/shared/specification/mainchain/BlockHeaderApis.ts @@ -0,0 +1,28 @@ +import { z } from 'zod'; +import { blockHeightValidation, hashValidation } from '../common'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { BlockHeaderSchema } from '../types/IBlockHeader'; + +export const BlockHeaderApiSchemas = { + 'BlockHeader.getMany': { + args: z.object({ + heights: blockHeightValidation.array(), + }), + result: z.object({ + headers: BlockHeaderSchema.array(), + }), + }, + 'BlockHeader.get': { + args: z.object({ + hash: hashValidation, + includeFork: z.boolean(), + }), + result: z.object({ + header: BlockHeaderSchema, + isOnFork: z.boolean(), + }), + }, +}; + +type IBlockHeaderApis = IZodSchemaToApiTypes; +export default IBlockHeaderApis; diff --git a/shared/specification/mainchain/CoinageApis.ts b/shared/specification/mainchain/CoinageApis.ts new file mode 100644 index 000000000..9e5c9a58f --- /dev/null +++ b/shared/specification/mainchain/CoinageApis.ts @@ -0,0 +1,35 @@ +import { z } from 'zod'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { CoinageSchema } from '../types/ICoinage'; + +export enum CoinageError { + BAD_SIGNATURE = 0, + NO_PERMISSIONS = 1, + INVALID_PARAMETER = 2, + INVALID_TYPE = 3, +} + +export const CoinageApiSchemas = { + 'Coinage.create': { + args: z.object({ + coinage: CoinageSchema, + }), + result: z.object({ + accept: z.boolean(), + error: z.nativeEnum(CoinageError), + }), + }, + 'Coinage.created': { + args: z.object({ + coinage: CoinageSchema, + nodeIdsAlreadySent: z.string().array(), + }), + result: z.object({ + accept: z.boolean(), + error: z.nativeEnum(CoinageError), + }), + }, +}; + +type ICoinageApis = IZodSchemaToApiTypes; +export default ICoinageApis; diff --git a/shared/specification/mainchain/SidechainGovernanceApis.ts b/shared/specification/mainchain/SidechainGovernanceApis.ts new file mode 100644 index 000000000..b33bcebf2 --- /dev/null +++ b/shared/specification/mainchain/SidechainGovernanceApis.ts @@ -0,0 +1,33 @@ +import { z } from 'zod'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { AuthorizedSidechainSchema } from '../types/IAuthorizedSidechain'; + +export enum SidechainGovernanceError { + BAD_SIGNATURE = 0, + NO_PERMISSIONS = 1, +} + +export const SidechainGovernanceSchemas = { + 'Sidechain.authorize': { + args: z.object({ + sidechain: AuthorizedSidechainSchema, + }), + result: z.object({ + accept: z.boolean(), + error: z.nativeEnum(SidechainGovernanceError), + }), + }, + 'Sidechain.authorized': { + args: z.object({ + sidechain: AuthorizedSidechainSchema, + nodeIdsAlreadySent: z.string().array(), + }), + result: z.object({ + accept: z.boolean(), + error: z.nativeEnum(SidechainGovernanceError), + }), + }, +}; + +type ISidechainGovernanceApis = IZodSchemaToApiTypes; +export default ISidechainGovernanceApis; diff --git a/shared/specification/mainchain/TransactionApis.ts b/shared/specification/mainchain/TransactionApis.ts new file mode 100644 index 000000000..0da74c3d4 --- /dev/null +++ b/shared/specification/mainchain/TransactionApis.ts @@ -0,0 +1,69 @@ +import { z } from 'zod'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { TransactionSchema } from '../types/ITransaction'; +import { LedgerType, TransactionError } from '../index'; +import { blockHeightValidation, hashValidation } from '../common'; +import { MerkleProofSchema } from '../types/IMerkleProof'; + +const TransactionResponseSchema = z.object({ + preliminaryBlockHeight: blockHeightValidation, + error: z.nativeEnum(TransactionError), + message: z.string().optional(), +}); + +export const TransactionApiSchemas = { + 'Transaction.created': { + args: z.object({ + transaction: TransactionSchema, + ledger: z.nativeEnum(LedgerType), + nodeIdsAlreadySent: z.string().array(), + }), + result: z.object({ + accept: z.boolean(), + error: z.nativeEnum(TransactionError), + message: z.string().optional(), + }), + }, + 'Transaction.transfer': { + args: z.object({ + transaction: TransactionSchema, + ledger: z.nativeEnum(LedgerType), + }), + result: TransactionResponseSchema, + }, + 'Transaction.claim': { + args: z.object({ + transaction: TransactionSchema, + }), + result: TransactionResponseSchema, + }, + 'Transaction.purchase': { + args: z.object({ + transaction: TransactionSchema, + }), + result: TransactionResponseSchema, + }, + 'Transaction.verifyInBlock': { + args: z.object({ + transactionHash: hashValidation, + transactionIndex: z.number().int().nonnegative(), + blockHeight: blockHeightValidation, + ledger: z.nativeEnum(LedgerType), + }), + result: z.object({ + proofs: MerkleProofSchema.array(), + }), + }, + 'Transaction.checkForBondRedemption': { + args: z.object({ + transactionHash: hashValidation, + }), + result: z.object({ + transaction: TransactionSchema, + blockHeight: blockHeightValidation, + }), + }, +}; + +type ITransactionApis = IZodSchemaToApiTypes; +export default ITransactionApis; diff --git a/shared/specification/mainchain/index.ts b/shared/specification/mainchain/index.ts new file mode 100644 index 000000000..29207460c --- /dev/null +++ b/shared/specification/mainchain/index.ts @@ -0,0 +1,28 @@ +import { z } from 'zod'; +import IBlockApis, { BlockApiSchemas } from './BlockApis'; +import IBlockHeaderApis, { BlockHeaderApiSchemas } from './BlockHeaderApis'; +import ISidechainGovernanceApis, { SidechainGovernanceSchemas } from './SidechainGovernanceApis'; +import ICoinageApis, { CoinageApiSchemas } from './CoinageApis'; +import ITransactionApis, { TransactionApiSchemas } from './TransactionApis'; + +const MainchainApiSchema = { + ...BlockApiSchemas, + ...BlockHeaderApiSchemas, + ...CoinageApiSchemas, + ...SidechainGovernanceSchemas, + ...TransactionApiSchemas, +}; + +export type IMainchainApiTypes = IBlockApis & + IBlockHeaderApis & + ICoinageApis & + ISidechainGovernanceApis & + ITransactionApis; + +export type IMainchainApis = { + [Api in keyof IMainchainApiTypes]: ( + args: z.infer, + ) => Promise>; +}; + +export default MainchainApiSchema; diff --git a/shared/specification/package.json b/shared/specification/package.json new file mode 100644 index 000000000..58a3e3a68 --- /dev/null +++ b/shared/specification/package.json @@ -0,0 +1,10 @@ +{ + "name": "@ulixee/specification", + "version": "2.0.0-alpha.8", + "description": "", + "main": "./index.js", + "license": "MIT", + "dependencies": { + "zod": "^3.17.3" + } +} diff --git a/shared/specification/sidechain/FundingTransferApis.ts b/shared/specification/sidechain/FundingTransferApis.ts new file mode 100644 index 000000000..1c18c85a5 --- /dev/null +++ b/shared/specification/sidechain/FundingTransferApis.ts @@ -0,0 +1,41 @@ +import { z } from 'zod'; +import { addressValidation, blockHeightValidation, hashValidation } from '../common'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { NoteSchema } from '../types/INote'; + +export const FundingTransferApiSchemas = { + 'FundingTransfer.status': { + args: z.object({ + noteHash: hashValidation, + }), + result: z.object({ + transactionHash: hashValidation, + currentBlockHeight: blockHeightValidation, + blocks: z + .object({ + blockHash: hashValidation, + blockHeight: blockHeightValidation, + }) + .array(), + }), + }, + 'FundingTransfer.keys': { + args: z.object({}), + result: z.object({ + transferOutKey: addressValidation, + transferInKeys: addressValidation.array(), + }), + }, + 'FundingTransfer.out': { + args: z.object({ + note: NoteSchema, + }), + result: z.object({ + noteHash: hashValidation, + currentBlockHash: hashValidation, + }), + }, +}; + +type IFundingTransferApis = IZodSchemaToApiTypes; +export default IFundingTransferApis; diff --git a/shared/specification/sidechain/MicronoteApis.ts b/shared/specification/sidechain/MicronoteApis.ts new file mode 100644 index 000000000..54e4658f5 --- /dev/null +++ b/shared/specification/sidechain/MicronoteApis.ts @@ -0,0 +1,67 @@ +import { z } from 'zod'; +import { + addressValidation, + blockHeightValidation, + hashValidation, + micronoteBatchSlugValidation, + micronoteIdValidation, + micronoteTokenValidation, + publicKeyValidation, + signatureValidation, +} from '../common'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { WalletSignatureSchema } from '../types/IWalletSignature'; + +export const MicronoteApiSchemas = { + 'Micronote.create': { + args: z.object({ + address: addressValidation, + microgons: micronoteTokenValidation.lt(1000e6), // $1000 max = 1000*1M microgon max + fundsId: z.number().int().positive().optional(), + batchSlug: micronoteBatchSlugValidation, + signature: WalletSignatureSchema, + isAuditable: z.boolean().optional(), + }), + result: z.object({ + id: micronoteIdValidation, + micronoteSignature: signatureValidation, + blockHeight: blockHeightValidation, + fundsId: z.number().int().positive(), + guaranteeBlockHash: hashValidation, + guaranteeBlockHeight: blockHeightValidation, + fundMicrogonsRemaining: micronoteTokenValidation, + }), + }, + 'Micronote.claim': { + args: z.object({ + batchSlug: micronoteBatchSlugValidation, + id: micronoteIdValidation, + publicKey: publicKeyValidation, + tokenAllocation: z.record(addressValidation, micronoteTokenValidation), + signature: signatureValidation, + }), + result: z.object({ + finalCost: z.number().nonnegative().int(), + }), + }, + 'Micronote.lock': { + args: z.object({ + id: micronoteIdValidation, + publicKey: publicKeyValidation, + signature: signatureValidation, + batchSlug: micronoteBatchSlugValidation, + }), + result: z.object({ + accepted: z.boolean(), + currentBlockHeight: blockHeightValidation, + currentBlockHash: hashValidation, + }), + }, +}; + +type ICreateMicronoteResponse = z.infer; + +export { ICreateMicronoteResponse }; + +type IMicronoteApis = IZodSchemaToApiTypes; +export default IMicronoteApis; diff --git a/shared/specification/sidechain/MicronoteBatchApis.ts b/shared/specification/sidechain/MicronoteBatchApis.ts new file mode 100644 index 000000000..69d1fd60e --- /dev/null +++ b/shared/specification/sidechain/MicronoteBatchApis.ts @@ -0,0 +1,51 @@ +import { z } from 'zod'; +import { MicronoteBatchSchema } from '../types/IMicronoteBatch'; +import { NoteSchema } from '../types/INote'; +import { addressValidation, micronoteTokenValidation } from '../common'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; + +const fundsIdValidation = z.number().int().positive(); + +export const MicronoteBatchApiSchemas = { + 'MicronoteBatch.get': { args: z.undefined().nullish(), result: MicronoteBatchSchema }, + 'MicronoteBatch.fund': { + args: z.object({ + note: NoteSchema, + batchSlug: MicronoteBatchSchema.shape.batchSlug, + }), + result: z.object({ + fundsId: fundsIdValidation, + }), + }, + 'MicronoteBatch.findFund': { + args: z.object({ + batchSlug: MicronoteBatchSchema.shape.batchSlug, + microgons: micronoteTokenValidation, + address: addressValidation, + }), + result: z.object({ + fundsId: z.number().int().positive(), + microgonsRemaining: micronoteTokenValidation, + }), + }, + 'MicronoteBatch.getFundSettlement': { + args: z.object({ + fundIds: fundsIdValidation.array(), + batchAddress: addressValidation, + }), + result: z.object({ + isBatchSettled: z.boolean(), + settledTime: z.date(), + settlements: z + .object({ + fundsId: fundsIdValidation, + fundedCentagons: NoteSchema.shape.centagons, + settledCentagons: NoteSchema.shape.centagons, + }) + .array(), + }), + }, +}; + +type IMicronoteBatchApis = IZodSchemaToApiTypes; +export default IMicronoteBatchApis; diff --git a/shared/specification/sidechain/NoteApis.ts b/shared/specification/sidechain/NoteApis.ts new file mode 100644 index 000000000..d6a3389f0 --- /dev/null +++ b/shared/specification/sidechain/NoteApis.ts @@ -0,0 +1,23 @@ +import { z } from 'zod'; +import { NoteSchema } from '../types/INote'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; + +export const NoteApiSchemas = { + 'Note.get': { + args: z.object({ + noteHash: NoteSchema.shape.noteHash, + }), + result: z.object({ note: NoteSchema }), + }, + 'Note.create': { + args: z.object({ + note: NoteSchema, + }), + result: z.object({ + accepted: z.boolean(), + }), + }, +}; + +type INoteApis = IZodSchemaToApiTypes; +export default INoteApis; diff --git a/shared/specification/sidechain/SidechainSnapshot.proto b/shared/specification/sidechain/SidechainSnapshot.proto new file mode 100644 index 000000000..34a98a838 --- /dev/null +++ b/shared/specification/sidechain/SidechainSnapshot.proto @@ -0,0 +1,67 @@ +syntax = "proto3"; + +import "../protos/Transaction.json"; +import "../protos/DatumSummary.json"; + +service SidechainSnapshotService { + rpc get (GetSidechainSnapshotRequest) returns (GetSidechainSnapshotResponse) {} +} + +message GetSidechainSnapshotRequest { + bytes prevBlockHash = 1; + bytes linkNonce = 2; + DatumSummary datumSummary = 3; + bytes signature = 4; +} + +message ClosedMicronoteBatch { + bytes batchPublicKey = 1; + uint32 newNotesCount = 2; + bytes newNotesHash = 3; + string fundingMicrogons = 4; + string allocatedMicrogons = 5; + string revenueMicrogons = 6; + uint32 settledCentagons = 7; + uint32 settlementFeeCentagons = 8; + uint32 burnedCentagons = 9; + bytes burnNoteHash = 10; + uint32 micronotesCount = 11; + uint32 startBlockHeight = 12; + uint32 endBlockHeight = 13; + uint32 guaranteeBlockHeight = 14; + bytes burnSecurityTransactionHash = 15; +} + +message Security { + bytes transactionHash = 1; + uint32 outputIndex = 2; + uint32 centagons = 3; +} + +message AddressOwnershipProof { + bytes address = 1; + SignatureSettingsProof signatureSettings = 2; + repeated OwnershipProof owners = 3; +} + +message AccountBalance { + bytes address = 1; + string centagons = 2; + uint32 guaranteeBlockHeight = 3; +} + +message SidechainSnapshot { + bytes rootPublicKey = 1; + repeated Transaction burnTransactions = 2; + repeated Transaction transfersOut = 3; + repeated AccountBalance accounts = 4; + repeated ClosedMicronoteBatch closedMicronoteBatches = 5; + repeated Security securities = 6; + repeated AddressOwnershipProof securityAddressProofs = 7; + bytes snapshotHash = 8; + bytes signature = 9; +} + +message GetSidechainSnapshotResponse { + SidechainSnapshot snapshot = 1; +} diff --git a/shared/specification/sidechain/StakeApis.ts b/shared/specification/sidechain/StakeApis.ts new file mode 100644 index 000000000..d48d0fcc2 --- /dev/null +++ b/shared/specification/sidechain/StakeApis.ts @@ -0,0 +1,46 @@ +import { z } from 'zod'; +import { NoteSchema } from '../types/INote'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { StakeSettingsSchema } from '../types/IStakeSettings'; +import { + addressValidation, + blockHeightValidation, + hashValidation, + publicKeyValidation, + signatureValidation, +} from '../common'; +import { StakeSignatureSchema } from '../types/IStakeSignature'; +import { WalletSignatureSchema } from '../types/IWalletSignature'; + +export const StakeApiSchemas = { + 'Stake.settings': { args: z.undefined().nullish(), result: StakeSettingsSchema }, + 'Stake.create': { + args: z.object({ + note: NoteSchema, + stakedPublicKey: publicKeyValidation, + }), + result: StakeSignatureSchema, + }, + 'Stake.refund': { + args: z.object({ + address: addressValidation, + stakedPublicKey: publicKeyValidation, + signature: WalletSignatureSchema, + }), + result: z.object({ + blockEndHeight: blockHeightValidation, + refundNoteHash: hashValidation, + refundEffectiveHeight: blockHeightValidation, + }), + }, + 'Stake.signature': { + args: z.object({ + stakedPublicKey: publicKeyValidation, + signature: signatureValidation, + }), + result: StakeSignatureSchema, + }, +}; + +type IStakeApis = IZodSchemaToApiTypes; +export default IStakeApis; diff --git a/shared/specification/sidechain/WalletApis.ts b/shared/specification/sidechain/WalletApis.ts new file mode 100644 index 000000000..cdb182dc5 --- /dev/null +++ b/shared/specification/sidechain/WalletApis.ts @@ -0,0 +1,27 @@ +import { z } from 'zod'; +import { addressValidation } from '../common'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { WalletSignatureSchema } from '../types/IWalletSignature'; + +export const WalletApiSchemas = { + 'Wallet.register': { + args: z.object({ + address: addressValidation, + signature: WalletSignatureSchema, + }), + result: z.object({ + success: z.boolean(), + }), + }, + 'Wallet.getBalance': { + args: z.object({ + address: addressValidation, + }), + result: z.object({ + balance: z.bigint(), + }), + }, +}; + +type IWalletApis = IZodSchemaToApiTypes; +export default IWalletApis; diff --git a/shared/specification/sidechain/index.ts b/shared/specification/sidechain/index.ts new file mode 100644 index 000000000..c193257ae --- /dev/null +++ b/shared/specification/sidechain/index.ts @@ -0,0 +1,31 @@ +import { z } from 'zod'; +import IMicronoteBatchApis, { MicronoteBatchApiSchemas } from './MicronoteBatchApis'; +import INoteApis, { NoteApiSchemas } from './NoteApis'; +import IMicronoteApis, { MicronoteApiSchemas } from './MicronoteApis'; +import IFundingTransferApis, { FundingTransferApiSchemas } from './FundingTransferApis'; +import IWalletApis, { WalletApiSchemas } from './WalletApis'; +import IStakeApis, { StakeApiSchemas } from './StakeApis'; + +const SidechainApiSchema = { + ...WalletApiSchemas, + ...FundingTransferApiSchemas, + ...MicronoteApiSchemas, + ...MicronoteBatchApiSchemas, + ...NoteApiSchemas, + ...StakeApiSchemas, +}; + +export type ISidechainApiTypes = IWalletApis & + IFundingTransferApis & + IMicronoteApis & + IMicronoteBatchApis & + INoteApis & + IStakeApis; + +export type ISidechainApis = { + [Api in keyof ISidechainApiTypes]: ( + args: z.infer, + ) => Promise>; +}; + +export default SidechainApiSchema; diff --git a/shared/specification/tsconfig.json b/shared/specification/tsconfig.json new file mode 100644 index 000000000..0c1d1357f --- /dev/null +++ b/shared/specification/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "strict": true + }, + "include": ["**/*.ts", "*.ts", "package.json", ".eslintrc.js"], + "exclude": ["**/tsconfig*.json", "**/node_modules", "**/build"] +} diff --git a/shared/specification/types/BlockError.ts b/shared/specification/types/BlockError.ts new file mode 100644 index 000000000..0c3bf420a --- /dev/null +++ b/shared/specification/types/BlockError.ts @@ -0,0 +1,41 @@ +enum BlockError { + SYSTEM_ERROR = 0, + INVALID_HEIGHT = 1, + INVALID_LINK_TARGET = 2, + INVALID_BOND_REDEMPTION = 3, + TOO_MANY_BOND_PURCHASES = 4, + STABLE_TRANSACTION_REJECTED = 5, + SHARES_LEDGER_REJECTED = 6, + INVALID_CALCULATION = 7, + INVALID_HASH = 8, + NOT_SOLVED = 9, + INVALID_COINBASE_PARAM = 10, + INVALID_COINBASE_AMOUNT = 11, + DUPLICATE_COINBASE = 12, + INVALID_LINK_NONCE = 13, + MISSING_BIT_SAMPLING = 14, + INSUFFICIENT_BIT_SAMPLING_SIZE = 15, + INVALID_BIT_SAMPLED = 16, + INVALID_STAKE = 17, + INVALID_BIT_SAMPLE_SIGNATURE = 18, + INVALID_DATUM_AUDIT_SIGNATURE = 19, + INVALID_JOB_MICRONOTE_ID_SIGNATURE = 20, + INVALID_DATUM_AUDITOR = 21, + INVALID_JOB_NOTE_ID = 22, + INVALID_DATUM_XORED_CANDIDATE_SIGNATURE = 23, + INSUFFICIENT_XORED_CANDIDATES_FOUND = 24, + DUPLICATE_DATUM_AUDITOR = 25, + INSUFFICIENT_DATUM_SECOND_PINGS = 26, + INSUFFICIENT_DATUM_AUDITORS = 27, + INVALID_PARAM = 28, + INVALID_SIDECHAIN_TRANSFER = 29, + INVALID_JOB_SIDECHAIN = 30, + INVALID_DATUM_COORDINATOR_SIGNATURE = 31, + INVALID_SIDECHAIN_ROOT_PUBLIC_KEY = 32, + INVALID_SIDECHAIN_SNAPSHOT_BURN = 33, + SIDECHAIN_OUT_OF_BALANCE = 34, + INVALID_SIDECHAIN_FEES_COLLECTED = 35, + INVALID_SIDECHAIN_FUNDS = 36, + INVALID_SIDECHAIN_ADDRESS_PROOF = 37, +} +export default BlockError; diff --git a/shared/specification/types/CoinageType.ts b/shared/specification/types/CoinageType.ts new file mode 100644 index 000000000..863d248bf --- /dev/null +++ b/shared/specification/types/CoinageType.ts @@ -0,0 +1,6 @@ +enum CoinageType { + GRANT = 0, + SHAREHOLDERS = 1, + WEBHITS = 2, +} +export default CoinageType; diff --git a/shared/specification/types/IArithmeticEncoding.ts b/shared/specification/types/IArithmeticEncoding.ts new file mode 100644 index 000000000..d31d9e67d --- /dev/null +++ b/shared/specification/types/IArithmeticEncoding.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; + +export const ArithmeticEncodingSchema = z.object({ + powerOf2: z.number().nonnegative(), + multiplierInThousandths: z.number().nonnegative().optional(), +}); + +type IArithmeticEncoding = z.infer; +export default IArithmeticEncoding; diff --git a/shared/specification/types/IAuthorizedSidechain.ts b/shared/specification/types/IAuthorizedSidechain.ts new file mode 100644 index 000000000..7ffa78f82 --- /dev/null +++ b/shared/specification/types/IAuthorizedSidechain.ts @@ -0,0 +1,21 @@ +import { z } from 'zod'; +import { hashValidation, publicKeyValidation } from '../common'; + +export const AuthorizedSidechainTransferSchema = z.object({ + sidechainHash: hashValidation, + transferSignature: hashValidation, +}); + +export const AuthorizedSidechainSchema = z.object({ + sidechainHash: hashValidation, + rootPublicKey: publicKeyValidation, + url: z.string().url(), + transfer: AuthorizedSidechainTransferSchema.array().optional(), // optional - if rotating key/address +}); + +type IAuthorizedSidechain = z.infer; +type IAuthorizedSidechainTransfer = z.infer; + +export { IAuthorizedSidechainTransfer }; + +export default IAuthorizedSidechain; diff --git a/shared/specification/types/IBitDatumHistory.ts b/shared/specification/types/IBitDatumHistory.ts new file mode 100644 index 000000000..fe0833bda --- /dev/null +++ b/shared/specification/types/IBitDatumHistory.ts @@ -0,0 +1,17 @@ +import { z } from 'zod'; +import { blockHeightValidation, publicKeyValidation, signatureValidation } from '../common'; +import { MicronoteBatchDatumsSchema } from './IMicronoteBatchDatums'; +import { WebhitsClaimAddressSchema } from './IWebhitsClaimAddress'; + +export const BitDatumHistorySchema = z.object({ + publicKey: publicKeyValidation, + blockHeight: blockHeightValidation, + averageXoredCandidates: z.number().int().nonnegative(), + jobByMicronoteBatch: MicronoteBatchDatumsSchema.array(), + webhitsClaimAddresses: WebhitsClaimAddressSchema.array(), + signature: signatureValidation, // need signature from original user to make sure hash that gets put into network is truly from you (should include block height) +}); + +type IBitDatumHistory = z.infer; + +export default IBitDatumHistory; diff --git a/shared/specification/types/IBlock.ts b/shared/specification/types/IBlock.ts new file mode 100644 index 000000000..9ee106ec8 --- /dev/null +++ b/shared/specification/types/IBlock.ts @@ -0,0 +1,27 @@ +import { z } from 'zod'; +import { BlockHeaderSchema } from './IBlockHeader'; +import { AuthorizedSidechainSchema } from './IAuthorizedSidechain'; +import { TransactionSchema } from './ITransaction'; +import { CoinageSchema } from './ICoinage'; +import { DatumSummarySchema } from './IDatumSummary'; +import { BitDatumHistorySchema } from './IBitDatumHistory'; + +export const BlockSchema = z.object({ + header: BlockHeaderSchema, + stableLedger: TransactionSchema.array(), + sharesLedger: TransactionSchema.array(), // all share trades must happen in the sharesLedger + // these fields can be rolled off + coinages: CoinageSchema.array(), + datumSummary: DatumSummarySchema.array(), + bitSampling: z.object({ + bitDatumHistories: BitDatumHistorySchema.array(), + }), + sidechainGovernance: z.object({ + authorizedSidechains: AuthorizedSidechainSchema.array(), + }), + // repeated SidechainSnapshot sidechainSnapshots = 8; +}); + +type IBlock = z.infer; + +export default IBlock; diff --git a/shared/specification/types/IBlockHeader.ts b/shared/specification/types/IBlockHeader.ts new file mode 100644 index 000000000..0661a7db2 --- /dev/null +++ b/shared/specification/types/IBlockHeader.ts @@ -0,0 +1,28 @@ +import { z } from 'zod'; +import { blockHeightValidation, hashValidation } from '../common'; +import { ArithmeticEncodingSchema } from './IArithmeticEncoding'; + +export const BlockHeaderSchema = z.object({ + hash: hashValidation, + version: z.string(), + height: blockHeightValidation, + linkNonce: hashValidation, + prevBlockHash: hashValidation, + nextLinkTarget: ArithmeticEncodingSchema, // the max value of the hash that is allowed for the next linked block + time: z.date(), + stableMerkleRoot: hashValidation, + sharesMerkleRoot: hashValidation, + coinagesHash: hashValidation, + bondCentagonsCreated: z.bigint().refine(x => x >= 0n, 'Cannot be negative'), + stableCoinUSDCents: z.number().int().nonnegative(), // figure out bond price from stable price. + stableCoinVolume: z.number().int().nonnegative(), // figure out bond price from stable price. NOTE: not in centagons + datumSummaryHash: hashValidation, + sampledBitsHash: hashValidation, + xoredCandidateDistance: ArithmeticEncodingSchema, // minimum xor distance for future candidates + xoredCandidateAverage: z.number().int().nonnegative(), + sidechainChangesHash: hashValidation, + sidechainSnapshotsHash: hashValidation, +}); + +type IBlockHeader = z.infer; +export default IBlockHeader; diff --git a/shared/specification/types/IBlockSettings.ts b/shared/specification/types/IBlockSettings.ts new file mode 100644 index 000000000..d7094de7f --- /dev/null +++ b/shared/specification/types/IBlockSettings.ts @@ -0,0 +1,29 @@ +import { z } from 'zod'; +import { hashValidation, publicKeyValidation } from '../common'; +import { ArithmeticEncodingSchema } from './IArithmeticEncoding'; + +export const DatumSettingsSchema = z.object({ + xoredCandidatesMinimum: z.number().int().nonnegative(), + secondPingPercent: z.number().int().nonnegative(), + auditorsCount: z.number().int().nonnegative(), +}); + +export const ApprovedSidechainSchema = z.object({ + url: z.string(), + rootPublicKey: publicKeyValidation, +}); + +export const BlockSettingsSchema = z.object({ + xoredCandidateDistance: ArithmeticEncodingSchema, + datum: DatumSettingsSchema, + networkNodes: z.number().int().nonnegative(), + bitSamplingsInBlock: z.number().int().nonnegative(), + bitSamplingBlockAge: z.number().int().nonnegative(), + blockHash: hashValidation, + nextLinkTarget: ArithmeticEncodingSchema, + height: z.number().int().nonnegative(), + sidechains: ApprovedSidechainSchema.array(), +}); + +type IBlockSettings = z.infer; +export default IBlockSettings; diff --git a/shared/specification/types/ICoinage.ts b/shared/specification/types/ICoinage.ts new file mode 100644 index 000000000..d6553be5d --- /dev/null +++ b/shared/specification/types/ICoinage.ts @@ -0,0 +1,25 @@ +import { z } from 'zod'; +import CoinageType from './CoinageType'; +import { + addressValidation, + blockHeightValidation, + centagonTokenValidation, + hashValidation, +} from '../common'; +import { GrantTransferSchema } from './IGrantTransfer'; + +export const CoinageSchema = z.object({ + type: z.nativeEnum(CoinageType), + hash: hashValidation, + centagons: centagonTokenValidation, + minimumClaimCentagons: centagonTokenValidation, + blockHeight: blockHeightValidation, + expirationBlockHeight: blockHeightValidation, + oldestClaimHeight: blockHeightValidation, + grantAddress: addressValidation, + transfer: GrantTransferSchema, // optional - if rotating key/address +}); + +type ICoinage = z.infer; + +export default ICoinage; diff --git a/shared/specification/types/ICoordinator.ts b/shared/specification/types/ICoordinator.ts new file mode 100644 index 000000000..34f8bef0d --- /dev/null +++ b/shared/specification/types/ICoordinator.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; +import { addressValidation, publicKeyValidation, signatureValidation } from '../common'; +import { StakeSignatureSchema } from './IStakeSignature'; + +export const CoordinatorSchema = z.object({ + publicKey: publicKeyValidation, + reputation: z.number().int().nonnegative(), + proofSignature: signatureValidation, + stakeSignature: StakeSignatureSchema, + paymentAddress: addressValidation, +}); + +type ICoordinator = z.infer; + +export default ICoordinator; diff --git a/shared/specification/types/IDatum.ts b/shared/specification/types/IDatum.ts new file mode 100644 index 000000000..c04a650aa --- /dev/null +++ b/shared/specification/types/IDatum.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; +import { publicKeyValidation, signatureValidation } from '../common'; +import { ProofOfKnowledgeSchema } from './IProofOfKnowedge'; + +export const DatumSchema = z.object({ + finalResult: z.any(), + proof: ProofOfKnowledgeSchema.array(), + signature: signatureValidation, + publicKey: publicKeyValidation, + lastUpdated: z.string(), + isError: z.boolean(), +}); + +type IDatum = z.infer; + +export default IDatum; diff --git a/shared/specification/types/IDatumSummary.ts b/shared/specification/types/IDatumSummary.ts new file mode 100644 index 000000000..d8b02201b --- /dev/null +++ b/shared/specification/types/IDatumSummary.ts @@ -0,0 +1,17 @@ +import { z } from 'zod'; +import { blockHeightValidation, publicKeyValidation, signatureValidation } from '../common'; +import { WebhitsClaimAddressSchema } from './IWebhitsClaimAddress'; +import { MicronoteBatchDatumsSchema } from './IMicronoteBatchDatums'; + +export const DatumSummarySchema = z.object({ + publicKey: publicKeyValidation, + blockHeight: blockHeightValidation, + averageXoredCandidates: z.number().int().nonnegative(), + jobByMicronoteBatch: MicronoteBatchDatumsSchema.array(), + webhitsClaimAddresses: WebhitsClaimAddressSchema.array(), + signature: signatureValidation, // need signature from original user to make sure hash that gets put into network is truly from you (should include block height) +}); + +type IDatumSummary = z.infer; + +export default IDatumSummary; diff --git a/shared/specification/types/IGrantTransfer.ts b/shared/specification/types/IGrantTransfer.ts new file mode 100644 index 000000000..623da1ae9 --- /dev/null +++ b/shared/specification/types/IGrantTransfer.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; +import { hashValidation } from '../common'; +import { WalletSignatureSchema } from './IWalletSignature'; + +export const GrantTransferSchema = z.object({ + coinageHash: hashValidation, + signature: WalletSignatureSchema, +}); + +type IGrantTransfer = z.infer; + +export default IGrantTransfer; diff --git a/shared/specification/types/IMerkleProof.ts b/shared/specification/types/IMerkleProof.ts new file mode 100644 index 000000000..a97298aec --- /dev/null +++ b/shared/specification/types/IMerkleProof.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; +import { hashValidation } from '../common'; + +enum MerklePosition { + Left = 0, + Right = 1, +} + +export const MerkleProofSchema = z.object({ + position: z.nativeEnum(MerklePosition), + hash: hashValidation, +}); + +type IMerkleProof = z.infer; +export { MerklePosition }; +export default IMerkleProof; diff --git a/shared/specification/types/IMicronoteBatch.ts b/shared/specification/types/IMicronoteBatch.ts new file mode 100644 index 000000000..297aab13d --- /dev/null +++ b/shared/specification/types/IMicronoteBatch.ts @@ -0,0 +1,14 @@ +import { z } from 'zod'; +import { addressValidation, isHex, publicKeyValidation, signatureValidation } from '../common'; + +export const MicronoteBatchSchema = z.object({ + batchSlug: z.string().regex(isHex).length(10), + micronoteBatchPublicKey: publicKeyValidation, + micronoteBatchAddress: addressValidation, + sidechainPublicKey: publicKeyValidation, + sidechainValidationSignature: signatureValidation, +}); + +type IMicronoteBatch = z.infer; + +export default IMicronoteBatch; diff --git a/shared/specification/types/IMicronoteBatchDatums.ts b/shared/specification/types/IMicronoteBatchDatums.ts new file mode 100644 index 000000000..dfda33bc9 --- /dev/null +++ b/shared/specification/types/IMicronoteBatchDatums.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; +import { hashValidation, publicKeyValidation } from '../common'; + +export const MicronoteBatchDatumsSchema = z.object({ + micronoteBatchUrl: z.string().url(), + micronoteBatchPublicKey: publicKeyValidation, + jobMicronoteIdsHash: hashValidation, + jobsCount: z.number().nonnegative(), +}); + +type IMicronoteBatchDatums = z.infer; + +export default IMicronoteBatchDatums; diff --git a/shared/specification/types/INote.ts b/shared/specification/types/INote.ts new file mode 100644 index 000000000..be6d61bed --- /dev/null +++ b/shared/specification/types/INote.ts @@ -0,0 +1,18 @@ +import { z } from 'zod'; +import { WalletSignatureSchema } from './IWalletSignature'; +import { addressValidation, blockHeightValidation, hashValidation } from '../common'; +import NoteType from './NoteType'; + +export const NoteSchema = z.object({ + toAddress: addressValidation, + fromAddress: addressValidation, + centagons: z.bigint().refine(x => x > 0), + noteHash: hashValidation, + type: z.nativeEnum(NoteType), + effectiveBlockHeight: blockHeightValidation.optional(), + timestamp: z.date(), + signature: WalletSignatureSchema, +}); + +type INote = z.infer; +export default INote; diff --git a/shared/specification/types/IPayment.ts b/shared/specification/types/IPayment.ts new file mode 100644 index 000000000..220f1f2b8 --- /dev/null +++ b/shared/specification/types/IPayment.ts @@ -0,0 +1,26 @@ +import { z } from 'zod'; +import { + blockHeightValidation, + hashValidation, + micronoteIdValidation, + micronoteTokenValidation, + publicKeyValidation, + signatureValidation, +} from '../common'; + +export const PaymentSchema = z.object({ + microgons: micronoteTokenValidation, + micronoteId: micronoteIdValidation, + blockHeight: blockHeightValidation, + micronoteBatchUrl: z.string().url(), + micronoteBatchPublicKey: publicKeyValidation, + micronoteSignature: signatureValidation, + sidechainPublicKey: publicKeyValidation, + sidechainValidationSignature: signatureValidation, + guaranteeBlockHash: hashValidation, + guaranteeBlockHeight: blockHeightValidation, +}); + +type IPayment = z.infer; + +export default IPayment; diff --git a/shared/specification/types/IProofOfKnowedge.ts b/shared/specification/types/IProofOfKnowedge.ts new file mode 100644 index 000000000..b99ae90d9 --- /dev/null +++ b/shared/specification/types/IProofOfKnowedge.ts @@ -0,0 +1,33 @@ +import { z } from 'zod'; +import { + addressValidation, + blockHeightValidation, + hashValidation, + micronoteIdValidation, + micronoteTokenValidation, + nodeIdValidation, +} from '../common'; +import { XoredCandidateSchema } from './IXoredCandidate'; +import { CoordinatorSchema } from './ICoordinator'; + +export const ProofOfKnowledgeSchema = z.object({ + hash: hashValidation, + jobMicronoteId: micronoteIdValidation, + jobBlockHeight: blockHeightValidation, + blockHeight: blockHeightValidation, + xoredCandidates: XoredCandidateSchema.array(), + coordinator: CoordinatorSchema, + decoderHash: hashValidation, + decoderReputation: z.number().int().nonnegative(), + nodeIdReputationChanges: z.record(nodeIdValidation, z.number().int()), + isBlockEligible: z.boolean(), + resultHash: hashValidation, + webhitsClaimAddress: addressValidation, + viewOfTruthHash: hashValidation, + maxBasePricePerKb: micronoteTokenValidation, + maxBasePricePerQuery: micronoteTokenValidation, +}); + +type IProofOfKnowledge = z.infer; + +export default IProofOfKnowledge; diff --git a/shared/specification/types/IStakeSettings.ts b/shared/specification/types/IStakeSettings.ts new file mode 100644 index 000000000..e5b0ec629 --- /dev/null +++ b/shared/specification/types/IStakeSettings.ts @@ -0,0 +1,23 @@ +import { z } from 'zod'; +import { + addressValidation, + blockHeightValidation, + centagonTokenValidation, + hashValidation, + publicKeyValidation, +} from '../common'; + +export const StakeSettingsSchema = z.object({ + centagons: centagonTokenValidation, + rootPublicKey: publicKeyValidation, + stakeAddress: addressValidation, + stableBlockHeight: blockHeightValidation, + stableBlockHash: hashValidation, + currentBlockHash: hashValidation, + currentBlockHeight: blockHeightValidation, + refundBlockWindow: z.number().int().nonnegative(), +}); + +type IStateSettings = z.infer; + +export default IStateSettings; diff --git a/shared/specification/types/IStakeSignature.ts b/shared/specification/types/IStakeSignature.ts new file mode 100644 index 000000000..53645cd1a --- /dev/null +++ b/shared/specification/types/IStakeSignature.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; +import { blockHeightValidation, publicKeyValidation, signatureValidation } from '../common'; + +export const StakeSignatureSchema = z.object({ + signature: signatureValidation, + blockHeight: blockHeightValidation, + rootPublicKey: publicKeyValidation, +}); + +type IStakeSignature = z.infer; + +export default IStakeSignature; diff --git a/shared/specification/types/ITransaction.ts b/shared/specification/types/ITransaction.ts new file mode 100644 index 000000000..215f0c801 --- /dev/null +++ b/shared/specification/types/ITransaction.ts @@ -0,0 +1,19 @@ +import { z } from 'zod'; +import { blockHeightValidation, hashValidation } from '../common'; +import { TransactionSourceSchema } from './ITransactionSource'; +import { TransactionOutputSchema } from './ITransactionOutput'; +import TransactionType from './TransactionType'; + +export const TransactionSchema = z.object({ + transactionHash: hashValidation, // transaction hash + version: z.string(), + time: z.date(), + type: z.nativeEnum(TransactionType), + expiresAtBlockHeight: blockHeightValidation, + sources: TransactionSourceSchema.array(), // empty means coinbase (ie, printed) + outputs: TransactionOutputSchema.array(), +}); + +type ITransaction = z.infer; + +export default ITransaction; diff --git a/shared/specification/types/ITransactionOutput.ts b/shared/specification/types/ITransactionOutput.ts new file mode 100644 index 000000000..dfa2ee761 --- /dev/null +++ b/shared/specification/types/ITransactionOutput.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; +import { addressValidation, centagonTokenValidation } from '../common'; + +export const TransactionOutputSchema = z.object({ + address: addressValidation, // signatureSettings + hashed alpha sorted public keys + centagons: centagonTokenValidation, + isBond: z.boolean().optional(), + isBurned: z.boolean().optional(), // if the coins are burned up as part of the transaction + addressOnSidechain: addressValidation.optional(), + isSidechained: z.boolean().optional(), +}); + +type ITransactionOutput = z.infer; + +export default ITransactionOutput; diff --git a/shared/specification/types/ITransactionSource.ts b/shared/specification/types/ITransactionSource.ts new file mode 100644 index 000000000..f256f00be --- /dev/null +++ b/shared/specification/types/ITransactionSource.ts @@ -0,0 +1,18 @@ +import { z } from 'zod'; +import { blockHeightValidation, hashValidation } from '../common'; +import { WalletSignatureSchema } from './IWalletSignature'; +import LedgerType from './LedgerType'; + +export const TransactionSourceSchema = z.object({ + sourceTransactionHash: hashValidation.optional(), + sourceOutputIndex: z.number().int().nonnegative().optional(), + sourceWalletSignatureSettings: WalletSignatureSchema.shape.signatureSettings, + sourceWalletSigners: WalletSignatureSchema.shape.signers, + sourceLedger: z.nativeEnum(LedgerType), // if coinage or bond, need to specify where we're trying to grab from + blockClaimHeight: blockHeightValidation.optional(), // required if the transaction source is a coinage claim + coinageHash: hashValidation.optional(), // required for coinage claims +}); + +type ITransactionSource = z.infer; + +export default ITransactionSource; diff --git a/shared/specification/types/ITransactionSourceSignatureData.ts b/shared/specification/types/ITransactionSourceSignatureData.ts new file mode 100644 index 000000000..dae4fd813 --- /dev/null +++ b/shared/specification/types/ITransactionSourceSignatureData.ts @@ -0,0 +1,24 @@ +import { z } from 'zod'; +import { addressValidation, centagonTokenValidation, hashValidation } from '../common'; +import LedgerType from './LedgerType'; +import TransactionType from './TransactionType'; +import { TransactionOutputSchema } from './ITransactionOutput'; +import { WalletSignatureSchema } from './IWalletSignature'; + +export const TransactionSourceSignatureDataSchema = z.object({ + version: z.string(), + ledger: z.nativeEnum(LedgerType), + type: z.nativeEnum(TransactionType), + sourceTransactionHash: hashValidation, // transaction hash + sourceTransactionOutputIndex: z.number().int().nonnegative(), + sourceLedger: z.nativeEnum(LedgerType), + address: addressValidation, + walletSignatureSettings: WalletSignatureSchema.shape.signatureSettings, // signatures by other multisig authors + centagons: centagonTokenValidation, + coinageHash: hashValidation.optional(), + outputs: TransactionOutputSchema.array(), +}); + +type ITransactionSourceSignatureData = z.infer; + +export default ITransactionSourceSignatureData; diff --git a/shared/specification/types/IWalletOwnershipProof.ts b/shared/specification/types/IWalletOwnershipProof.ts new file mode 100644 index 000000000..f664d9a24 --- /dev/null +++ b/shared/specification/types/IWalletOwnershipProof.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; +import { publicKeyValidation, signatureValidation } from '../common'; +import { MerkleProofSchema } from './IMerkleProof'; + +export const WalletOwnershipProofSchema = z.object({ + signature: signatureValidation, + publicKey: publicKeyValidation, + ownershipMerkleProofs: MerkleProofSchema.array(), +}); + +type IWalletOwnershipProof = z.infer; + +export default IWalletOwnershipProof; diff --git a/shared/specification/types/IWalletSignature.ts b/shared/specification/types/IWalletSignature.ts new file mode 100644 index 000000000..ad90d7825 --- /dev/null +++ b/shared/specification/types/IWalletSignature.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; +import { MerkleProofSchema } from './IMerkleProof'; +import { WalletOwnershipProofSchema } from './IWalletOwnershipProof'; + +export const WalletSignatureSchema = z.object({ + signers: WalletOwnershipProofSchema.array(), + signatureSettings: z.object({ + countRequired: z.number(), + settingsMerkleProofs: MerkleProofSchema.array(), + salt: z.instanceof(Buffer).optional(), + publicKeyIndices: z.number().array().optional(), + }), +}); + +type IWalletSignature = z.infer; +export default IWalletSignature; diff --git a/shared/specification/types/IWebhitsClaimAddress.ts b/shared/specification/types/IWebhitsClaimAddress.ts new file mode 100644 index 000000000..f93ddbfca --- /dev/null +++ b/shared/specification/types/IWebhitsClaimAddress.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; +import { addressValidation, hashValidation } from '../common'; + +export const AddressCountsSchema = z.object({ + claimAddress: addressValidation, + count: z.number().int().nonnegative(), +}); + +export const WebhitsClaimAddressSchema = z.object({ + viewOfTruthHash: hashValidation, + addressCounts: AddressCountsSchema.array(), +}); + +type IWebhitsClaimAddress = z.infer; + +export default IWebhitsClaimAddress; diff --git a/shared/specification/types/IXoredCandidate.ts b/shared/specification/types/IXoredCandidate.ts new file mode 100644 index 000000000..7075c5baa --- /dev/null +++ b/shared/specification/types/IXoredCandidate.ts @@ -0,0 +1,38 @@ +import { z } from 'zod'; +import { + addressValidation, + hashValidation, + micronoteTokenValidation, + publicKeyValidation, + signatureValidation, +} from '../common'; +import { StakeSignatureSchema } from './IStakeSignature'; + +export const XoredCandidateSchema = z.object({ + nodeId: z.string(), + publicKey: publicKeyValidation, + publicIp: z.string(), + publicPort: z.number().int().positive(), + reputation: z.number().int().nonnegative(), + signature: signatureValidation, + available: z.boolean(), + stakeSignature: StakeSignatureSchema, + pricePerKb: micronoteTokenValidation, + pricePerQuery: micronoteTokenValidation, + firstPingSignature: signatureValidation, + secondPingSignature: signatureValidation, + result: z.any(), + resultHash: hashValidation, + webhitsClaimAddress: addressValidation, + resultSignature: signatureValidation, + resultError: z.object({ + name: z.string(), + description: z.string(), + }), + isConsensusResult: z.boolean(), + isHighReputationRunner: z.boolean(), + paymentAddress: addressValidation, +}); + +type IXoredCandidate = z.infer; +export default IXoredCandidate; diff --git a/shared/specification/types/IXoredCandidateSummary.ts b/shared/specification/types/IXoredCandidateSummary.ts new file mode 100644 index 000000000..d2f5b050c --- /dev/null +++ b/shared/specification/types/IXoredCandidateSummary.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; +import { addressValidation, publicKeyValidation, signatureValidation } from '../common'; +import { StakeSignatureSchema } from './IStakeSignature'; + +export const XoredCandidateSummarySchema = z.object({ + publicKey: publicKeyValidation, + reputation: z.number().nonnegative(), + firstPingSignature: signatureValidation, + secondPingSignature: signatureValidation, + auditSignature: signatureValidation, + stakeSignature: StakeSignatureSchema, + paymentAddress: addressValidation, +}); + +type IXoredCandidateSummary = z.infer; +export default IXoredCandidateSummary; diff --git a/shared/specification/types/LedgerType.ts b/shared/specification/types/LedgerType.ts new file mode 100644 index 000000000..db124c827 --- /dev/null +++ b/shared/specification/types/LedgerType.ts @@ -0,0 +1,5 @@ +enum LedgerType { + STABLE = 0, + SHARES = 1, +} +export default LedgerType; diff --git a/shared/specification/types/NoteType.ts b/shared/specification/types/NoteType.ts new file mode 100644 index 000000000..8ea85fb36 --- /dev/null +++ b/shared/specification/types/NoteType.ts @@ -0,0 +1,14 @@ +enum NoteType { + transferIn = 0, + transferOut = 1, + transfer = 2, + revenue = 3, + settlementFees = 4, + interest = 5, + micronoteFunds = 6, + micronoteBatchRefund = 7, + burn = 8, + stakeCreate = 9, + stakeRefund = 10, +} +export default NoteType; diff --git a/shared/specification/types/TransactionError.ts b/shared/specification/types/TransactionError.ts new file mode 100644 index 000000000..740f1b1bc --- /dev/null +++ b/shared/specification/types/TransactionError.ts @@ -0,0 +1,26 @@ +enum TransactionError { + INVALID_LEDGER_USED = 0, + INVALID_SOURCES = 1, + SOURCE_NOT_FOUND = 2, + FIRST_OUTPUT_MUST_BE_BOND = 3, + INVALID_OUTPUTS = 4, + INVALID_HASH = 5, + SPENT = 7, + INSUFFICIENT_CENTAGONS = 8, + INSUFFICIENT_BURN = 9, + SINGLE_BOND_OUTPUT_REQUIRED = 10, + SOURCES_FROZEN_AS_BONDS = 11, + SOURCE_IS_BURNED = 12, + TX_NOT_FOUND = 13, + INVALID_VARIABLE = 14, + INVALID_SIGNATURE = 15, + NEEDS_COOLDOWN_BEFORE_SPEND = 16, + ALREADY_CLAIMED = 17, + INVALID_COINBASE_TX = 18, + EXPIRED = 19, + SYSTEM_ERROR = 20, + SOURCE_NOT_COMMITTED_TO_A_BLOCK = 21, + COINAGE_CLAIM_MINIMUM_NOT_REACHED = 22, + SOURCE_IS_SIDECHAINED = 23, +} +export default TransactionError; diff --git a/shared/specification/types/TransactionType.ts b/shared/specification/types/TransactionType.ts new file mode 100644 index 000000000..35e315738 --- /dev/null +++ b/shared/specification/types/TransactionType.ts @@ -0,0 +1,8 @@ +enum TransactionType { + COINBASE = 0, + TRANSFER = 1, + COINAGE_CLAIM = 2, + BOND_PURCHASE = 3, + BOND_REDEMPTION = 4, // only allowed in stable ledger. must have corresponding transaction in bondTransactions +} +export default TransactionType; diff --git a/shared/specification/utils/IZodApi.ts b/shared/specification/utils/IZodApi.ts new file mode 100644 index 000000000..ade6395df --- /dev/null +++ b/shared/specification/utils/IZodApi.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; + +export type IZodSchemaToApiTypes = { + [T in keyof Z]: { + command: T; + args: z.infer; + result: z.infer; + }; +}; + +export type IZodApiTypes = { args: z.Schema; result: z.Schema }; + +export type IZodApiSpec = { [command: string]: IZodApiTypes }; diff --git a/shared/tsconfig.json b/shared/tsconfig.json index 14b8d3a80..677ab0151 100644 --- a/shared/tsconfig.json +++ b/shared/tsconfig.json @@ -4,11 +4,17 @@ "rootDir": ".", "outDir": "./build" }, - "include": ["**/*.ts", "*.json", ".eslintrc.js", "*.js"], + "references": [ + { + "path": "specification/tsconfig.json" + } + ], + "include": ["./**/*.ts", "**/*.js", "**/*.json", ".eslintrc.js"], "exclude": [ "**/tsconfig*.json", "build", "build-dist", + "specification", "node_modules", "**/node_modules", "**/*.d.ts" diff --git a/shared/yarn.lock b/shared/yarn.lock index 3c48c7bbd..d58a0952c 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -2283,6 +2283,11 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== +bignumber.js@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" + integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2581,6 +2586,11 @@ commander@^6.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^9.3.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c" + integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -7473,3 +7483,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.17.3: + version "3.17.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.17.3.tgz#86abbc670ff0063a4588d85a4dcc917d6e4af2ba" + integrity sha512-4oKP5zvG6GGbMlqBkI5FESOAweldEhSOZ6LI6cG+JzUT7ofj1ZOC0PJudpQOpT1iqOFpYYtX5Pw0+o403y4bcg== From 144d10e8e0c3d7eb4aff9e01daa43740e5142bf4 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 26 Jul 2022 18:28:21 -0400 Subject: [PATCH 021/147] chore: convert Keypair to Identity chore: Keyring to Address --- .../lib/{decodeBuffer.ts => bufferUtils.ts} | 30 ++- shared/commons/lib/errors.ts | 7 - shared/commons/lib/hashUtils.ts | 16 -- shared/crypto/cli.ts | 74 +++---- shared/crypto/interfaces/IAddressSettings.ts | 13 ++ shared/crypto/interfaces/IKeyringSettings.ts | 13 -- shared/crypto/lib/Address.ts | 202 ++++++++++++++++++ .../{KeyringTree.ts => AddressOwnersTree.ts} | 48 ++--- ...eyringSignature.ts => AddressSignature.ts} | 99 ++++----- shared/crypto/lib/{Keypair.ts => Identity.ts} | 81 ++++--- shared/crypto/lib/Keyring.ts | 193 ----------------- shared/crypto/lib/MerkleTree.ts | 2 +- shared/crypto/lib/errors.ts | 8 +- shared/crypto/test/Address.test.ts | 53 +++++ shared/crypto/test/Identity.test.ts | 30 +++ shared/crypto/test/Keypair.test.ts | 29 --- shared/crypto/test/Keyring.test.ts | 53 ----- shared/specification/common.ts | 32 +-- shared/specification/index.ts | 8 +- shared/specification/mainchain/BlockApis.ts | 2 +- .../{WalletApis.ts => AddressApis.ts} | 14 +- shared/specification/sidechain/CreditApis.ts | 42 ++++ .../specification/sidechain/MicronoteApis.ts | 43 ++-- .../sidechain/MicronoteBatchApis.ts | 28 ++- shared/specification/sidechain/StakeApis.ts | 12 +- shared/specification/sidechain/index.ts | 11 +- shared/specification/types/BlockError.ts | 8 +- .../types/IAddressOwnershipProof.ts | 13 ++ .../specification/types/IAddressSignature.ts | 16 ++ .../types/IAuthorizedSidechain.ts | 4 +- .../specification/types/IBitDatumHistory.ts | 6 +- shared/specification/types/IBlockSettings.ts | 4 +- shared/specification/types/ICoordinator.ts | 4 +- shared/specification/types/IDatum.ts | 4 +- shared/specification/types/IDatumSummary.ts | 6 +- shared/specification/types/IGrantTransfer.ts | 4 +- shared/specification/types/IMicronoteBatch.ts | 9 +- .../types/IMicronoteBatchDatums.ts | 8 +- shared/specification/types/INote.ts | 5 +- shared/specification/types/IPayment.ts | 6 +- .../specification/types/IProofOfKnowedge.ts | 8 +- shared/specification/types/IStakeSettings.ts | 4 +- shared/specification/types/IStakeSignature.ts | 4 +- .../specification/types/ITransactionSource.ts | 6 +- .../types/ITransactionSourceSignatureData.ts | 4 +- .../types/IWalletOwnershipProof.ts | 13 -- .../specification/types/IWalletSignature.ts | 16 -- shared/specification/types/IXoredCandidate.ts | 4 +- .../types/IXoredCandidateSummary.ts | 4 +- shared/specification/types/NoteType.ts | 2 +- shared/specification/types/TransactionType.ts | 2 +- 51 files changed, 709 insertions(+), 598 deletions(-) rename shared/commons/lib/{decodeBuffer.ts => bufferUtils.ts} (55%) create mode 100644 shared/crypto/interfaces/IAddressSettings.ts delete mode 100644 shared/crypto/interfaces/IKeyringSettings.ts create mode 100644 shared/crypto/lib/Address.ts rename shared/crypto/lib/{KeyringTree.ts => AddressOwnersTree.ts} (64%) rename shared/crypto/lib/{KeyringSignature.ts => AddressSignature.ts} (53%) rename shared/crypto/lib/{Keypair.ts => Identity.ts} (61%) delete mode 100644 shared/crypto/lib/Keyring.ts create mode 100644 shared/crypto/test/Address.test.ts create mode 100644 shared/crypto/test/Identity.test.ts delete mode 100644 shared/crypto/test/Keypair.test.ts delete mode 100644 shared/crypto/test/Keyring.test.ts rename shared/specification/sidechain/{WalletApis.ts => AddressApis.ts} (56%) create mode 100644 shared/specification/sidechain/CreditApis.ts create mode 100644 shared/specification/types/IAddressOwnershipProof.ts create mode 100644 shared/specification/types/IAddressSignature.ts delete mode 100644 shared/specification/types/IWalletOwnershipProof.ts delete mode 100644 shared/specification/types/IWalletSignature.ts diff --git a/shared/commons/lib/decodeBuffer.ts b/shared/commons/lib/bufferUtils.ts similarity index 55% rename from shared/commons/lib/decodeBuffer.ts rename to shared/commons/lib/bufferUtils.ts index aebe9762a..592b16443 100644 --- a/shared/commons/lib/decodeBuffer.ts +++ b/shared/commons/lib/bufferUtils.ts @@ -1,3 +1,4 @@ +import { bech32m } from 'bech32'; import * as zlib from 'zlib'; import { promisify } from 'util'; @@ -6,7 +7,34 @@ const inflateRawAsync = promisify(zlib.inflateRaw); const brotliDecompressAsync = promisify(zlib.brotliDecompress); const gunzipAsync = promisify(zlib.gunzip); -export default function decodeBuffer(buffer: Buffer, encoding: string): Promise { +export function concatAsBuffer(...items: (string | number | Buffer)[]): Buffer { + return Buffer.concat( + items.map(x => { + if (Buffer.isBuffer(x)) return x; + if (!x && x !== 0) { + return Buffer.from(''); + } + return Buffer.from(String(x)); + }), + ); +} + +export function encodeBuffer(digest: Buffer, prefix: string): string { + const words = bech32m.toWords(digest); + return bech32m.encode(prefix, words, 256); +} + +export function decodeBuffer(encoded: string, expectedPrefix: string): Buffer { + const { prefix, words } = bech32m.decode(encoded, 256); + if (prefix !== expectedPrefix) { + throw new Error( + `The encoded hash had a different prefix (${prefix}) than expected (${expectedPrefix}).`, + ); + } + return Buffer.from(bech32m.fromWords(words)); +} + +export function decompressBuffer(buffer: Buffer, encoding: string): Promise { if (!buffer || !encoding) return Promise.resolve(buffer); if (encoding === 'gzip' || encoding === 'x-gzip') { diff --git a/shared/commons/lib/errors.ts b/shared/commons/lib/errors.ts index 41bdb44a8..d44aed005 100644 --- a/shared/commons/lib/errors.ts +++ b/shared/commons/lib/errors.ts @@ -23,12 +23,6 @@ class UlixeeError extends Error { } } -class InsufficientResourcesError extends UlixeeError { - constructor(message, resourceType) { - super(message || 'Insufficient network resources', 'processing::resources', { resourceType }); - } -} - class ValidationError extends UlixeeError { constructor(errors) { super('Invalid request', 'invalid::parameters', { errors }); @@ -63,7 +57,6 @@ export { APIError, UlixeeError, ValidationError, - InsufficientResourcesError, ClientError, UnapprovedSidechainError, MalformedRequestError, diff --git a/shared/commons/lib/hashUtils.ts b/shared/commons/lib/hashUtils.ts index 62d9ec5a3..361f865cb 100644 --- a/shared/commons/lib/hashUtils.ts +++ b/shared/commons/lib/hashUtils.ts @@ -1,26 +1,10 @@ import { createHash } from 'crypto'; -import { bech32m } from 'bech32'; import TypeSerializer from './TypeSerializer'; export function sha3(data: Buffer | string): Buffer { return createHash('sha3-256').update(data).digest(); } -export function encodeHash(digest: Buffer, prefix: 'scr' | 'dbx' | 'ar'): string { - const words = bech32m.toWords(digest); - return bech32m.encode(prefix, words, 256); -} - -export function decodeHash(hash: string, expectedPrefix: 'scr' | 'dbx' | 'ar'): Buffer { - const { prefix, words } = bech32m.decode(hash, 256); - if (prefix !== expectedPrefix) { - throw new Error( - `The encoded hash had a different prefix (${prefix}) than expected (${expectedPrefix}).`, - ); - } - return Buffer.from(bech32m.fromWords(words)); -} - export function sortedJsonStringify(obj: T | null, ignoreProperties: (keyof T)[] = []): string { if (!obj) { return '{}'; diff --git a/shared/crypto/cli.ts b/shared/crypto/cli.ts index f9a3a092a..836ffe7f5 100644 --- a/shared/crypto/cli.ts +++ b/shared/crypto/cli.ts @@ -2,17 +2,17 @@ import { Command } from 'commander'; import { APIError } from '@ulixee/commons/lib/errors'; import { assert } from '@ulixee/commons/lib/utils'; import { randomBytes } from 'crypto'; -import Keypair from '@ulixee/crypto/lib/Keypair'; +import Identity from '@ulixee/crypto/lib/Identity'; import * as Path from 'path'; import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; -import Keyring from './lib/Keyring'; -import IKeyringSettings, { IKeyType } from './interfaces/IKeyringSettings'; +import Address from './lib/Address'; +import IAddressSettings, { ISignerType } from './interfaces/IAddressSettings'; const logError = (err: Error): void => { if (err instanceof APIError) { - console.log(`KEYS API ERROR: ${err.toString()}`); // eslint-disable-line no-console + console.log(`IDENTITIES API ERROR: ${err.toString()}`); // eslint-disable-line no-console } else { - console.log(`\nKEYS ERROR: ${err.message}\n`); // eslint-disable-line no-console + console.log(`\nIDENTITIES ERROR: ${err.message}\n`); // eslint-disable-line no-console } }; @@ -22,14 +22,14 @@ export default function cliCommands(): Command { const cryptoCommands = new Command().version(version); cryptoCommands - .command('keyring') - .description('Create a new Wallet keyring (multi-capability + multisig keys).') + .command('address') + .description('Create a new address.') .argument( - '[keyPattern]', - 'The key pattern you wish to create. Specify which actions each key in your Keyring should be used for. T=Transfer, C=Claim, U=Universal. eg, TTC = 3 key ring with 2 transfer keys and 1 claim key', + '[signerPattern]', + 'The pattern of signing Identities you wish to create. Specify which actions each identity should be used for. T=Transfer, C=Claim, U=Universal. eg, TTC = 3 key ring with 2 transfer identities and 1 claim key', 'U', ) - .argument('[filename]', 'Where do you want to save this Keyring?', 'UlixeeKeyring.json') + .argument('[filename]', 'Where do you want to save this Address?', 'UlixeeAddress.json') .option( '-t, --transfer-signatures ', 'How many signatures should be required for transfers?', @@ -52,15 +52,15 @@ export default function cliCommands(): Command { 'Add salt (noise) to your claims signatures', randomBytes(32).toString('base64'), ) - .action(async (keyPattern: string, filename: string, args): Promise => { + .action(async (signerPattern: string, filename: string, args): Promise => { try { const { transferSignatures, claimSignatures, transferSalt, claimSalt } = args; - const keys = keyPattern.length; - assert(keyPattern.length <= 6, 'A max of 6 keys is allowed in a keyring.'); - assert(keyPattern.length > 0, 'You must specify at least one key'); + const signersCount = signerPattern.length; + assert(signerPattern.length <= 6, 'A max of 6 signing Identities is allowed in an Address.'); + assert(signerPattern.length > 0, 'You must specify at least one key'); assert( - keyPattern.match(/[TCU]+/i), - 'Valid key options are T=Transfer, C=Claim, U=Universal', + signerPattern.match(/[TCU]+/i), + 'Valid signer options are T=Transfer, C=Claim, U=Universal', ); assert( transferSignatures > 0, @@ -71,61 +71,61 @@ export default function cliCommands(): Command { 'You must require at least one claim signature (-c, --claim-signatures)', ); assert( - transferSignatures <= keys, - 'You cannot have more transfer signatures required than total keys', + transferSignatures <= signersCount, + 'You cannot have more transfer signatures required than total identities', ); assert( - claimSignatures <= keys, - 'You cannot have more claim signatures required than total keys', + claimSignatures <= signersCount, + 'You cannot have more claim signatures required than total identities', ); - const keyTypes = [...keyPattern] as IKeyType[]; - const keypairs = await Promise.all(keyTypes.map(Keypair.create)); - const keyringSettings: IKeyringSettings = { - keyTypes, + const signerTypes = [...signerPattern] as ISignerType[]; + const identities = await Promise.all(signerTypes.map(Identity.create)); + const addressSettings: IAddressSettings = { + signerTypes, transferSignatureSettings: transferSignatures, transferSignatureSalt: transferSalt ? Buffer.from(transferSalt) : null, claimSignatureSettings: claimSignatures, claimSignatureSalt: claimSalt ? Buffer.from(claimSalt) : null, }; - const keyring = Keyring.createFromKeypairs(keypairs, keyringSettings); + const address = Address.createFromSigningIdentities(identities, addressSettings); if (filename.endsWith('.json')) { filename = filename.replace(Path.extname(filename), ''); } - const filepath = await keyring.save(true, Path.basename(filename), Path.dirname(filename)); - console.log('Wrote address: %s to %s', keyring.address, filepath); // eslint-disable-line no-console - console.log(TypeSerializer.stringify(keyring.toJSON(), { format: true })); // eslint-disable-line no-console + const filepath = await address.save(true, Path.basename(filename), Path.dirname(filename)); + console.log('Wrote address: %s to %s', address.bech32, filepath); // eslint-disable-line no-console + console.log(TypeSerializer.stringify(address.toJSON(), { format: true })); // eslint-disable-line no-console } catch (err) { logError(err); } }); cryptoCommands - .command('key') + .command('identity') .description( - 'Create a Network key (ed25519 key). It will be used to anonymously secure your requests.', + 'Create an Identity (ed25519 key). It will be used to anonymously secure your network requests.', ) - .option('-p, --passphrase ', 'Save this key with a passphrase (pkcs8 format).') + .option('-p, --passphrase ', 'Save the private key with a passphrase (pkcs8 format).') .option( '-c, --passphrase-cipher ', - 'Encrypt the key with a cipher (pkcs8 format).', - Keypair.defaultPkcsCipher, + 'Encrypt the internal key with a cipher (pkcs8 format).', + Identity.defaultPkcsCipher, ) .option( '-f, --filename ', - 'Save this keypair to a filepath. If not specified, will be console logged.', + 'Save this Identity to a filepath. If not specified, will be console logged.', ) .action(async ({ path, passphrase, cipher }) => { - const keypair = await Keypair.create(); + const identity = await Identity.create(); if (path) { - await keypair.save(path, { passphrase, cipher }); + await identity.save(path, { passphrase, cipher }); const finalPath = await this.lockfile.save(path); console.log('Saved to %s', finalPath); // eslint-disable-line no-console } else { - console.log(keypair.export(passphrase, cipher)); // eslint-disable-line no-console + console.log(identity.export(passphrase, cipher)); // eslint-disable-line no-console } }); diff --git a/shared/crypto/interfaces/IAddressSettings.ts b/shared/crypto/interfaces/IAddressSettings.ts new file mode 100644 index 000000000..7960f20b9 --- /dev/null +++ b/shared/crypto/interfaces/IAddressSettings.ts @@ -0,0 +1,13 @@ +export default interface IAddressSettings { + signerTypes: ISignerType[]; + transferSignatureSettings?: number; // default is all public keys + transferSignatureSalt?: Buffer; + claimSignatureSettings?: number; // default is only 1 key for claims + claimSignatureSalt?: Buffer; +} + +const UniversalSigner = 'U'; +const ClaimsSigner = 'C'; +const TransferSigner = 'T'; +type ISignerType = typeof UniversalSigner | typeof ClaimsSigner | typeof TransferSigner; +export { UniversalSigner, ClaimsSigner, ISignerType, TransferSigner }; diff --git a/shared/crypto/interfaces/IKeyringSettings.ts b/shared/crypto/interfaces/IKeyringSettings.ts deleted file mode 100644 index 5784f109f..000000000 --- a/shared/crypto/interfaces/IKeyringSettings.ts +++ /dev/null @@ -1,13 +0,0 @@ -export default interface IKeyringSettings { - keyTypes: IKeyType[]; - transferSignatureSettings?: number; // default is all public keys - transferSignatureSalt?: Buffer; - claimSignatureSettings?: number; // default is only 1 key for claims - claimSignatureSalt?: Buffer; -} - -const UniversalKey = 'U'; -const ClaimsKey = 'C'; -const TransferKey = 'T'; -type IKeyType = typeof UniversalKey | typeof ClaimsKey | typeof TransferKey; -export { UniversalKey, ClaimsKey, IKeyType, TransferKey }; diff --git a/shared/crypto/lib/Address.ts b/shared/crypto/lib/Address.ts new file mode 100644 index 000000000..7fc0dc19d --- /dev/null +++ b/shared/crypto/lib/Address.ts @@ -0,0 +1,202 @@ +import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; +import * as path from 'path'; +import * as fs from 'fs'; +import Identity from '@ulixee/crypto/lib/Identity'; +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import IAddressSignature from '@ulixee/specification/types/IAddressSignature'; +import { encodeBuffer, decodeBuffer } from '@ulixee/commons/lib/bufferUtils'; +import IAddressSettings, { + ClaimsSigner, + TransferSigner, + UniversalSigner, +} from '../interfaces/IAddressSettings'; +import AddressOwnersTree from './AddressOwnersTree'; +import AddressSignature from './AddressSignature'; + +let isFilepathInitialized = false; + +export default class Address { + public static defaultDirname = 'addresses'; + + public readonly bech32: string; + public addressSettings: IAddressSettings; + public ownersMerkleTree: MerkleTree; + + public readonly transferSigners: Identity[] = []; + public readonly claimSigners: Identity[] = []; + + private readonly loadedIdentitiesAtIndexes: Identity[] = []; + + constructor( + merkleTreeLeaves: Buffer[], + settings: IAddressSettings, + loadedIdentitiesAtIndexes: (Identity | undefined)[], + ) { + this.loadedIdentitiesAtIndexes = loadedIdentitiesAtIndexes; + + this.addressSettings = settings ?? ({} as any); + this.addressSettings.signerTypes ??= loadedIdentitiesAtIndexes.map(() => UniversalSigner); + for (let i = 0; i <= loadedIdentitiesAtIndexes.length; i += 1) { + if (loadedIdentitiesAtIndexes[i]) { + const keyType = this.addressSettings.signerTypes[i]; + + if (keyType === UniversalSigner || keyType === TransferSigner) { + this.transferSigners.push(loadedIdentitiesAtIndexes[i]); + } + if (keyType === UniversalSigner || keyType === ClaimsSigner) { + this.claimSigners.push(loadedIdentitiesAtIndexes[i]); + } + } + } + this.addressSettings.transferSignatureSettings ||= this.transferSigners.length; + this.addressSettings.claimSignatureSettings ||= 1; + this.ownersMerkleTree = new MerkleTree(merkleTreeLeaves); + this.bech32 = Address.encodeAddress(this.ownersMerkleTree.getRoot()); + } + + public async save(format = false, filename?: string, relativeTo?: string): Promise { + const basePath = relativeTo || path.join(process.cwd(), Address.defaultDirname); + if (!isFilepathInitialized) { + if (!fs.existsSync(basePath)) fs.mkdirSync(basePath, { recursive: true }); + isFilepathInitialized = true; + } + + const json = TypeSerializer.stringify(this.toJSON(), { format }); + const filepath = path.resolve(basePath, `${filename || this.bech32}.json`); + await fs.promises.writeFile(filepath, json, { encoding: 'utf8' }); + return filepath; + } + + public sign(hash: Buffer, identityIndexes: number[], isClaim = false): IAddressSignature { + const identities: Identity[] = []; + + for (let i = 0; i < this.loadedIdentitiesAtIndexes.length; i += 1) { + if (!identityIndexes.includes(i)) continue; + this.verifyKeyType(i, isClaim); + const key = this.loadedIdentitiesAtIndexes[i]; + if (key) identities.push(key); + } + + return AddressSignature.create( + hash, + identities, + this.ownersMerkleTree, + this.addressSettings, + isClaim, + ); + } + + public verifyKeyType(index: number, isClaim: boolean): void { + const keyType = this.addressSettings.signerTypes[index]; + const isUniversalKey = keyType === UniversalSigner; + + if (!isUniversalKey) { + if (isClaim && keyType !== ClaimsSigner) + throw new Error( + `Invalid key index provided (${index}). Index not valid for claim transactions.`, + ); + if (!isClaim && keyType !== TransferSigner) + throw new Error( + `Invalid key index provided (${index}). Index not valid for transfer transactions.`, + ); + } + } + + public equals(addressBech32: string): boolean { + return this.bech32 === addressBech32; + } + + public toJSON(): IAddressJson { + return { + settings: this.addressSettings, + bech32: this.bech32, + merkleLeaves: this.ownersMerkleTree.leaves, + loadedKeysAtIndexes: this.loadedIdentitiesAtIndexes.map(x => (x ? x.export() : null)), + }; + } + + public static verify( + addressBech32: string, + hashedMessage: Buffer, + signature: IAddressSignature, + isClaim = false, + ): boolean { + const treeRoot = this.decodeAddress(addressBech32); + const addressSignature = new AddressSignature(treeRoot, signature); + return !addressSignature.isInvalid(hashedMessage, isClaim); + } + + public static createFromSigningIdentities( + signingIdentities: Identity[], + settings?: IAddressSettings, + ): Address { + settings ??= { signerTypes: signingIdentities.map(() => UniversalSigner) }; + + settings.transferSignatureSettings ??= settings.signerTypes.filter( + x => x === UniversalSigner || x === TransferSigner, + ).length; + settings.claimSignatureSettings ??= 1; + + const merkleTree = AddressOwnersTree.create( + signingIdentities.map(x => x.bech32), + settings, + ); + settings.signerTypes ??= signingIdentities.map(() => UniversalSigner); + + return new Address(merkleTree.leaves, settings, signingIdentities); + } + + public static fromStored(stored: IAddressJson): Address { + const { merkleLeaves, loadedKeysAtIndexes, bech32, settings } = stored; + + const address = new Address( + merkleLeaves, + settings, + loadedKeysAtIndexes.map(x => (x ? Identity.loadFromPem(x) : null)), + ); + if (address.bech32 !== bech32) + throw new Error( + `Failed to load Address Address. Different key calculated. (calculated: ${address.bech32}, stored: ${bech32})`, + ); + return address; + } + + public static readFromPath(filepath: string, relativeToDir = process.cwd()): Address { + if (!path.isAbsolute(filepath)) filepath = path.resolve(relativeToDir, filepath); + const data = fs.readFileSync(filepath, { encoding: 'utf8' }); + const address = TypeSerializer.parse(data); + return Address.fromStored(address); + } + + public static readFromFile(addressBech32: string, relativeToDir = process.cwd()): Address { + const filepath = path.resolve(relativeToDir, Address.defaultDirname, `${addressBech32}.json`); + return Address.readFromPath(filepath); + } + + public static getIdentityIndices(settings: IAddressSettings, isClaim: boolean): number[] { + const identityIndices: number[] = []; + for (let i = 0; i < settings.signerTypes.length; i += 1) { + const type = settings.signerTypes[i]; + + if (type === UniversalSigner) identityIndices.push(i); + else if (isClaim && type === ClaimsSigner) identityIndices.push(i); + else if (!isClaim && type === TransferSigner) identityIndices.push(i); + } + return identityIndices; + } + + public static encodeAddress(treeRoot: Buffer): string { + return encodeBuffer(treeRoot, 'ar'); + } + + public static decodeAddress(addressBech32: string): Buffer { + return decodeBuffer(addressBech32, 'ar'); + } +} + +interface IAddressJson { + bech32: string; + merkleLeaves: Buffer[]; + settings: IAddressSettings; + loadedKeysAtIndexes: (string | null)[]; +} diff --git a/shared/crypto/lib/KeyringTree.ts b/shared/crypto/lib/AddressOwnersTree.ts similarity index 64% rename from shared/crypto/lib/KeyringTree.ts rename to shared/crypto/lib/AddressOwnersTree.ts index 1a3ec10fa..700802c88 100644 --- a/shared/crypto/lib/KeyringTree.ts +++ b/shared/crypto/lib/AddressOwnersTree.ts @@ -2,31 +2,31 @@ import { sha3 } from '@ulixee/commons/lib/hashUtils'; import * as assert from 'assert'; import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; import { IMerkleProof } from '@ulixee/specification'; -import IKeyringSettings, { - ClaimsKey, - TransferKey, - UniversalKey, -} from '../interfaces/IKeyringSettings'; +import IAddressSettings, { + ClaimsSigner, + TransferSigner, + UniversalSigner, +} from '../interfaces/IAddressSettings'; -export default class KeyringTree { +export default class AddressOwnersTree { public static getProof( - publicKey: Buffer, + identity: string, isClaim: boolean, merkleTree: MerkleTree, ): { signatureSettings: IMerkleProof[]; - publicKeyProof: IMerkleProof[]; + ownerIdentityProof: IMerkleProof[]; } { - const signatureSettings = KeyringTree.getSignatureSettingsProof(merkleTree, isClaim); - const publicKeyProof = KeyringTree.getPublicKeyProof(merkleTree, publicKey); + const signatureSettings = AddressOwnersTree.getSignatureSettingsProof(merkleTree, isClaim); + const ownerIdentityProof = AddressOwnersTree.getIdentityIsOwnerProof(merkleTree, identity); return { signatureSettings, - publicKeyProof, + ownerIdentityProof, }; } - public static getPublicKeyProof(merkleTree: MerkleTree, publicKey: Buffer): IMerkleProof[] { - return merkleTree.getProof(sha3(publicKey)); + public static getIdentityIsOwnerProof(merkleTree: MerkleTree, identity: string): IMerkleProof[] { + return merkleTree.getProof(sha3(identity)); } public static getSignatureSettingsProof( @@ -36,26 +36,26 @@ export default class KeyringTree { return merkleTree.getProofForIndex(isClaim ? -1 : -2); } - public static create(publicKeys: Buffer[], details: IKeyringSettings): MerkleTree { + public static create(identities: string[], details: IAddressSettings): MerkleTree { const { claimSignatureSettings } = details; let signatureSettings = details.transferSignatureSettings; - assert(publicKeys.length > 0 && publicKeys.length <= 6, 'Must provide 1-6 valid public key(s)'); + assert(identities.length > 0 && identities.length <= 6, 'Must provide 1-6 valid public key(s)'); assert( signatureSettings ? signatureSettings < 7 : true, 'Must require 6 or less signatures in a multisig', ); if (!signatureSettings) { - signatureSettings = publicKeys.length; + signatureSettings = identities.length; } const claimKeyIndices: number[] = []; const transferKeyIndices: number[] = []; - for (let i = 0; i < details.keyTypes.length; i += 1) { - const type = details.keyTypes[i]; - if (type === UniversalKey || type === ClaimsKey) claimKeyIndices.push(i); - if (type === UniversalKey || type === TransferKey) transferKeyIndices.push(i); + for (let i = 0; i < details.signerTypes.length; i += 1) { + const type = details.signerTypes[i]; + if (type === UniversalSigner || type === ClaimsSigner) claimKeyIndices.push(i); + if (type === UniversalSigner || type === TransferSigner) transferKeyIndices.push(i); } if (claimKeyIndices && claimKeyIndices.length) { @@ -64,7 +64,7 @@ export default class KeyringTree { 'Must provide enough valid public key indices to make claims', ); for (const index of claimKeyIndices) { - assert(index < publicKeys.length, 'Claim index must be within range of public keys'); + assert(index < identities.length, 'Claim index must be within range of public keys'); } } @@ -74,11 +74,11 @@ export default class KeyringTree { 'Must provide enough valid public key indices to make transfers', ); for (const index of transferKeyIndices) { - assert(index < publicKeys.length, 'Transfer index must be within range of public keys'); + assert(index < identities.length, 'Transfer index must be within range of public keys'); } } - const leaves = publicKeys.map(sha3); + const leaves = identities.map(sha3); let fillLeaves = 2; if (leaves.length > 2) { fillLeaves = 6; @@ -87,7 +87,7 @@ export default class KeyringTree { while (leaves.length < fillLeaves) { leaves.push( // empty string hashed - Buffer.from('1111111111111111111111111111111111111111111111111111111111111111', 'hex'), + Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'), ); } diff --git a/shared/crypto/lib/KeyringSignature.ts b/shared/crypto/lib/AddressSignature.ts similarity index 53% rename from shared/crypto/lib/KeyringSignature.ts rename to shared/crypto/lib/AddressSignature.ts index 50e546e2f..f42d11cd6 100644 --- a/shared/crypto/lib/KeyringSignature.ts +++ b/shared/crypto/lib/AddressSignature.ts @@ -1,18 +1,18 @@ -import { IWalletOwnershipProof, IWalletSignature } from '@ulixee/specification'; -import Keypair from '@ulixee/crypto/lib/Keypair'; +import { IAddressOwnershipProof, IAddressSignature } from '@ulixee/specification'; +import Identity from '@ulixee/crypto/lib/Identity'; import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; import { sha3 } from '@ulixee/commons/lib/hashUtils'; import { MerklePosition } from '@ulixee/specification/types/IMerkleProof'; -import IKeyringSettings from '../interfaces/IKeyringSettings'; -import KeyringTree from './KeyringTree'; -import Keyring from './Keyring'; +import IAddressSettings from '../interfaces/IAddressSettings'; +import AddressOwnersTree from './AddressOwnersTree'; +import Address from './Address'; -export default class KeyringSignature { - public get signatureSettings(): IWalletSignature['signatureSettings'] { +export default class AddressSignature { + public get signatureSettings(): IAddressSignature['signatureSettings'] { return this.signature.signatureSettings; } - constructor(readonly treeRoot: Buffer, readonly signature: IWalletSignature) {} + constructor(readonly treeRoot: Buffer, readonly signature: IAddressSignature) {} public isValidSignaturePosition(isClaim: boolean): boolean { const proofsToRight = this.signatureSettings.settingsMerkleProofs.filter( @@ -34,18 +34,18 @@ export default class KeyringSignature { return true; } - public isValidPublicKeyProof(owner: IWalletOwnershipProof): boolean { + public isValidWalletOwnershipProof(owner: IAddressOwnershipProof): boolean { const isValidProof = MerkleTree.verify( owner.ownershipMerkleProofs, - sha3(owner.publicKey), + sha3(owner.identity), this.treeRoot, ); if (!isValidProof) return false; - const publicKeyIndices = this.signature.signatureSettings.publicKeyIndices; - if (publicKeyIndices && publicKeyIndices.length) { + const identityIndices = this.signature.signatureSettings.identityIndices; + if (identityIndices && identityIndices.length) { const index = MerkleTree.getLeafIndex(owner.ownershipMerkleProofs); - if (publicKeyIndices.includes(index) === false) { + if (identityIndices.includes(index) === false) { return false; } } @@ -56,10 +56,10 @@ export default class KeyringSignature { // verify the signature count location return MerkleTree.verify( this.signatureSettings.settingsMerkleProofs, - KeyringTree.createLeaf( + AddressOwnersTree.createLeaf( this.signatureSettings.countRequired, this.signatureSettings.salt, - this.signatureSettings.publicKeyIndices, + this.signatureSettings.identityIndices, ), this.treeRoot, ); @@ -69,27 +69,27 @@ export default class KeyringSignature { const isValidSignatureSettings = this.isValidSignatureSettingsProof() && this.isValidSignaturePosition(isClaim); if (!isValidSignatureSettings) { - return 'Invalid signature required proof provided'; + return 'Invalid RequiredSignatureSettings proof provided'; } const signatures: Buffer[] = []; - const seenPublicKeys = new Set(); + const seenIdentities = new Set(); for (const signer of this.signature.signers) { - const publicKey = signer.publicKey.toString('hex'); - if (seenPublicKeys.has(publicKey)) { + const identity = signer.identity; + if (seenIdentities.has(identity)) { continue; } - seenPublicKeys.add(publicKey); - const isValidPublicKey = this.isValidPublicKeyProof(signer); - if (isValidPublicKey === false) { + seenIdentities.add(identity); + const isValidIdentity = this.isValidWalletOwnershipProof(signer); + if (isValidIdentity === false) { return 'Invalid public key provided'; } /** * verify signatures of each public key */ - const isMatch = Keypair.verify( - signer.publicKey, + const isMatch = Identity.verify( + signer.identity, sha3(Buffer.concat([messageHash, ...signatures])), signer.signature, ); @@ -100,49 +100,52 @@ export default class KeyringSignature { } // ensure signatures are unique - if (seenPublicKeys.size < this.signatureSettings.countRequired) { - return `Insufficient public key signatures provided ${seenPublicKeys.size} vs ${this.signatureSettings.countRequired} required`; + if (seenIdentities.size < this.signatureSettings.countRequired) { + return `Insufficient public key signatures provided ${seenIdentities.size} vs ${this.signatureSettings.countRequired} required`; } return null; } public static buildSignatureSettings( addressTree: MerkleTree, - keyringSettings: IKeyringSettings, + addressSettings: IAddressSettings, isClaim = false, - ): IWalletSignature['signatureSettings'] { + ): IAddressSignature['signatureSettings'] { return { countRequired: isClaim - ? keyringSettings.claimSignatureSettings - : keyringSettings.transferSignatureSettings, + ? addressSettings.claimSignatureSettings + : addressSettings.transferSignatureSettings, settingsMerkleProofs: addressTree.getProofForIndex(isClaim ? -1 : -2), // notes are all transfers - salt: isClaim ? keyringSettings.claimSignatureSalt : keyringSettings.transferSignatureSalt, - publicKeyIndices: Keyring.getKeyIndices(keyringSettings, isClaim), + salt: isClaim ? addressSettings.claimSignatureSalt : addressSettings.transferSignatureSalt, + identityIndices: Address.getIdentityIndices(addressSettings, isClaim), }; } public static create( hash: Buffer, - keypairs: Keypair[], - addressTree: MerkleTree, - keyringSettings: IKeyringSettings, + identities: Identity[], + addressOwnersTree: MerkleTree, + addressSettings: IAddressSettings, isClaim = false, - ): IWalletSignature { + ): IAddressSignature { const signatures: Buffer[] = []; return { - signers: keypairs.map(key => { - const publicKeyProof = KeyringTree.getPublicKeyProof(addressTree, key.publicKey); - const ownerProof: IWalletOwnershipProof = { - ownershipMerkleProofs: publicKeyProof, - publicKey: key.publicKey, - signature: key.sign(sha3(Buffer.concat([hash, ...signatures]))), + signers: identities.map(identity => { + const identityProof = AddressOwnersTree.getIdentityIsOwnerProof( + addressOwnersTree, + identity.bech32, + ); + const ownerProof: IAddressOwnershipProof = { + ownershipMerkleProofs: identityProof, + identity: identity.bech32, + signature: identity.sign(sha3(Buffer.concat([hash, ...signatures]))), }; signatures.push(ownerProof.signature); return ownerProof; }), - signatureSettings: KeyringSignature.buildSignatureSettings( - addressTree, - keyringSettings, + signatureSettings: AddressSignature.buildSignatureSettings( + addressOwnersTree, + addressSettings, isClaim, ), }; @@ -150,11 +153,11 @@ export default class KeyringSignature { public static verify( address: string, - signature: IWalletSignature, + signature: IAddressSignature, messageHash: Buffer, isClaim: boolean, ): string | null { - const root = Keyring.decodeAddress(address); - return new KeyringSignature(root, signature).isInvalid(messageHash, isClaim); + const root = Address.decodeAddress(address); + return new AddressSignature(root, signature).isInvalid(messageHash, isClaim); } } diff --git a/shared/crypto/lib/Keypair.ts b/shared/crypto/lib/Identity.ts similarity index 61% rename from shared/crypto/lib/Keypair.ts rename to shared/crypto/lib/Identity.ts index d380b6d3d..8b5705a19 100644 --- a/shared/crypto/lib/Keypair.ts +++ b/shared/crypto/lib/Identity.ts @@ -12,27 +12,35 @@ import { import { sha3 } from '@ulixee/commons/lib/hashUtils'; import { existsAsync } from '@ulixee/commons/lib/fileUtils'; import Log from '@ulixee/commons/lib/Logger'; +import { decodeBuffer, encodeBuffer } from '@ulixee/commons/lib/bufferUtils'; import { createPublicKeyFromBytes, getPublicKeyBytes } from './pkiUtils'; -import { UnreadableKeysError } from './errors'; +import { UnreadableIdentityError } from './errors'; const { log } = Log(module); const generateKeyPairAsync = promisify(generateKeyPair); -export default class Keypair { +export default class Identity { public static defaultPkcsCipher = 'aes-256-cbc'; + public static encodingPrefix = 'id' as const; public readonly privateKey: KeyObject; + public get bech32(): string { + this.#bech32 ??= encodeBuffer(this.publicKey, Identity.encodingPrefix); + return this.#bech32; + } + public get publicKey(): Buffer { this.#publicKeyBytes ??= getPublicKeyBytes(this.privateKey); return this.#publicKeyBytes; } + #bech32: string; #publicKeyBytes: Buffer; constructor(privateKey: KeyObject) { if (!privateKey) { - throw new UnreadableKeysError(`Cannot read private key`); + throw new UnreadableIdentityError(`Cannot read private key`); } this.privateKey = privateKey; } @@ -41,18 +49,24 @@ export default class Keypair { return sign(null, hashedMessage, this.privateKey); } + public equals(identityBech32: string): boolean { + return this.bech32 === identityBech32; + } + public verifyKeys(): void { const hashedMessage = sha3(Buffer.from('signed_test_message')); const signature = this.sign(hashedMessage); - const isValid = Keypair.verify(this.publicKey, hashedMessage, signature); + const isValid = Identity.verify(this.bech32, hashedMessage, signature); if (!isValid) { - throw new UnreadableKeysError('This keypair does not match the ED25519 spec'); + throw new UnreadableIdentityError( + 'This Identity private key does not match the ED25519 spec', + ); } } public export(passphrase?: string, cipher?: string): string { if (passphrase) { - cipher ??= Keypair.defaultPkcsCipher; + cipher ??= Identity.defaultPkcsCipher; } return this.privateKey.export({ type: 'pkcs8', @@ -62,6 +76,14 @@ export default class Keypair { }) as string; } + public toJSON(): string { + return this.bech32; + } + + public toString(): string { + return this.bech32; + } + public async save( filepath: string, options?: { passphrase?: string; cipher?: string }, @@ -74,7 +96,7 @@ export default class Keypair { await fs.mkdir(path.dirname(filepath), { recursive: true }); } } - if (!filepath) throw new Error('keypair is missing filepath'); + if (!filepath) throw new Error('No valid filepath was provided'); await fs.writeFile(filepath, this.export(options?.passphrase, options?.cipher)); return filepath; @@ -82,7 +104,7 @@ export default class Keypair { // CLASS METHODS //////////////////////// - public static loadFromFile(filepath: string, options?: { keyPassphrase?: string }): Keypair { + public static loadFromFile(filepath: string, options?: { keyPassphrase?: string }): Identity { if (!path.isAbsolute(filepath)) { filepath = path.join(process.cwd(), filepath); } @@ -90,47 +112,44 @@ export default class Keypair { return this.loadFromPem(data, options); } - public static loadFromPem(data: string, options?: { keyPassphrase?: string }): Keypair { + public static loadFromPem(data: string, options?: { keyPassphrase?: string }): Identity { const privateKey = createPrivateKey({ key: data, format: 'pem', type: 'pkcs8', passphrase: options?.keyPassphrase, }); - const keypair = new Keypair(privateKey); - keypair.verifyKeys(); - return keypair; + const identity = new Identity(privateKey); + identity.verifyKeys(); + return identity; } - public static createSync(): Keypair { + public static createSync(): Identity { const key = generateKeyPairSync('ed25519'); - const pair = new Keypair(key.privateKey); - pair.verifyKeys(); - return pair; + const identity = new Identity(key.privateKey); + identity.verifyKeys(); + return identity; } - public static async create(): Promise { + public static async create(): Promise { const key = await generateKeyPairAsync('ed25519'); - const pair = new Keypair(key.privateKey); + const pair = new Identity(key.privateKey); pair.verifyKeys(); return pair; } - public static verify( - publicKey: string | Buffer | KeyObject, - hashedMessage: Buffer, - signature: Buffer, - ): boolean { - if (!signature || !signature.length || !hashedMessage || !hashedMessage.length || !publicKey) + public static verify(identityBech32: string, hashedMessage: Buffer, signature: Buffer): boolean { + if ( + !signature || + !signature.length || + !hashedMessage || + !hashedMessage.length || + !identityBech32 + ) return false; - if (typeof publicKey === 'string') { - publicKey = Buffer.from(publicKey, 'hex'); - } - - if (publicKey instanceof Buffer) { - publicKey = createPublicKeyFromBytes(publicKey); - } + const publicKeyBytes = decodeBuffer(identityBech32, this.encodingPrefix); + const publicKey = createPublicKeyFromBytes(publicKeyBytes); try { return verify(null, hashedMessage, publicKey, signature); diff --git a/shared/crypto/lib/Keyring.ts b/shared/crypto/lib/Keyring.ts deleted file mode 100644 index 2686a3669..000000000 --- a/shared/crypto/lib/Keyring.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { decodeHash, encodeHash } from '@ulixee/commons/lib/hashUtils'; -import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; -import * as path from 'path'; -import * as fs from 'fs'; -import Keypair from '@ulixee/crypto/lib/Keypair'; -import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; -import IWalletSignature from '@ulixee/specification/types/IWalletSignature'; -import IKeyringSettings, { - ClaimsKey, - TransferKey, - UniversalKey, -} from '../interfaces/IKeyringSettings'; -import KeyringTree from './KeyringTree'; -import KeyringSignature from './KeyringSignature'; - -let isFilepathInitialized = false; - -export default class Keyring { - public readonly address: string; - public keyringSettings: IKeyringSettings; - public keyringMerkleTree: MerkleTree; - - public readonly transferKeys: Keypair[] = []; - public readonly claimKeys: Keypair[] = []; - - private readonly loadedKeypairsAtIndexes: Keypair[] = []; - - constructor( - merkleTreeLeaves: Buffer[], - settings: IKeyringSettings, - loadedKeypairsAtIndexes: (Keypair | undefined)[], - ) { - this.loadedKeypairsAtIndexes = loadedKeypairsAtIndexes; - - this.keyringSettings = settings ?? ({} as any); - this.keyringSettings.keyTypes ??= loadedKeypairsAtIndexes.map(() => UniversalKey); - for (let i = 0; i <= loadedKeypairsAtIndexes.length; i += 1) { - if (loadedKeypairsAtIndexes[i]) { - const keyType = this.keyringSettings.keyTypes[i]; - - if (keyType === UniversalKey || keyType === TransferKey) { - this.transferKeys.push(loadedKeypairsAtIndexes[i]); - } - if (keyType === UniversalKey || keyType === ClaimsKey) { - this.claimKeys.push(loadedKeypairsAtIndexes[i]); - } - } - } - this.keyringSettings.transferSignatureSettings ||= this.transferKeys.length; - this.keyringSettings.claimSignatureSettings ||= 1; - this.keyringMerkleTree = new MerkleTree(merkleTreeLeaves); - this.address = Keyring.encodeAddress(this.keyringMerkleTree.getRoot()); - } - - public async save(format = false, filename?: string, relativeTo?: string): Promise { - const basePath = relativeTo || path.join(process.cwd(), 'keyrings'); - if (!isFilepathInitialized) { - if (!fs.existsSync(basePath)) fs.mkdirSync(basePath, { recursive: true }); - isFilepathInitialized = true; - } - - const json = TypeSerializer.stringify(this.toJSON(), { format }); - const filepath = path.resolve(basePath, `${filename || this.address}.json`); - await fs.promises.writeFile(filepath, json, { encoding: 'utf8' }); - return filepath; - } - - public sign(hash: Buffer, keypairIndexes: number[], isClaim = false): IWalletSignature { - const keypairs: Keypair[] = []; - - for (let i = 0; i < this.loadedKeypairsAtIndexes.length; i += 1) { - if (!keypairIndexes.includes(i)) continue; - this.verifyKeyType(i, isClaim); - const key = this.loadedKeypairsAtIndexes[i]; - if (key) keypairs.push(key); - } - - return KeyringSignature.create( - hash, - keypairs, - this.keyringMerkleTree, - this.keyringSettings, - isClaim, - ); - } - - public verifyKeyType(index: number, isClaim: boolean): void { - const keyType = this.keyringSettings.keyTypes[index]; - const isUniversalKey = keyType === UniversalKey; - - if (!isUniversalKey) { - if (isClaim && keyType !== ClaimsKey) - throw new Error( - `Invalid key index provided (${index}). Index not valid for claim transactions.`, - ); - if (!isClaim && keyType !== TransferKey) - throw new Error( - `Invalid key index provided (${index}). Index not valid for transfer transactions.`, - ); - } - } - - public toJSON(): IKeyringJson { - return { - settings: this.keyringSettings, - address: this.address, - merkleLeaves: this.keyringMerkleTree.leaves, - loadedKeysAtIndexes: this.loadedKeypairsAtIndexes.map(x => (x ? x.export() : null)), - }; - } - - public static verify( - address: string, - hashedMessage: Buffer, - signature: IWalletSignature, - isClaim = false, - ): boolean { - const treeRoot = this.decodeAddress(address); - const keyringSignature = new KeyringSignature(treeRoot, signature); - return !keyringSignature.isInvalid(hashedMessage, isClaim); - } - - public static createFromKeypairs(keypairs: Keypair[], settings?: IKeyringSettings): Keyring { - settings ??= { keyTypes: keypairs.map(() => UniversalKey) }; - - settings.transferSignatureSettings ??= settings.keyTypes.filter( - x => x === UniversalKey || x === TransferKey, - ).length; - settings.claimSignatureSettings ??= 1; - - const merkleTree = KeyringTree.create( - keypairs.map(x => x.publicKey), - settings, - ); - settings.keyTypes ??= keypairs.map(() => UniversalKey); - - return new Keyring(merkleTree.leaves, settings, keypairs); - } - - public static fromStored(stored: IKeyringJson): Keyring { - const { merkleLeaves, loadedKeysAtIndexes, address, settings } = stored; - - const keyring = new Keyring( - merkleLeaves, - settings, - loadedKeysAtIndexes.map(x => (x ? Keypair.loadFromPem(x) : null)), - ); - if (keyring.address !== address) - throw new Error( - `Failed to load Address Keyring. Different key calculated. (calculated: ${keyring.address}, stored: ${address})`, - ); - return keyring; - } - - public static readFromPath(filepath: string, relativeToDir = process.cwd()): Keyring { - if (!path.isAbsolute(filepath)) filepath = path.resolve(relativeToDir, filepath); - const data = fs.readFileSync(filepath, { encoding: 'utf8' }); - const keyring = TypeSerializer.parse(data); - return Keyring.fromStored(keyring); - } - - public static readFromFile(address: string, relativeToDir = process.cwd()): Keyring { - const filepath = path.resolve(relativeToDir, 'keyrings', `${address}.json`); - return Keyring.readFromPath(filepath); - } - - public static getKeyIndices(settings: IKeyringSettings, isClaim: boolean): number[] { - const publicKeyIndices: number[] = []; - for (let i = 0; i < settings.keyTypes.length; i += 1) { - const type = settings.keyTypes[i]; - - if (type === UniversalKey) publicKeyIndices.push(i); - else if (isClaim && type === ClaimsKey) publicKeyIndices.push(i); - else if (!isClaim && type === TransferKey) publicKeyIndices.push(i); - } - return publicKeyIndices; - } - - public static encodeAddress(treeRoot: Buffer): string { - return encodeHash(treeRoot, 'ar'); - } - - public static decodeAddress(address: string): Buffer { - return decodeHash(address, 'ar'); - } -} - -interface IKeyringJson { - address: string; - merkleLeaves: Buffer[]; - settings: IKeyringSettings; - loadedKeysAtIndexes: (string | null)[]; -} diff --git a/shared/crypto/lib/MerkleTree.ts b/shared/crypto/lib/MerkleTree.ts index 546f83aee..3d73392a4 100644 --- a/shared/crypto/lib/MerkleTree.ts +++ b/shared/crypto/lib/MerkleTree.ts @@ -196,7 +196,7 @@ export default class MerkleTree { } /** - * Get the index that the given proof correlates to. NOTE: only works in a balanced tree + * Get the index that the given proof correlates to. NOTE: only works in a balanced tree * @param proof {IMerkleProof[]} */ public static getLeafIndex(proof: IMerkleProof[]): number { diff --git a/shared/crypto/lib/errors.ts b/shared/crypto/lib/errors.ts index 3f104d7a0..623b32b3f 100644 --- a/shared/crypto/lib/errors.ts +++ b/shared/crypto/lib/errors.ts @@ -7,14 +7,14 @@ export class InvalidSignatureError extends UlixeeError { } } -export class UnreadableKeysError extends UlixeeError { +export class UnreadableIdentityError extends UlixeeError { constructor(message) { - super(message, 'ERR_KEY_UNREADABLE'); + super(message, 'ERR_IDENTITY_UNREADABLE'); } } -export class InvalidKeypairError extends UlixeeError { +export class InvalidIdentityError extends UlixeeError { constructor(message) { - super(message, 'ERR_KEY_INVALID'); + super(message, 'ERR_IDENTITY_INVALID'); } } diff --git a/shared/crypto/test/Address.test.ts b/shared/crypto/test/Address.test.ts new file mode 100644 index 000000000..a285f4cfb --- /dev/null +++ b/shared/crypto/test/Address.test.ts @@ -0,0 +1,53 @@ +import Identity from '@ulixee/crypto/lib/Identity'; +import Address from '../lib/Address'; +import AddressSignature from '../lib/AddressSignature'; +import { ClaimsSigner, UniversalSigner } from '../interfaces/IAddressSettings'; + +let address: Address; +let identity1: Identity; +let identity2: Identity; + +beforeAll(async () => { + [identity1, identity2] = await Promise.all([Identity.create(), Identity.create()]); + address = Address.createFromSigningIdentities([identity1, identity2], { + claimSignatureSettings: 1, + transferSignatureSettings: 1, + signerTypes: [UniversalSigner, ClaimsSigner], + }); +}); + +test('should validate the keys match the allowed keys', async () => { + expect(address.bech32).toBeTruthy(); + expect(address.transferSigners).toHaveLength(1); + expect(address.claimSigners).toHaveLength(2); + const hash = Buffer.from('hash'); + jest.spyOn(address, 'verifyKeyType').mockImplementationOnce(() => null); + const signature = address.sign(hash, [1]); + + expect(AddressSignature.verify(address.bech32, signature, hash, false)).toBe( + 'Invalid public key provided', + ); +}); + +test('should allow the proper keys if provided', async () => { + const signature = address.sign(Buffer.from('hash'), [0]); + + expect( + AddressSignature.verify(address.bech32, signature, Buffer.from('hash'), false), + ).toBeNull(); +}); + +test('should be able to save to a file and recreate', async () => { + const filePath = await address.save(); + expect(filePath.endsWith(`${address.bech32}.json`)).toBe(true); + + const wallet2 = Address.readFromFile(address.bech32); + + expect(wallet2.ownersMerkleTree).toBeTruthy(); + expect(wallet2.transferSigners.map(x => x.publicKey.toString('hex'))).toEqual( + address.transferSigners.map(x => x.publicKey.toString('hex')), + ); + const signature = wallet2.sign(Buffer.from('claim'), [0], true); + + expect(Address.verify(wallet2.bech32, Buffer.from('claim'), signature, true)).toBe(true); +}); diff --git a/shared/crypto/test/Identity.test.ts b/shared/crypto/test/Identity.test.ts new file mode 100644 index 000000000..3f62cb5fe --- /dev/null +++ b/shared/crypto/test/Identity.test.ts @@ -0,0 +1,30 @@ +import Identity from '../lib/Identity'; + +test('can create an identity', async () => { + await expect(Identity.create()).resolves.toBeTruthy(); +}); + +test('can reload an identity', async () => { + const identity = await Identity.create(); + const pem = identity.export(); + + const identity2 = Identity.loadFromPem(pem); + expect(identity2.publicKey).toEqual(identity.publicKey); + expect(identity2.bech32).toEqual(identity.bech32); + expect(identity2.publicKey).toHaveLength(32); + expect(identity2.privateKey.type).toBe(identity.privateKey.type); + expect(identity2.privateKey.asymmetricKeyType).toBe(identity.privateKey.asymmetricKeyType); + expect(identity2.privateKey.asymmetricKeySize).toBe(identity.privateKey.asymmetricKeySize); +}); + +test('can create a passphrase protected private key', async () => { + const identity = await Identity.create(); + const pem = identity.export('password1'); + + expect(() => { + Identity.loadFromPem(pem, { keyPassphrase: 'p' }); + }).toThrow(); + + const identity2 = Identity.loadFromPem(pem, { keyPassphrase: 'password1' }); + expect(identity2.bech32).toEqual(identity.bech32); +}); diff --git a/shared/crypto/test/Keypair.test.ts b/shared/crypto/test/Keypair.test.ts deleted file mode 100644 index 37b01a5bc..000000000 --- a/shared/crypto/test/Keypair.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Keypair from '../lib/Keypair'; - -test('can create a keypair', async () => { - await expect(Keypair.create()).resolves.toBeTruthy(); -}); - -test('can reload a keypair', async () => { - const keypair = await Keypair.create(); - const pem = keypair.export(); - - const keypair2 = Keypair.loadFromPem(pem); - expect(keypair2.publicKey).toEqual(keypair.publicKey); - expect(keypair2.publicKey).toHaveLength(32); - expect(keypair2.privateKey.type).toBe(keypair.privateKey.type); - expect(keypair2.privateKey.asymmetricKeyType).toBe(keypair.privateKey.asymmetricKeyType); - expect(keypair2.privateKey.asymmetricKeySize).toBe(keypair.privateKey.asymmetricKeySize); -}); - -test('can create a passphrase protected private key', async () => { - const keypair = await Keypair.create(); - const pem = keypair.export('password1'); - - expect(() => { - Keypair.loadFromPem(pem, { keyPassphrase: 'p' }); - }).toThrow(); - - const keypair2 = Keypair.loadFromPem(pem, { keyPassphrase: 'password1' }); - expect(keypair2.publicKey).toEqual(keypair.publicKey); -}); diff --git a/shared/crypto/test/Keyring.test.ts b/shared/crypto/test/Keyring.test.ts deleted file mode 100644 index d4335d0a7..000000000 --- a/shared/crypto/test/Keyring.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import Keypair from '@ulixee/crypto/lib/Keypair'; -import Keyring from '../lib/Keyring'; -import KeyringSignature from '../lib/KeyringSignature'; -import { ClaimsKey, UniversalKey } from '../interfaces/IKeyringSettings'; - -let address: Keyring; -let keypair1: Keypair; -let keypair2: Keypair; - -beforeAll(async () => { - [keypair1, keypair2] = await Promise.all([Keypair.create(), Keypair.create()]); - address = Keyring.createFromKeypairs([keypair1, keypair2], { - claimSignatureSettings: 1, - transferSignatureSettings: 1, - keyTypes: [UniversalKey, ClaimsKey], - }); -}); - -test('should validate the keys match the allowed keys', async () => { - expect(address.address).toBeTruthy(); - expect(address.transferKeys).toHaveLength(1); - expect(address.claimKeys).toHaveLength(2); - const hash = Buffer.from('hash'); - jest.spyOn(address, 'verifyKeyType').mockImplementationOnce(() => null); - const signature = address.sign(hash, [1]); - - expect(KeyringSignature.verify(address.address, signature, hash, false)).toBe( - 'Invalid public key provided', - ); -}); - -test('should allow the proper keys if provided', async () => { - const signature = address.sign(Buffer.from('hash'), [0]); - - expect( - KeyringSignature.verify(address.address, signature, Buffer.from('hash'), false), - ).toBeNull(); -}); - -test('should be able to save to a file and recreate', async () => { - const filePath = await address.save(); - expect(filePath.endsWith(`${address.address}.json`)).toBe(true); - - const wallet2 = Keyring.readFromFile(address.address); - - expect(wallet2.keyringMerkleTree).toBeTruthy(); - expect(wallet2.transferKeys.map(x => x.publicKey.toString('hex'))).toEqual( - address.transferKeys.map(x => x.publicKey.toString('hex')), - ); - const signature = wallet2.sign(Buffer.from('claim'), [0], true); - - expect(Keyring.verify(wallet2.address, Buffer.from('claim'), signature, true)).toBe(true); -}); diff --git a/shared/specification/common.ts b/shared/specification/common.ts index d9a5b5aa9..e6b5e1855 100644 --- a/shared/specification/common.ts +++ b/shared/specification/common.ts @@ -3,17 +3,25 @@ import { z } from 'zod'; export const addressValidation = z .string() .length(61) - .regex(/^ar1[ac-hj-np-z02-9]{58}/) // no 1 b i o - .refine(x => x.startsWith('ar'), { message: 'This is not an Argon address.' }); + .regex( + /^ar1[ac-hj-np-z02-9]{58}/, + 'This is not an Argon address (Bech32 encoded, starting with "ar1").', + ); + +export const identityValidation = z + .string() + .length(61) + .regex( + /^id1[ac-hj-np-z02-9]{58}/, + 'This is not a Ulixee identity (Bech32 encoded hash starting with "id1").', + ); + +export const creditIdValidation = z.string().length(32); export const hashValidation = z .instanceof(Buffer) .refine(x => x.length === 32, { message: 'Hashes must be 32 bytes' }); -export const publicKeyValidation = z - .instanceof(Buffer) - .refine(x => x.length === 32, { message: 'Public keys must be 32 bytes' }); - export const isHex = /^(0x|0h)?[0-9A-F]+$/i; export const signatureValidation = z @@ -22,14 +30,14 @@ export const signatureValidation = z export const blockHeightValidation = z.number().int().nonnegative(); -export const micronoteBatchSlugValidation = z.string().regex(isHex).length(10); - export const micronoteIdValidation = z - .instanceof(Buffer) - .refine(x => x.length === 32, { message: 'Micronote ids must be 32 bytes' }); + .string() + .length(62) + .regex( + /^mcr1[ac-hj-np-z02-9]{58}/, + 'This is not a Micronote id (Bech32 encoded, starting with "mcr").', + ); export const centagonTokenValidation = z.bigint().refine(x => x > 0n); -export const nodeIdValidation = z.string().length(32); - export const micronoteTokenValidation = z.number().int().positive(); diff --git a/shared/specification/index.ts b/shared/specification/index.ts index 71fc3397b..19a28328e 100644 --- a/shared/specification/index.ts +++ b/shared/specification/index.ts @@ -1,7 +1,7 @@ import INote from './types/INote'; import IMerkleProof from './types/IMerkleProof'; -import IWalletOwnershipProof from './types/IWalletOwnershipProof'; -import IWalletSignature from './types/IWalletSignature'; +import IAddressOwnershipProof from './types/IAddressOwnershipProof'; +import IAddressSignature from './types/IAddressSignature'; import IStakeSettings from './types/IStakeSettings'; import IStakeSignature from './types/IStakeSignature'; import ICoinage from './types/ICoinage'; @@ -36,8 +36,8 @@ export { ITransactionSourceSignatureData, TransactionType, IStakeSignature, - IWalletSignature, - IWalletOwnershipProof, + IAddressSignature, + IAddressOwnershipProof, TransactionError, IPayment, }; diff --git a/shared/specification/mainchain/BlockApis.ts b/shared/specification/mainchain/BlockApis.ts index 7bfbf5be8..fd2493a88 100644 --- a/shared/specification/mainchain/BlockApis.ts +++ b/shared/specification/mainchain/BlockApis.ts @@ -17,7 +17,7 @@ export const BlockApiSchemas = { datumSummary: DatumSummarySchema, bitSampling: z.object({ bitDatumHistories: BitDatumHistorySchema.array(), - }), // sampling of node jobs + }), // sampling of node datums created }), result: z.object({ success: z.boolean(), diff --git a/shared/specification/sidechain/WalletApis.ts b/shared/specification/sidechain/AddressApis.ts similarity index 56% rename from shared/specification/sidechain/WalletApis.ts rename to shared/specification/sidechain/AddressApis.ts index cdb182dc5..23329793c 100644 --- a/shared/specification/sidechain/WalletApis.ts +++ b/shared/specification/sidechain/AddressApis.ts @@ -1,19 +1,19 @@ import { z } from 'zod'; import { addressValidation } from '../common'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; -import { WalletSignatureSchema } from '../types/IWalletSignature'; +import { AddressSignatureSchema } from '../types/IAddressSignature'; -export const WalletApiSchemas = { - 'Wallet.register': { +export const AddressApiSchemas = { + 'Address.register': { args: z.object({ address: addressValidation, - signature: WalletSignatureSchema, + signature: AddressSignatureSchema, }), result: z.object({ success: z.boolean(), }), }, - 'Wallet.getBalance': { + 'Address.getBalance': { args: z.object({ address: addressValidation, }), @@ -23,5 +23,5 @@ export const WalletApiSchemas = { }, }; -type IWalletApis = IZodSchemaToApiTypes; -export default IWalletApis; +type IAddressApis = IZodSchemaToApiTypes; +export default IAddressApis; diff --git a/shared/specification/sidechain/CreditApis.ts b/shared/specification/sidechain/CreditApis.ts new file mode 100644 index 000000000..4dde73d22 --- /dev/null +++ b/shared/specification/sidechain/CreditApis.ts @@ -0,0 +1,42 @@ +import { z } from 'zod'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { + addressValidation, + creditIdValidation, + identityValidation, + micronoteTokenValidation, + signatureValidation, +} from '../common'; +import { AddressSignatureSchema } from '../types/IAddressSignature'; +import { MicronoteBatchSchema } from '../types/IMicronoteBatch'; + +export const CreditApiSchemas = { + 'Credit.create': { + args: z.object({ + batchSlug: MicronoteBatchSchema.shape.batchSlug, + microgons: micronoteTokenValidation, + allowedRecipientAddresses: z.array(addressValidation), + allowedRecipientSignatures: z.array(AddressSignatureSchema), + }), + result: z.object({ + creditId: creditIdValidation, + sidechainIdentity: identityValidation, + sidechainValidationSignature: signatureValidation, + }), + }, + 'Credit.claim': { + args: z.object({ + batchSlug: MicronoteBatchSchema.shape.batchSlug, + creditId: creditIdValidation, + address: addressValidation, + }), + result: z.object({ + fundsId: z.number().int().positive(), + microgons: micronoteTokenValidation, + allowedRecipientAddresses: z.array(addressValidation), + }), + }, +}; + +type ICreditApis = IZodSchemaToApiTypes; +export default ICreditApis; diff --git a/shared/specification/sidechain/MicronoteApis.ts b/shared/specification/sidechain/MicronoteApis.ts index 54e4658f5..086f80451 100644 --- a/shared/specification/sidechain/MicronoteApis.ts +++ b/shared/specification/sidechain/MicronoteApis.ts @@ -3,23 +3,23 @@ import { addressValidation, blockHeightValidation, hashValidation, - micronoteBatchSlugValidation, + identityValidation, micronoteIdValidation, micronoteTokenValidation, - publicKeyValidation, signatureValidation, } from '../common'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; -import { WalletSignatureSchema } from '../types/IWalletSignature'; +import { AddressSignatureSchema } from '../types/IAddressSignature'; +import { MicronoteBatchSchema } from '../types/IMicronoteBatch'; export const MicronoteApiSchemas = { 'Micronote.create': { args: z.object({ + batchSlug: MicronoteBatchSchema.shape.batchSlug, address: addressValidation, - microgons: micronoteTokenValidation.lt(1000e6), // $1000 max = 1000*1M microgon max + microgons: micronoteTokenValidation.lte(1000e6), // $1000 max = 1000*1M microgon max fundsId: z.number().int().positive().optional(), - batchSlug: micronoteBatchSlugValidation, - signature: WalletSignatureSchema, + signature: AddressSignatureSchema, isAuditable: z.boolean().optional(), }), result: z.object({ @@ -27,41 +27,40 @@ export const MicronoteApiSchemas = { micronoteSignature: signatureValidation, blockHeight: blockHeightValidation, fundsId: z.number().int().positive(), - guaranteeBlockHash: hashValidation, guaranteeBlockHeight: blockHeightValidation, fundMicrogonsRemaining: micronoteTokenValidation, }), }, - 'Micronote.claim': { + 'Micronote.lock': { args: z.object({ - batchSlug: micronoteBatchSlugValidation, + batchSlug: MicronoteBatchSchema.shape.batchSlug, id: micronoteIdValidation, - publicKey: publicKeyValidation, - tokenAllocation: z.record(addressValidation, micronoteTokenValidation), + identity: identityValidation, signature: signatureValidation, + addresses: addressValidation + .array() + .optional() + .describe('Optional list of addresses to ensure can be paid with this Micronote'), }), result: z.object({ - finalCost: z.number().nonnegative().int(), + accepted: z.boolean(), + currentBlockHeight: blockHeightValidation, + currentBlockHash: hashValidation, }), }, - 'Micronote.lock': { + 'Micronote.claim': { args: z.object({ + batchSlug: MicronoteBatchSchema.shape.batchSlug, id: micronoteIdValidation, - publicKey: publicKeyValidation, + identity: identityValidation, + tokenAllocation: z.record(addressValidation, micronoteTokenValidation), signature: signatureValidation, - batchSlug: micronoteBatchSlugValidation, }), result: z.object({ - accepted: z.boolean(), - currentBlockHeight: blockHeightValidation, - currentBlockHash: hashValidation, + finalCost: z.number().nonnegative().int(), }), }, }; -type ICreateMicronoteResponse = z.infer; - -export { ICreateMicronoteResponse }; - type IMicronoteApis = IZodSchemaToApiTypes; export default IMicronoteApis; diff --git a/shared/specification/sidechain/MicronoteBatchApis.ts b/shared/specification/sidechain/MicronoteBatchApis.ts index 69d1fd60e..9e0944d94 100644 --- a/shared/specification/sidechain/MicronoteBatchApis.ts +++ b/shared/specification/sidechain/MicronoteBatchApis.ts @@ -7,7 +7,13 @@ import { IZodSchemaToApiTypes } from '../utils/IZodApi'; const fundsIdValidation = z.number().int().positive(); export const MicronoteBatchApiSchemas = { - 'MicronoteBatch.get': { args: z.undefined().nullish(), result: MicronoteBatchSchema }, + 'MicronoteBatch.get': { + args: z.undefined().nullish(), + result: z.object({ + active: MicronoteBatchSchema, + credit: MicronoteBatchSchema.optional(), + }), + }, 'MicronoteBatch.fund': { args: z.object({ note: NoteSchema, @@ -17,6 +23,19 @@ export const MicronoteBatchApiSchemas = { fundsId: fundsIdValidation, }), }, + 'MicronoteBatch.activeFunds': { + args: z.object({ + batchSlug: MicronoteBatchSchema.shape.batchSlug, + address: addressValidation, + }), + result: z + .object({ + fundsId: fundsIdValidation, + microgonsRemaining: micronoteTokenValidation, + allowedRecipientAddresses: addressValidation.array(), + }) + .array(), + }, 'MicronoteBatch.findFund': { args: z.object({ batchSlug: MicronoteBatchSchema.shape.batchSlug, @@ -26,12 +45,13 @@ export const MicronoteBatchApiSchemas = { result: z.object({ fundsId: z.number().int().positive(), microgonsRemaining: micronoteTokenValidation, + allowedRecipientAddresses: addressValidation.array().optional(), }), }, 'MicronoteBatch.getFundSettlement': { args: z.object({ fundIds: fundsIdValidation.array(), - batchAddress: addressValidation, + batchSlug: MicronoteBatchSchema.shape.batchSlug, }), result: z.object({ isBatchSettled: z.boolean(), @@ -39,8 +59,8 @@ export const MicronoteBatchApiSchemas = { settlements: z .object({ fundsId: fundsIdValidation, - fundedCentagons: NoteSchema.shape.centagons, - settledCentagons: NoteSchema.shape.centagons, + fundedCentagons: z.bigint().refine(x => x >= 0), + settledCentagons: z.bigint().refine(x => x >= 0), }) .array(), }), diff --git a/shared/specification/sidechain/StakeApis.ts b/shared/specification/sidechain/StakeApis.ts index d48d0fcc2..251ea05d3 100644 --- a/shared/specification/sidechain/StakeApis.ts +++ b/shared/specification/sidechain/StakeApis.ts @@ -6,26 +6,26 @@ import { addressValidation, blockHeightValidation, hashValidation, - publicKeyValidation, + identityValidation, signatureValidation, } from '../common'; import { StakeSignatureSchema } from '../types/IStakeSignature'; -import { WalletSignatureSchema } from '../types/IWalletSignature'; +import { AddressSignatureSchema } from '../types/IAddressSignature'; export const StakeApiSchemas = { 'Stake.settings': { args: z.undefined().nullish(), result: StakeSettingsSchema }, 'Stake.create': { args: z.object({ note: NoteSchema, - stakedPublicKey: publicKeyValidation, + stakedIdentity: identityValidation, }), result: StakeSignatureSchema, }, 'Stake.refund': { args: z.object({ address: addressValidation, - stakedPublicKey: publicKeyValidation, - signature: WalletSignatureSchema, + stakedIdentity: identityValidation, + signature: AddressSignatureSchema, }), result: z.object({ blockEndHeight: blockHeightValidation, @@ -35,7 +35,7 @@ export const StakeApiSchemas = { }, 'Stake.signature': { args: z.object({ - stakedPublicKey: publicKeyValidation, + stakedIdentity: identityValidation, signature: signatureValidation, }), result: StakeSignatureSchema, diff --git a/shared/specification/sidechain/index.ts b/shared/specification/sidechain/index.ts index c193257ae..4762a507e 100644 --- a/shared/specification/sidechain/index.ts +++ b/shared/specification/sidechain/index.ts @@ -3,24 +3,27 @@ import IMicronoteBatchApis, { MicronoteBatchApiSchemas } from './MicronoteBatchA import INoteApis, { NoteApiSchemas } from './NoteApis'; import IMicronoteApis, { MicronoteApiSchemas } from './MicronoteApis'; import IFundingTransferApis, { FundingTransferApiSchemas } from './FundingTransferApis'; -import IWalletApis, { WalletApiSchemas } from './WalletApis'; +import IAddressApis, { AddressApiSchemas } from './AddressApis'; import IStakeApis, { StakeApiSchemas } from './StakeApis'; +import ICreditApis, { CreditApiSchemas } from './CreditApis'; const SidechainApiSchema = { - ...WalletApiSchemas, + ...AddressApiSchemas, ...FundingTransferApiSchemas, ...MicronoteApiSchemas, ...MicronoteBatchApiSchemas, ...NoteApiSchemas, ...StakeApiSchemas, + ...CreditApiSchemas, }; -export type ISidechainApiTypes = IWalletApis & +export type ISidechainApiTypes = IAddressApis & IFundingTransferApis & IMicronoteApis & IMicronoteBatchApis & INoteApis & - IStakeApis; + IStakeApis & + ICreditApis; export type ISidechainApis = { [Api in keyof ISidechainApiTypes]: ( diff --git a/shared/specification/types/BlockError.ts b/shared/specification/types/BlockError.ts index 0c3bf420a..7acd4dfaa 100644 --- a/shared/specification/types/BlockError.ts +++ b/shared/specification/types/BlockError.ts @@ -19,9 +19,9 @@ enum BlockError { INVALID_STAKE = 17, INVALID_BIT_SAMPLE_SIGNATURE = 18, INVALID_DATUM_AUDIT_SIGNATURE = 19, - INVALID_JOB_MICRONOTE_ID_SIGNATURE = 20, + INVALID_MICRONOTE_ID_SIGNATURE = 20, + INVALID_MICRONOTE_ID = 22, INVALID_DATUM_AUDITOR = 21, - INVALID_JOB_NOTE_ID = 22, INVALID_DATUM_XORED_CANDIDATE_SIGNATURE = 23, INSUFFICIENT_XORED_CANDIDATES_FOUND = 24, DUPLICATE_DATUM_AUDITOR = 25, @@ -29,9 +29,9 @@ enum BlockError { INSUFFICIENT_DATUM_AUDITORS = 27, INVALID_PARAM = 28, INVALID_SIDECHAIN_TRANSFER = 29, - INVALID_JOB_SIDECHAIN = 30, + INVALID_MICRONOTE_SIDECHAIN = 30, INVALID_DATUM_COORDINATOR_SIGNATURE = 31, - INVALID_SIDECHAIN_ROOT_PUBLIC_KEY = 32, + INVALID_SIDECHAIN_ROOT_IDENTITY = 32, INVALID_SIDECHAIN_SNAPSHOT_BURN = 33, SIDECHAIN_OUT_OF_BALANCE = 34, INVALID_SIDECHAIN_FEES_COLLECTED = 35, diff --git a/shared/specification/types/IAddressOwnershipProof.ts b/shared/specification/types/IAddressOwnershipProof.ts new file mode 100644 index 000000000..9f48b0fd9 --- /dev/null +++ b/shared/specification/types/IAddressOwnershipProof.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; +import { identityValidation, signatureValidation } from '../common'; +import { MerkleProofSchema } from './IMerkleProof'; + +export const AddressOwnershipProofSchema = z.object({ + signature: signatureValidation, + identity: identityValidation, + ownershipMerkleProofs: MerkleProofSchema.array(), +}); + +type IAddressOwnershipProof = z.infer; + +export default IAddressOwnershipProof; diff --git a/shared/specification/types/IAddressSignature.ts b/shared/specification/types/IAddressSignature.ts new file mode 100644 index 000000000..2e336a139 --- /dev/null +++ b/shared/specification/types/IAddressSignature.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; +import { MerkleProofSchema } from './IMerkleProof'; +import { AddressOwnershipProofSchema } from './IAddressOwnershipProof'; + +export const AddressSignatureSchema = z.object({ + signers: AddressOwnershipProofSchema.array(), + signatureSettings: z.object({ + countRequired: z.number(), + settingsMerkleProofs: MerkleProofSchema.array(), + salt: z.instanceof(Buffer).optional(), + identityIndices: z.number().array().optional(), + }), +}); + +type IAddressSignature = z.infer; +export default IAddressSignature; diff --git a/shared/specification/types/IAuthorizedSidechain.ts b/shared/specification/types/IAuthorizedSidechain.ts index 7ffa78f82..5655ee2b3 100644 --- a/shared/specification/types/IAuthorizedSidechain.ts +++ b/shared/specification/types/IAuthorizedSidechain.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { hashValidation, publicKeyValidation } from '../common'; +import { hashValidation, identityValidation } from '../common'; export const AuthorizedSidechainTransferSchema = z.object({ sidechainHash: hashValidation, @@ -8,7 +8,7 @@ export const AuthorizedSidechainTransferSchema = z.object({ export const AuthorizedSidechainSchema = z.object({ sidechainHash: hashValidation, - rootPublicKey: publicKeyValidation, + rootIdentity: identityValidation, url: z.string().url(), transfer: AuthorizedSidechainTransferSchema.array().optional(), // optional - if rotating key/address }); diff --git a/shared/specification/types/IBitDatumHistory.ts b/shared/specification/types/IBitDatumHistory.ts index fe0833bda..b938532f0 100644 --- a/shared/specification/types/IBitDatumHistory.ts +++ b/shared/specification/types/IBitDatumHistory.ts @@ -1,13 +1,13 @@ import { z } from 'zod'; -import { blockHeightValidation, publicKeyValidation, signatureValidation } from '../common'; +import { blockHeightValidation, identityValidation, signatureValidation } from '../common'; import { MicronoteBatchDatumsSchema } from './IMicronoteBatchDatums'; import { WebhitsClaimAddressSchema } from './IWebhitsClaimAddress'; export const BitDatumHistorySchema = z.object({ - publicKey: publicKeyValidation, + identity: identityValidation, blockHeight: blockHeightValidation, averageXoredCandidates: z.number().int().nonnegative(), - jobByMicronoteBatch: MicronoteBatchDatumsSchema.array(), + datumsPerMicronoteBatch: MicronoteBatchDatumsSchema.array(), webhitsClaimAddresses: WebhitsClaimAddressSchema.array(), signature: signatureValidation, // need signature from original user to make sure hash that gets put into network is truly from you (should include block height) }); diff --git a/shared/specification/types/IBlockSettings.ts b/shared/specification/types/IBlockSettings.ts index d7094de7f..c1c32346b 100644 --- a/shared/specification/types/IBlockSettings.ts +++ b/shared/specification/types/IBlockSettings.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { hashValidation, publicKeyValidation } from '../common'; +import { hashValidation, identityValidation } from '../common'; import { ArithmeticEncodingSchema } from './IArithmeticEncoding'; export const DatumSettingsSchema = z.object({ @@ -10,7 +10,7 @@ export const DatumSettingsSchema = z.object({ export const ApprovedSidechainSchema = z.object({ url: z.string(), - rootPublicKey: publicKeyValidation, + rootIdentity: identityValidation, }); export const BlockSettingsSchema = z.object({ diff --git a/shared/specification/types/ICoordinator.ts b/shared/specification/types/ICoordinator.ts index 34f8bef0d..d6b7e2c4b 100644 --- a/shared/specification/types/ICoordinator.ts +++ b/shared/specification/types/ICoordinator.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; -import { addressValidation, publicKeyValidation, signatureValidation } from '../common'; +import { addressValidation, identityValidation, signatureValidation } from '../common'; import { StakeSignatureSchema } from './IStakeSignature'; export const CoordinatorSchema = z.object({ - publicKey: publicKeyValidation, + identity: identityValidation, reputation: z.number().int().nonnegative(), proofSignature: signatureValidation, stakeSignature: StakeSignatureSchema, diff --git a/shared/specification/types/IDatum.ts b/shared/specification/types/IDatum.ts index c04a650aa..082bdbaeb 100644 --- a/shared/specification/types/IDatum.ts +++ b/shared/specification/types/IDatum.ts @@ -1,12 +1,12 @@ import { z } from 'zod'; -import { publicKeyValidation, signatureValidation } from '../common'; +import { identityValidation, signatureValidation } from '../common'; import { ProofOfKnowledgeSchema } from './IProofOfKnowedge'; export const DatumSchema = z.object({ finalResult: z.any(), proof: ProofOfKnowledgeSchema.array(), signature: signatureValidation, - publicKey: publicKeyValidation, + identity: identityValidation, lastUpdated: z.string(), isError: z.boolean(), }); diff --git a/shared/specification/types/IDatumSummary.ts b/shared/specification/types/IDatumSummary.ts index d8b02201b..2ef1c800b 100644 --- a/shared/specification/types/IDatumSummary.ts +++ b/shared/specification/types/IDatumSummary.ts @@ -1,13 +1,13 @@ import { z } from 'zod'; -import { blockHeightValidation, publicKeyValidation, signatureValidation } from '../common'; +import { blockHeightValidation, identityValidation, signatureValidation } from '../common'; import { WebhitsClaimAddressSchema } from './IWebhitsClaimAddress'; import { MicronoteBatchDatumsSchema } from './IMicronoteBatchDatums'; export const DatumSummarySchema = z.object({ - publicKey: publicKeyValidation, + identity: identityValidation, blockHeight: blockHeightValidation, averageXoredCandidates: z.number().int().nonnegative(), - jobByMicronoteBatch: MicronoteBatchDatumsSchema.array(), + datumsPerMicronoteBatch: MicronoteBatchDatumsSchema.array(), webhitsClaimAddresses: WebhitsClaimAddressSchema.array(), signature: signatureValidation, // need signature from original user to make sure hash that gets put into network is truly from you (should include block height) }); diff --git a/shared/specification/types/IGrantTransfer.ts b/shared/specification/types/IGrantTransfer.ts index 623da1ae9..c21c46a43 100644 --- a/shared/specification/types/IGrantTransfer.ts +++ b/shared/specification/types/IGrantTransfer.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; import { hashValidation } from '../common'; -import { WalletSignatureSchema } from './IWalletSignature'; +import { AddressSignatureSchema } from './IAddressSignature'; export const GrantTransferSchema = z.object({ coinageHash: hashValidation, - signature: WalletSignatureSchema, + signature: AddressSignatureSchema, }); type IGrantTransfer = z.infer; diff --git a/shared/specification/types/IMicronoteBatch.ts b/shared/specification/types/IMicronoteBatch.ts index 297aab13d..270093381 100644 --- a/shared/specification/types/IMicronoteBatch.ts +++ b/shared/specification/types/IMicronoteBatch.ts @@ -1,11 +1,12 @@ import { z } from 'zod'; -import { addressValidation, isHex, publicKeyValidation, signatureValidation } from '../common'; +import { addressValidation, identityValidation, isHex, signatureValidation } from '../common'; export const MicronoteBatchSchema = z.object({ - batchSlug: z.string().regex(isHex).length(10), - micronoteBatchPublicKey: publicKeyValidation, + batchSlug: z.string().regex(/^(?:credit_|micro_)(0x|0h)?[0-9A-F]+$/i).length(14), + isCreditBatch: z.boolean(), + micronoteBatchIdentity: identityValidation, micronoteBatchAddress: addressValidation, - sidechainPublicKey: publicKeyValidation, + sidechainIdentity: identityValidation, sidechainValidationSignature: signatureValidation, }); diff --git a/shared/specification/types/IMicronoteBatchDatums.ts b/shared/specification/types/IMicronoteBatchDatums.ts index dfda33bc9..c89310bf1 100644 --- a/shared/specification/types/IMicronoteBatchDatums.ts +++ b/shared/specification/types/IMicronoteBatchDatums.ts @@ -1,11 +1,11 @@ import { z } from 'zod'; -import { hashValidation, publicKeyValidation } from '../common'; +import { hashValidation, identityValidation } from '../common'; export const MicronoteBatchDatumsSchema = z.object({ micronoteBatchUrl: z.string().url(), - micronoteBatchPublicKey: publicKeyValidation, - jobMicronoteIdsHash: hashValidation, - jobsCount: z.number().nonnegative(), + micronoteBatchIdentity: identityValidation, + micronoteIdsHash: hashValidation, + micronotesCount: z.number().nonnegative(), }); type IMicronoteBatchDatums = z.infer; diff --git a/shared/specification/types/INote.ts b/shared/specification/types/INote.ts index be6d61bed..1e07841f2 100644 --- a/shared/specification/types/INote.ts +++ b/shared/specification/types/INote.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { WalletSignatureSchema } from './IWalletSignature'; +import { AddressSignatureSchema } from './IAddressSignature'; import { addressValidation, blockHeightValidation, hashValidation } from '../common'; import NoteType from './NoteType'; @@ -10,8 +10,9 @@ export const NoteSchema = z.object({ noteHash: hashValidation, type: z.nativeEnum(NoteType), effectiveBlockHeight: blockHeightValidation.optional(), + guaranteeBlockHeight: blockHeightValidation.optional(), timestamp: z.date(), - signature: WalletSignatureSchema, + signature: AddressSignatureSchema, }); type INote = z.infer; diff --git a/shared/specification/types/IPayment.ts b/shared/specification/types/IPayment.ts index 220f1f2b8..bd21d1f30 100644 --- a/shared/specification/types/IPayment.ts +++ b/shared/specification/types/IPayment.ts @@ -2,9 +2,9 @@ import { z } from 'zod'; import { blockHeightValidation, hashValidation, + identityValidation, micronoteIdValidation, micronoteTokenValidation, - publicKeyValidation, signatureValidation, } from '../common'; @@ -13,9 +13,9 @@ export const PaymentSchema = z.object({ micronoteId: micronoteIdValidation, blockHeight: blockHeightValidation, micronoteBatchUrl: z.string().url(), - micronoteBatchPublicKey: publicKeyValidation, + micronoteBatchIdentity: identityValidation, micronoteSignature: signatureValidation, - sidechainPublicKey: publicKeyValidation, + sidechainIdentity: identityValidation, sidechainValidationSignature: signatureValidation, guaranteeBlockHash: hashValidation, guaranteeBlockHeight: blockHeightValidation, diff --git a/shared/specification/types/IProofOfKnowedge.ts b/shared/specification/types/IProofOfKnowedge.ts index b99ae90d9..356cc857f 100644 --- a/shared/specification/types/IProofOfKnowedge.ts +++ b/shared/specification/types/IProofOfKnowedge.ts @@ -3,23 +3,23 @@ import { addressValidation, blockHeightValidation, hashValidation, + identityValidation, micronoteIdValidation, micronoteTokenValidation, - nodeIdValidation, } from '../common'; import { XoredCandidateSchema } from './IXoredCandidate'; import { CoordinatorSchema } from './ICoordinator'; export const ProofOfKnowledgeSchema = z.object({ hash: hashValidation, - jobMicronoteId: micronoteIdValidation, - jobBlockHeight: blockHeightValidation, + micronoteId: micronoteIdValidation, + micronoteBlockHeight: blockHeightValidation, blockHeight: blockHeightValidation, xoredCandidates: XoredCandidateSchema.array(), coordinator: CoordinatorSchema, decoderHash: hashValidation, decoderReputation: z.number().int().nonnegative(), - nodeIdReputationChanges: z.record(nodeIdValidation, z.number().int()), + identityReputationChanges: z.record(identityValidation, z.number().int()), isBlockEligible: z.boolean(), resultHash: hashValidation, webhitsClaimAddress: addressValidation, diff --git a/shared/specification/types/IStakeSettings.ts b/shared/specification/types/IStakeSettings.ts index e5b0ec629..1bf30c9c3 100644 --- a/shared/specification/types/IStakeSettings.ts +++ b/shared/specification/types/IStakeSettings.ts @@ -4,12 +4,12 @@ import { blockHeightValidation, centagonTokenValidation, hashValidation, - publicKeyValidation, + identityValidation, } from '../common'; export const StakeSettingsSchema = z.object({ centagons: centagonTokenValidation, - rootPublicKey: publicKeyValidation, + rootIdentity: identityValidation, stakeAddress: addressValidation, stableBlockHeight: blockHeightValidation, stableBlockHash: hashValidation, diff --git a/shared/specification/types/IStakeSignature.ts b/shared/specification/types/IStakeSignature.ts index 53645cd1a..cd9856fe5 100644 --- a/shared/specification/types/IStakeSignature.ts +++ b/shared/specification/types/IStakeSignature.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; -import { blockHeightValidation, publicKeyValidation, signatureValidation } from '../common'; +import { blockHeightValidation, identityValidation, signatureValidation } from '../common'; export const StakeSignatureSchema = z.object({ signature: signatureValidation, blockHeight: blockHeightValidation, - rootPublicKey: publicKeyValidation, + rootIdentity: identityValidation, }); type IStakeSignature = z.infer; diff --git a/shared/specification/types/ITransactionSource.ts b/shared/specification/types/ITransactionSource.ts index f256f00be..9ed12cebd 100644 --- a/shared/specification/types/ITransactionSource.ts +++ b/shared/specification/types/ITransactionSource.ts @@ -1,13 +1,13 @@ import { z } from 'zod'; import { blockHeightValidation, hashValidation } from '../common'; -import { WalletSignatureSchema } from './IWalletSignature'; +import { AddressSignatureSchema } from './IAddressSignature'; import LedgerType from './LedgerType'; export const TransactionSourceSchema = z.object({ sourceTransactionHash: hashValidation.optional(), sourceOutputIndex: z.number().int().nonnegative().optional(), - sourceWalletSignatureSettings: WalletSignatureSchema.shape.signatureSettings, - sourceWalletSigners: WalletSignatureSchema.shape.signers, + sourceAddressSignatureSettings: AddressSignatureSchema.shape.signatureSettings, + sourceAddressSigners: AddressSignatureSchema.shape.signers, sourceLedger: z.nativeEnum(LedgerType), // if coinage or bond, need to specify where we're trying to grab from blockClaimHeight: blockHeightValidation.optional(), // required if the transaction source is a coinage claim coinageHash: hashValidation.optional(), // required for coinage claims diff --git a/shared/specification/types/ITransactionSourceSignatureData.ts b/shared/specification/types/ITransactionSourceSignatureData.ts index dae4fd813..206966464 100644 --- a/shared/specification/types/ITransactionSourceSignatureData.ts +++ b/shared/specification/types/ITransactionSourceSignatureData.ts @@ -3,7 +3,7 @@ import { addressValidation, centagonTokenValidation, hashValidation } from '../c import LedgerType from './LedgerType'; import TransactionType from './TransactionType'; import { TransactionOutputSchema } from './ITransactionOutput'; -import { WalletSignatureSchema } from './IWalletSignature'; +import { AddressSignatureSchema } from './IAddressSignature'; export const TransactionSourceSignatureDataSchema = z.object({ version: z.string(), @@ -13,7 +13,7 @@ export const TransactionSourceSignatureDataSchema = z.object({ sourceTransactionOutputIndex: z.number().int().nonnegative(), sourceLedger: z.nativeEnum(LedgerType), address: addressValidation, - walletSignatureSettings: WalletSignatureSchema.shape.signatureSettings, // signatures by other multisig authors + addressSignatureSettings: AddressSignatureSchema.shape.signatureSettings, // signatures by other multisig authors centagons: centagonTokenValidation, coinageHash: hashValidation.optional(), outputs: TransactionOutputSchema.array(), diff --git a/shared/specification/types/IWalletOwnershipProof.ts b/shared/specification/types/IWalletOwnershipProof.ts deleted file mode 100644 index f664d9a24..000000000 --- a/shared/specification/types/IWalletOwnershipProof.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { z } from 'zod'; -import { publicKeyValidation, signatureValidation } from '../common'; -import { MerkleProofSchema } from './IMerkleProof'; - -export const WalletOwnershipProofSchema = z.object({ - signature: signatureValidation, - publicKey: publicKeyValidation, - ownershipMerkleProofs: MerkleProofSchema.array(), -}); - -type IWalletOwnershipProof = z.infer; - -export default IWalletOwnershipProof; diff --git a/shared/specification/types/IWalletSignature.ts b/shared/specification/types/IWalletSignature.ts deleted file mode 100644 index ad90d7825..000000000 --- a/shared/specification/types/IWalletSignature.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { z } from 'zod'; -import { MerkleProofSchema } from './IMerkleProof'; -import { WalletOwnershipProofSchema } from './IWalletOwnershipProof'; - -export const WalletSignatureSchema = z.object({ - signers: WalletOwnershipProofSchema.array(), - signatureSettings: z.object({ - countRequired: z.number(), - settingsMerkleProofs: MerkleProofSchema.array(), - salt: z.instanceof(Buffer).optional(), - publicKeyIndices: z.number().array().optional(), - }), -}); - -type IWalletSignature = z.infer; -export default IWalletSignature; diff --git a/shared/specification/types/IXoredCandidate.ts b/shared/specification/types/IXoredCandidate.ts index 7075c5baa..00dbe53fc 100644 --- a/shared/specification/types/IXoredCandidate.ts +++ b/shared/specification/types/IXoredCandidate.ts @@ -2,15 +2,15 @@ import { z } from 'zod'; import { addressValidation, hashValidation, + identityValidation, micronoteTokenValidation, - publicKeyValidation, signatureValidation, } from '../common'; import { StakeSignatureSchema } from './IStakeSignature'; export const XoredCandidateSchema = z.object({ nodeId: z.string(), - publicKey: publicKeyValidation, + identity: identityValidation, publicIp: z.string(), publicPort: z.number().int().positive(), reputation: z.number().int().nonnegative(), diff --git a/shared/specification/types/IXoredCandidateSummary.ts b/shared/specification/types/IXoredCandidateSummary.ts index d2f5b050c..21382b273 100644 --- a/shared/specification/types/IXoredCandidateSummary.ts +++ b/shared/specification/types/IXoredCandidateSummary.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; -import { addressValidation, publicKeyValidation, signatureValidation } from '../common'; +import { addressValidation, identityValidation, signatureValidation } from '../common'; import { StakeSignatureSchema } from './IStakeSignature'; export const XoredCandidateSummarySchema = z.object({ - publicKey: publicKeyValidation, + identity: identityValidation, reputation: z.number().nonnegative(), firstPingSignature: signatureValidation, secondPingSignature: signatureValidation, diff --git a/shared/specification/types/NoteType.ts b/shared/specification/types/NoteType.ts index 8ea85fb36..af09923d1 100644 --- a/shared/specification/types/NoteType.ts +++ b/shared/specification/types/NoteType.ts @@ -9,6 +9,6 @@ enum NoteType { micronoteBatchRefund = 7, burn = 8, stakeCreate = 9, - stakeRefund = 10, + stakeRefund = 10 } export default NoteType; diff --git a/shared/specification/types/TransactionType.ts b/shared/specification/types/TransactionType.ts index 35e315738..e747735ca 100644 --- a/shared/specification/types/TransactionType.ts +++ b/shared/specification/types/TransactionType.ts @@ -3,6 +3,6 @@ enum TransactionType { TRANSFER = 1, COINAGE_CLAIM = 2, BOND_PURCHASE = 3, - BOND_REDEMPTION = 4, // only allowed in stable ledger. must have corresponding transaction in bondTransactions + BOND_REDEMPTION = 4, // only allowed in stable ledger. must have corresponding transaction in bondTransactions } export default TransactionType; From 4375e3c49f8f2c6e6e6fef62107d600eb25235c7 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 3 Aug 2022 10:25:52 -0400 Subject: [PATCH 022/147] feat: api function extractor --- shared/net/interfaces/IApiHandlers.ts | 12 ++++ shared/net/lib/HttpTransportToClient.ts | 2 +- shared/specification/utils/ApiHandler.ts | 58 +++++++++++++++++++ shared/specification/utils/ApiRouter.ts | 20 +++++++ shared/specification/utils/ValidationError.ts | 19 ++++++ 5 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 shared/specification/utils/ApiHandler.ts create mode 100644 shared/specification/utils/ApiRouter.ts create mode 100644 shared/specification/utils/ValidationError.ts diff --git a/shared/net/interfaces/IApiHandlers.ts b/shared/net/interfaces/IApiHandlers.ts index d82fd8303..0eebbc2d8 100644 --- a/shared/net/interfaces/IApiHandlers.ts +++ b/shared/net/interfaces/IApiHandlers.ts @@ -1,6 +1,7 @@ type IAsyncFunc = (...args: any) => Promise | any; type IPromiseType = T extends PromiseLike ? U : T; type RestParameters any> = T extends (...args: infer P) => any ? P : []; +type ToFunction = T extends [] ? (...args: T) => Promise : (request: T) => Promise; type IApiHandlers = { [api: string]: IAsyncFunc; @@ -13,6 +14,17 @@ type IApi = { result: IPromiseType>; }; +export type IApiSchema = { + [command: string]: { + args: any; + result: any; + }; +}; + +export type ISchemaToApiHandlers = { + [T in keyof Z]: ToFunction; +}; + export type IApiSpec = { [key in keyof Handlers]: IApi; }; diff --git a/shared/net/lib/HttpTransportToClient.ts b/shared/net/lib/HttpTransportToClient.ts index 3f28226cf..55dcc41b7 100644 --- a/shared/net/lib/HttpTransportToClient.ts +++ b/shared/net/lib/HttpTransportToClient.ts @@ -18,7 +18,7 @@ export default class HttpTransportToClient { + public apiHandler: ( + args: IApiDefinition[Command]['args'], + options?: IHandlerOptions, + ) => Promise; + + protected validationSchema: IZodApiTypes | undefined; + + constructor( + public readonly command: Command, + args: { + validationSchema?: IZodApiTypes; + handler: ( + this: ApiHandler, + args: IApiDefinition[Command]['args'], + options?: IHandlerOptions, + ) => Promise; + }, + ) { + this.apiHandler = args.handler.bind(this); + this.validationSchema = args.validationSchema; + } + + public async handler( + rawArgs: unknown, + options?: IHandlerOptions, + ): Promise { + const args = this.validatePayload(rawArgs); + return await this.apiHandler(args, options); + } + + public validatePayload(data: unknown): IApiDefinition[Command]['args'] { + if (!this.validationSchema) return; + // NOTE: mutates `errors` + const result = this.validationSchema.args.safeParse(data); + if (result.success) return result.data; + + const errorList = result.error.issues.map(x => `"${x.path.join('.')}": ${x.message}`); + + throw new ValidationError(this.command, errorList); + } +} + +export type IApiDefinition = { + [command: string]: IApi; +}; + +export type IApi = { + args: ArgType; + result: ReturnType; +}; diff --git a/shared/specification/utils/ApiRouter.ts b/shared/specification/utils/ApiRouter.ts new file mode 100644 index 000000000..2692e07a7 --- /dev/null +++ b/shared/specification/utils/ApiRouter.ts @@ -0,0 +1,20 @@ +import { z } from 'zod'; +import { IZodApiSpec } from './IZodApi'; +import ApiHandler, { IApiDefinition } from './ApiHandler'; + +export default class ApiRouter { + public handlers: { + [Command in keyof ApiSpec]: (args: z.infer) => Promise>; + } = {} as any; + + constructor(readonly schema: ApiSpec) {} + + register( + command: Command, + handler: (args: IApiDefinition[Command]['args']) => Promise, + ): ApiRouter { + const apiHandler = new ApiHandler(command, { handler }); + this.handlers[command] = apiHandler.handler.bind(handler); + return this; + } +} diff --git a/shared/specification/utils/ValidationError.ts b/shared/specification/utils/ValidationError.ts new file mode 100644 index 000000000..91361f033 --- /dev/null +++ b/shared/specification/utils/ValidationError.ts @@ -0,0 +1,19 @@ +export default class ValidationError extends Error { + constructor(readonly code: string, readonly errors: string[]) { + super('Invalid request'); + this.code = 'invalid::parameters'; + // Capturing stack trace, excluding constructor call from it. + Error.captureStackTrace(this, this.constructor); + } + + public toJSON(): unknown { + return { + ...this, + }; + } + + public override toString(): string { + const extras = this.errors ? `\n${this.errors.join('\n')}` : ''; + return `${this.message} [${this.code}] ${extras}`; + } +} From 456ca9ce2cfdc9b929af409532ee6ee7b2a456d8 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 9 Aug 2022 16:05:03 -0400 Subject: [PATCH 023/147] feat(net): add remoteId to transports for logs --- shared/commons/lib/SqliteTable.ts | 8 ++ shared/commons/lib/bufferUtils.ts | 7 ++ shared/commons/lib/dirUtils.ts | 1 - shared/commons/lib/errors.ts | 33 +----- shared/net/interfaces/IApiHandlers.ts | 6 - shared/net/interfaces/ITransportToClient.ts | 1 + shared/net/lib/ConnectionToClient.ts | 11 +- shared/net/lib/EmittingTransportToClient.ts | 4 + shared/net/lib/HttpTransportToClient.ts | 3 + shared/net/lib/WsTransportToClient.ts | 5 +- shared/net/test/basic.test.ts | 4 +- shared/specification/databox/DataboxApis.ts | 110 ++++++++++++++++++ shared/specification/databox/index.ts | 8 ++ shared/specification/mainchain/index.ts | 24 ++-- shared/specification/sidechain/AddressApis.ts | 10 +- .../sidechain/SidechainSettingsApis.ts | 27 +++++ shared/specification/sidechain/index.ts | 32 ++--- .../specification/types/IDataboxManifest.ts | 41 +++++++ shared/specification/types/IMicronoteBatch.ts | 7 +- shared/specification/types/IPayment.ts | 6 +- shared/specification/utils/ApiHandler.ts | 45 +++---- shared/specification/utils/ApiRouter.ts | 42 ++++--- shared/specification/utils/IZodApi.ts | 19 ++- shared/specification/utils/ValidationError.ts | 22 +++- 24 files changed, 335 insertions(+), 141 deletions(-) create mode 100644 shared/specification/databox/DataboxApis.ts create mode 100644 shared/specification/databox/index.ts create mode 100644 shared/specification/sidechain/SidechainSettingsApis.ts create mode 100644 shared/specification/types/IDataboxManifest.ts diff --git a/shared/commons/lib/SqliteTable.ts b/shared/commons/lib/SqliteTable.ts index 5bc061822..209720c72 100644 --- a/shared/commons/lib/SqliteTable.ts +++ b/shared/commons/lib/SqliteTable.ts @@ -71,6 +71,14 @@ export default abstract class SqliteTable { this.addRecordToPublish(record); } + protected objectToInsert(object: T): IRecord { + const record: IRecord = []; + for (const [key] of this.columns) { + record.push(object[key] as any); + } + return record; + } + protected buildInsertStatement(): string { const keys = this.columns.map(x => x[0]); const params = keys.map(() => '?').join(', '); diff --git a/shared/commons/lib/bufferUtils.ts b/shared/commons/lib/bufferUtils.ts index 592b16443..84b8d8510 100644 --- a/shared/commons/lib/bufferUtils.ts +++ b/shared/commons/lib/bufferUtils.ts @@ -19,6 +19,13 @@ export function concatAsBuffer(...items: (string | number | Buffer)[]): Buffer { ); } +export function bufferReplacer(key: string, value: any): any { + if (value && Buffer.isBuffer(value)) { + return value.toString('hex'); + } + return value; +} + export function encodeBuffer(digest: Buffer, prefix: string): string { const words = bech32m.toWords(digest); return bech32m.encode(prefix, words, 256); diff --git a/shared/commons/lib/dirUtils.ts b/shared/commons/lib/dirUtils.ts index 3eac6705f..0e9ee0120 100644 --- a/shared/commons/lib/dirUtils.ts +++ b/shared/commons/lib/dirUtils.ts @@ -25,7 +25,6 @@ export function cleanHomeDir(str: string): string { return str.replace(homeDirReplace, '~'); } - export function findProjectPathSync(startingDirectory: string): string { let last: string; let path = Path.resolve(startingDirectory); diff --git a/shared/commons/lib/errors.ts b/shared/commons/lib/errors.ts index d44aed005..a80457f07 100644 --- a/shared/commons/lib/errors.ts +++ b/shared/commons/lib/errors.ts @@ -23,41 +23,10 @@ class UlixeeError extends Error { } } -class ValidationError extends UlixeeError { - constructor(errors) { - super('Invalid request', 'invalid::parameters', { errors }); - } -} - -class UnapprovedSidechainError extends UlixeeError { - constructor() { - super('Unapproved sidechain used', 'invalid::sidechain'); - } -} - class APIError extends UlixeeError { constructor(readonly status, json) { super(json.message || 'Unexpected error', json.code, json); } } -class ClientError extends UlixeeError { - constructor(code, message) { - super(message, code); - } -} - -class MalformedRequestError extends UlixeeError { - constructor(message) { - super(message, 'invalid::request'); - } -} - -export { - APIError, - UlixeeError, - ValidationError, - ClientError, - UnapprovedSidechainError, - MalformedRequestError, -}; +export { APIError, UlixeeError }; diff --git a/shared/net/interfaces/IApiHandlers.ts b/shared/net/interfaces/IApiHandlers.ts index 0eebbc2d8..065255680 100644 --- a/shared/net/interfaces/IApiHandlers.ts +++ b/shared/net/interfaces/IApiHandlers.ts @@ -1,7 +1,6 @@ type IAsyncFunc = (...args: any) => Promise | any; type IPromiseType = T extends PromiseLike ? U : T; type RestParameters any> = T extends (...args: infer P) => any ? P : []; -type ToFunction = T extends [] ? (...args: T) => Promise : (request: T) => Promise; type IApiHandlers = { [api: string]: IAsyncFunc; @@ -20,11 +19,6 @@ export type IApiSchema = { result: any; }; }; - -export type ISchemaToApiHandlers = { - [T in keyof Z]: ToFunction; -}; - export type IApiSpec = { [key in keyof Handlers]: IApi; }; diff --git a/shared/net/interfaces/ITransportToClient.ts b/shared/net/interfaces/ITransportToClient.ts index 81894f9bb..e03c1dd77 100644 --- a/shared/net/interfaces/ITransportToClient.ts +++ b/shared/net/interfaces/ITransportToClient.ts @@ -11,6 +11,7 @@ export default interface ITransportToClient< | ICoreResponsePayload | ICoreEventPayload, > extends ITypedEventEmitter> { + remoteId: string; send(message: OutMessagePayload): Promise; disconnect?(fatalError?: Error): Promise | void; } diff --git a/shared/net/lib/ConnectionToClient.ts b/shared/net/lib/ConnectionToClient.ts index c201d9dcb..8f5716e12 100644 --- a/shared/net/lib/ConnectionToClient.ts +++ b/shared/net/lib/ConnectionToClient.ts @@ -10,12 +10,16 @@ import IConnectionToClient, { IConnectionToClientEvents } from '../interfaces/IC const { log } = Log(module); -export default class ConnectionToClient +export default class ConnectionToClient< + IClientApiHandlers extends IApiHandlers, + IEventSpec, + IHandlerMetadata = any, + > extends TypedEventEmitter implements IConnectionToClient { public disconnectPromise: Promise; - public handlerMetadata?: any; + public handlerMetadata?: IHandlerMetadata; private events = new EventSubscriber(); constructor( @@ -59,7 +63,8 @@ export default class ConnectionToClient { + remoteId = String((counter += 1)); + send( message: ICoreResponsePayload | ICoreEventPayload, ): Promise { diff --git a/shared/net/lib/HttpTransportToClient.ts b/shared/net/lib/HttpTransportToClient.ts index 55dcc41b7..0ac3a474a 100644 --- a/shared/net/lib/HttpTransportToClient.ts +++ b/shared/net/lib/HttpTransportToClient.ts @@ -18,8 +18,11 @@ export default class HttpTransportToClient> implements ITransportToClient { + public remoteId: string; private events = new EventSubscriber(); - constructor(private webSocket: WebSocket) { + constructor(private webSocket: WebSocket, private request: IncomingMessage) { super(); this.onMessage = this.onMessage.bind(this); this.events.on(webSocket, 'message', this.onMessage); this.events.on(webSocket, 'close', this.onClose); this.events.on(webSocket, 'error', this.onError); + this.remoteId = `${request.socket.remoteAddress}:${request.socket.remotePort}`; } public async send(payload: any): Promise { diff --git a/shared/net/test/basic.test.ts b/shared/net/test/basic.test.ts index fc03ca5cf..ed459399a 100644 --- a/shared/net/test/basic.test.ts +++ b/shared/net/test/basic.test.ts @@ -34,8 +34,8 @@ test('it can transport over a direct connection (bridge)', async () => { test('it can transport over websockets', async () => { const server = new Server({ port: 0 }); try { - server.on('connection', (ws) => { - const transport = new WsTransportToClient(ws); + server.on('connection', (ws, req) => { + const transport = new WsTransportToClient(ws, req); new ConnectionToClient(transport, apiSpec); }); const host = (await server.address()) as AddressInfo; diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts new file mode 100644 index 000000000..a3863ec5b --- /dev/null +++ b/shared/specification/databox/DataboxApis.ts @@ -0,0 +1,110 @@ +import { z } from 'zod'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { + addressValidation, + identityValidation, + micronoteTokenValidation, + signatureValidation, +} from '../common'; +import { PaymentSchema } from '../types/IPayment'; + +export const databoxVersionHashValidation = z + .string() + .length(62) + .regex( + /^dbx1[ac-hj-np-z02-9]{58}/, + 'This is not a Databox versionHash (Bech32 encoded hash starting with "dbx1").', + ); + +const positiveInt = z.number().int().positive(); + +export const DataboxApiSchemas = { + 'Databox.upload': { + args: z.object({ + compressedDatabox: z.instanceof(Buffer).describe('Bytes of a compressed .dbx file'), + allowNewLinkedVersionHistory: z + .boolean() + .describe( + 'Allow this upload to start a new version chain (do not link to previous versions)', + ), + uploaderIdentity: identityValidation + .optional() + .describe('If this server is private, an approved uploader Identity'), + uploaderSignature: signatureValidation + .optional() + .describe('A signature from an approved uploader Identity'), + }), + result: z.object({ + success: z.boolean(), + }), + }, + 'Databox.meta': { + args: z.object({ + versionHash: databoxVersionHashValidation.describe('The hash of a unique databox version'), + }), + result: z.object({ + latestVersionHash: databoxVersionHashValidation.describe( + 'The latest version hash of this databox', + ), + averageBytesPerQuery: positiveInt.describe('Average bytes of output returned per query.'), + maxBytesPerQuery: positiveInt.describe('The largest byte count seen.'), + averageMilliseconds: positiveInt.describe('Average milliseconds spent before response.'), + maxMilliseconds: positiveInt.describe('Max milliseconds spent before response.'), + averageTotalPricePerQuery: positiveInt.describe('Average total microgons paid for a query.'), + maxPricePerQuery: positiveInt.describe('The largest total microgon price seen.'), + creditPaymentAddresses: addressValidation + .array() + .describe('The addresses this databox allows credit payments for (if any).'), + basePricePerQuery: micronoteTokenValidation.describe('The databox base price per query'), + computePricePerKb: micronoteTokenValidation.describe( + 'The current server price per kilobyte. NOTE: if a server is implementing surge pricing, this amount could vary.', + ), + schema: z.any().optional().describe('A schema describing how to interact with this databox'), + }), + }, + 'Databox.run': { + args: z.object({ + versionHash: databoxVersionHashValidation.describe('The hash of this unique databox version'), + input: z.any().optional().describe('Optional input parameters for your databox'), + payment: PaymentSchema.optional().describe( + 'Payment for this request created with an approved Ulixee Sidechain.', + ), + pricingPreferences: z + .object({ + maxComputePricePerKb: micronoteTokenValidation.describe( + 'Maximum price to pay for compute costs per kilobyte (NOTE: This only applies to Servers implementing surge pricing).', + ), + }) + .optional(), + }), + result: z.object({ + latestVersionHash: databoxVersionHashValidation, + output: z.any().optional(), + error: z.any().optional(), + metadata: z + .object({ + microgons: micronoteTokenValidation, + bytes: z.number().int().nonnegative(), + milliseconds: z.number().int().nonnegative(), + }) + .optional(), + }), + }, + 'Databox.runLocalScript': { + args: z.object({ + scriptPath: z + .string() + .describe('A path to a local script to run. NOTE: API only enabled in development.'), + input: z.any().optional().describe('Optional input parameters for your databox'), + }), + result: z.object({ + latestVersionHash: databoxVersionHashValidation, + output: z.any().optional(), + error: z.any().optional(), + }), + }, +}; + +type IDataboxApiTypes = IZodSchemaToApiTypes; + +export default IDataboxApiTypes; diff --git a/shared/specification/databox/index.ts b/shared/specification/databox/index.ts new file mode 100644 index 000000000..efa26a238 --- /dev/null +++ b/shared/specification/databox/index.ts @@ -0,0 +1,8 @@ +import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { DataboxApiSchemas } from './DataboxApis'; + +export type IDataboxApiTypes = IZodSchemaToApiTypes; + +export type IDataboxApis = IZodHandlers; + +export default DataboxApiSchemas; diff --git a/shared/specification/mainchain/index.ts b/shared/specification/mainchain/index.ts index 29207460c..faf7c7210 100644 --- a/shared/specification/mainchain/index.ts +++ b/shared/specification/mainchain/index.ts @@ -1,9 +1,9 @@ -import { z } from 'zod'; -import IBlockApis, { BlockApiSchemas } from './BlockApis'; -import IBlockHeaderApis, { BlockHeaderApiSchemas } from './BlockHeaderApis'; -import ISidechainGovernanceApis, { SidechainGovernanceSchemas } from './SidechainGovernanceApis'; -import ICoinageApis, { CoinageApiSchemas } from './CoinageApis'; -import ITransactionApis, { TransactionApiSchemas } from './TransactionApis'; +import { BlockApiSchemas } from './BlockApis'; +import { BlockHeaderApiSchemas } from './BlockHeaderApis'; +import { SidechainGovernanceSchemas } from './SidechainGovernanceApis'; +import { CoinageApiSchemas } from './CoinageApis'; +import { TransactionApiSchemas } from './TransactionApis'; +import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; const MainchainApiSchema = { ...BlockApiSchemas, @@ -13,16 +13,8 @@ const MainchainApiSchema = { ...TransactionApiSchemas, }; -export type IMainchainApiTypes = IBlockApis & - IBlockHeaderApis & - ICoinageApis & - ISidechainGovernanceApis & - ITransactionApis; +export type IMainchainApiTypes = IZodSchemaToApiTypes; -export type IMainchainApis = { - [Api in keyof IMainchainApiTypes]: ( - args: z.infer, - ) => Promise>; -}; +export type IMainchainApis = IZodHandlers; export default MainchainApiSchema; diff --git a/shared/specification/sidechain/AddressApis.ts b/shared/specification/sidechain/AddressApis.ts index 23329793c..765141da0 100644 --- a/shared/specification/sidechain/AddressApis.ts +++ b/shared/specification/sidechain/AddressApis.ts @@ -4,21 +4,21 @@ import { IZodSchemaToApiTypes } from '../utils/IZodApi'; import { AddressSignatureSchema } from '../types/IAddressSignature'; export const AddressApiSchemas = { - 'Address.register': { + 'Address.getBalance': { args: z.object({ address: addressValidation, - signature: AddressSignatureSchema, }), result: z.object({ - success: z.boolean(), + balance: z.bigint(), }), }, - 'Address.getBalance': { + 'Address.register': { args: z.object({ address: addressValidation, + signature: AddressSignatureSchema, }), result: z.object({ - balance: z.bigint(), + success: z.boolean(), }), }, }; diff --git a/shared/specification/sidechain/SidechainSettingsApis.ts b/shared/specification/sidechain/SidechainSettingsApis.ts new file mode 100644 index 000000000..0cf10ac14 --- /dev/null +++ b/shared/specification/sidechain/SidechainSettingsApis.ts @@ -0,0 +1,27 @@ +import { z } from 'zod'; +import { IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { identityValidation, micronoteTokenValidation, signatureValidation } from '../common'; +import { BlockSettingsSchema } from '../types/IBlockSettings'; + +export const SidechainSettingsApiSchemas = { + 'Sidechain.settings': { + args: z.object({ + identity: identityValidation + .nullish() + .describe( + 'Provide an identity to get proof back that the Sidechain owns the rootIdentity.', + ), + }), + result: z.object({ + version: z.string(), + rootIdentities: identityValidation.array(), + identityProofSignatures: signatureValidation.array().optional(), + latestBlockSettings: BlockSettingsSchema, + settlementFeeMicrogons: micronoteTokenValidation, + batchDurationMinutes: z.number().int(), + }), + }, +}; + +type ISidechainSettingsApis = IZodSchemaToApiTypes; +export default ISidechainSettingsApis; diff --git a/shared/specification/sidechain/index.ts b/shared/specification/sidechain/index.ts index 4762a507e..5d59621e6 100644 --- a/shared/specification/sidechain/index.ts +++ b/shared/specification/sidechain/index.ts @@ -1,13 +1,15 @@ -import { z } from 'zod'; -import IMicronoteBatchApis, { MicronoteBatchApiSchemas } from './MicronoteBatchApis'; -import INoteApis, { NoteApiSchemas } from './NoteApis'; -import IMicronoteApis, { MicronoteApiSchemas } from './MicronoteApis'; -import IFundingTransferApis, { FundingTransferApiSchemas } from './FundingTransferApis'; -import IAddressApis, { AddressApiSchemas } from './AddressApis'; -import IStakeApis, { StakeApiSchemas } from './StakeApis'; -import ICreditApis, { CreditApiSchemas } from './CreditApis'; +import { MicronoteBatchApiSchemas } from './MicronoteBatchApis'; +import { NoteApiSchemas } from './NoteApis'; +import { MicronoteApiSchemas } from './MicronoteApis'; +import { FundingTransferApiSchemas } from './FundingTransferApis'; +import { AddressApiSchemas } from './AddressApis'; +import { StakeApiSchemas } from './StakeApis'; +import { CreditApiSchemas } from './CreditApis'; +import { SidechainSettingsApiSchemas } from './SidechainSettingsApis'; +import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; const SidechainApiSchema = { + ...SidechainSettingsApiSchemas, ...AddressApiSchemas, ...FundingTransferApiSchemas, ...MicronoteApiSchemas, @@ -17,18 +19,8 @@ const SidechainApiSchema = { ...CreditApiSchemas, }; -export type ISidechainApiTypes = IAddressApis & - IFundingTransferApis & - IMicronoteApis & - IMicronoteBatchApis & - INoteApis & - IStakeApis & - ICreditApis; +export type ISidechainApiTypes = IZodSchemaToApiTypes; -export type ISidechainApis = { - [Api in keyof ISidechainApiTypes]: ( - args: z.infer, - ) => Promise>; -}; +export type ISidechainApis = IZodHandlers; export default SidechainApiSchema; diff --git a/shared/specification/types/IDataboxManifest.ts b/shared/specification/types/IDataboxManifest.ts new file mode 100644 index 000000000..dfbe644a0 --- /dev/null +++ b/shared/specification/types/IDataboxManifest.ts @@ -0,0 +1,41 @@ +import { z } from 'zod'; +import { addressValidation, micronoteTokenValidation } from '../common'; +import { databoxVersionHashValidation } from '../databox/DataboxApis'; + +const minDate = new Date('2022-01-01').getTime(); + +export const DataboxManifestSchema = z.object({ + versionHash: databoxVersionHashValidation, + versionTimestamp: z.number().int().gt(minDate), + linkedVersions: z + .object({ + versionHash: databoxVersionHashValidation, + versionTimestamp: z.number().int().gt(minDate), + }) + .array() + .describe('Older versions that should be redirected to this version'), + scriptHash: z + .string() + .length(62) + .regex( + /^scr1[ac-hj-np-z02-9]{58}/, + 'This is not a Databox scripthash (Bech32 encoded hash starting with "scr").', + ), + scriptEntrypoint: z.string().describe('A relative path from a project root'), + runtimeName: z.string(), + runtimeVersion: z.string().describe('Version of the Databox Core Runtime'), + pricePerQuery: micronoteTokenValidation + .optional() + .describe('Price per query if requiring payment'), + paymentAddress: addressValidation.optional(), + creditsAddress: addressValidation + .optional() + .describe('An address this Databox is accepting credits'), +}); + +export type IVersionHistoryEntry = z.infer< + typeof DataboxManifestSchema.shape.linkedVersions.element +>; +type IDataboxManifest = z.infer; + +export default IDataboxManifest; diff --git a/shared/specification/types/IMicronoteBatch.ts b/shared/specification/types/IMicronoteBatch.ts index 270093381..a95d2caaa 100644 --- a/shared/specification/types/IMicronoteBatch.ts +++ b/shared/specification/types/IMicronoteBatch.ts @@ -1,8 +1,11 @@ import { z } from 'zod'; -import { addressValidation, identityValidation, isHex, signatureValidation } from '../common'; +import { addressValidation, identityValidation, signatureValidation } from '../common'; export const MicronoteBatchSchema = z.object({ - batchSlug: z.string().regex(/^(?:credit_|micro_)(0x|0h)?[0-9A-F]+$/i).length(14), + batchSlug: z + .string() + .regex(/^(?:credit_|micro_)(0x|0h)?[0-9A-F]+$/i) + .length(14), isCreditBatch: z.boolean(), micronoteBatchIdentity: identityValidation, micronoteBatchAddress: addressValidation, diff --git a/shared/specification/types/IPayment.ts b/shared/specification/types/IPayment.ts index bd21d1f30..39a1e679c 100644 --- a/shared/specification/types/IPayment.ts +++ b/shared/specification/types/IPayment.ts @@ -1,23 +1,25 @@ import { z } from 'zod'; import { blockHeightValidation, - hashValidation, identityValidation, micronoteIdValidation, micronoteTokenValidation, signatureValidation, } from '../common'; +import { MicronoteBatchSchema } from './IMicronoteBatch'; export const PaymentSchema = z.object({ microgons: micronoteTokenValidation, micronoteId: micronoteIdValidation, blockHeight: blockHeightValidation, + batchSlug: MicronoteBatchSchema.shape.batchSlug, + isCreditBatch: z.boolean(), micronoteBatchUrl: z.string().url(), micronoteBatchIdentity: identityValidation, micronoteSignature: signatureValidation, sidechainIdentity: identityValidation, sidechainValidationSignature: signatureValidation, - guaranteeBlockHash: hashValidation, + // guaranteeBlockHash: hashValidation.describe('TODO: Add back in. This should tell a server what block hash they can choose to trust or not'), guaranteeBlockHeight: blockHeightValidation, }); diff --git a/shared/specification/utils/ApiHandler.ts b/shared/specification/utils/ApiHandler.ts index 0c7851553..c234a2b79 100644 --- a/shared/specification/utils/ApiHandler.ts +++ b/shared/specification/utils/ApiHandler.ts @@ -1,58 +1,49 @@ -import { IZodApiTypes } from './IZodApi'; +import { IZodApiSpec, IZodApiTypes, IZodSchemaToApiTypes } from './IZodApi'; import ValidationError from './ValidationError'; export default class ApiHandler< - APIs extends IApiDefinition, - Command extends keyof IApiDefinition & string, + APIs extends IZodApiSpec, + Command extends keyof APIs & string, + APISpec extends IZodSchemaToApiTypes, IHandlerOptions = any, > { - public apiHandler: ( - args: IApiDefinition[Command]['args'], + protected apiHandler: ( + this: ApiHandler, + args: APISpec[Command]['args'], options?: IHandlerOptions, - ) => Promise; + ) => Promise; protected validationSchema: IZodApiTypes | undefined; constructor( public readonly command: Command, + protected apiSchema: APIs, args: { - validationSchema?: IZodApiTypes; - handler: ( - this: ApiHandler, - args: IApiDefinition[Command]['args'], - options?: IHandlerOptions, - ) => Promise; + handler: ApiHandler['apiHandler']; }, ) { this.apiHandler = args.handler.bind(this); - this.validationSchema = args.validationSchema; + this.validationSchema = apiSchema[command]; } public async handler( rawArgs: unknown, options?: IHandlerOptions, - ): Promise { + ): Promise { const args = this.validatePayload(rawArgs); return await this.apiHandler(args, options); } - public validatePayload(data: unknown): IApiDefinition[Command]['args'] { - if (!this.validationSchema) return; + public validatePayload(data: unknown): APISpec[Command]['args'] { + if (!this.validationSchema) return data; // NOTE: mutates `errors` const result = this.validationSchema.args.safeParse(data); if (result.success) return result.data; - const errorList = result.error.issues.map(x => `"${x.path.join('.')}": ${x.message}`); - throw new ValidationError(this.command, errorList); + throw ValidationError.fromZodValidation( + `The parameters for this command (${this.command}) are invalid.`, + result.error, + ); } } - -export type IApiDefinition = { - [command: string]: IApi; -}; - -export type IApi = { - args: ArgType; - result: ReturnType; -}; diff --git a/shared/specification/utils/ApiRouter.ts b/shared/specification/utils/ApiRouter.ts index 2692e07a7..dcea6a782 100644 --- a/shared/specification/utils/ApiRouter.ts +++ b/shared/specification/utils/ApiRouter.ts @@ -1,20 +1,36 @@ -import { z } from 'zod'; -import { IZodApiSpec } from './IZodApi'; -import ApiHandler, { IApiDefinition } from './ApiHandler'; +import { IZodApiSpec, IZodHandlers, IZodSchemaToApiTypes } from './IZodApi'; +import ApiHandler from './ApiHandler'; -export default class ApiRouter { - public handlers: { - [Command in keyof ApiSpec]: (args: z.infer) => Promise>; - } = {} as any; +export default class ApiRouter< + ApiSpec extends IZodApiSpec, + IHandlers extends IZodHandlers, +> { + public handlers: IHandlers = {} as any; - constructor(readonly schema: ApiSpec) {} + constructor( + readonly schema: ApiSpec, + handlers: ApiHandler>[] + ) { + this.register(...handlers) + } + + register( + ...handlers: ApiHandler>[] + ): ApiRouter { + for (const apiHandler of handlers) { + this.handlers[apiHandler.command] = apiHandler.handler.bind(apiHandler) as any; + } + return this; + } - register( + registerHandler( command: Command, - handler: (args: IApiDefinition[Command]['args']) => Promise, - ): ApiRouter { - const apiHandler = new ApiHandler(command, { handler }); - this.handlers[command] = apiHandler.handler.bind(handler); + handler: IHandlers[Command], + ): ApiRouter { + const apiHandler = new ApiHandler(command as any, this.schema, { + handler, + }); + this.handlers[command] = apiHandler.handler.bind(apiHandler) as any; return this; } } diff --git a/shared/specification/utils/IZodApi.ts b/shared/specification/utils/IZodApi.ts index ade6395df..8043a5377 100644 --- a/shared/specification/utils/IZodApi.ts +++ b/shared/specification/utils/IZodApi.ts @@ -1,13 +1,22 @@ import { z } from 'zod'; export type IZodSchemaToApiTypes = { - [T in keyof Z]: { - command: T; - args: z.infer; - result: z.infer; - }; + [T in keyof Z & string]: IZodCommandSchema; +}; + +export type IZodCommandSchema = { + command: T; + args: z.infer; + result: z.infer; }; export type IZodApiTypes = { args: z.Schema; result: z.Schema }; export type IZodApiSpec = { [command: string]: IZodApiTypes }; + +export type IZodHandlers = { + [Api in keyof Spec]: ( + args: z.infer, + context?: any, + ) => Promise>; +}; diff --git a/shared/specification/utils/ValidationError.ts b/shared/specification/utils/ValidationError.ts index 91361f033..a0c3cdee9 100644 --- a/shared/specification/utils/ValidationError.ts +++ b/shared/specification/utils/ValidationError.ts @@ -1,19 +1,29 @@ +import { ZodError } from 'zod'; + export default class ValidationError extends Error { - constructor(readonly code: string, readonly errors: string[]) { - super('Invalid request'); - this.code = 'invalid::parameters'; + public readonly code = 'ERR_VALIDATION'; + constructor(message: string, readonly errors: string[]) { + super(message ?? 'Invalid request'); // Capturing stack trace, excluding constructor call from it. Error.captureStackTrace(this, this.constructor); } public toJSON(): unknown { return { - ...this, + errors: this.errors, + message: this.message, + code: this.code, + stack: this.stack, }; } public override toString(): string { - const extras = this.errors ? `\n${this.errors.join('\n')}` : ''; - return `${this.message} [${this.code}] ${extras}`; + const errors = this.errors ? `\n${this.errors.join('\n - ')}` : ''; + return `${this.message}${errors}`; + } + + static fromZodValidation(message: string, error: ZodError): ValidationError { + const errorList = error.issues.map(x => `"${x.path.join('.')}": ${x.message}`); + throw new ValidationError(message, errorList); } } From efa702fbaf8dc22ddaef55a10a31cdd26d3b78e1 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 10 Aug 2022 15:14:20 -0400 Subject: [PATCH 024/147] chore(specification): rename credits to gifts --- shared/specification/common.ts | 2 +- shared/specification/databox/DataboxApis.ts | 4 ++-- .../{CreditApis.ts => GiftCardApis.ts} | 22 +++++++++---------- .../sidechain/MicronoteBatchApis.ts | 2 +- shared/specification/sidechain/index.ts | 4 ++-- .../specification/types/IDataboxManifest.ts | 4 ++-- shared/specification/types/IMicronoteBatch.ts | 4 ++-- shared/specification/types/IPayment.ts | 2 +- 8 files changed, 22 insertions(+), 22 deletions(-) rename shared/specification/sidechain/{CreditApis.ts => GiftCardApis.ts} (64%) diff --git a/shared/specification/common.ts b/shared/specification/common.ts index e6b5e1855..8402b7fc4 100644 --- a/shared/specification/common.ts +++ b/shared/specification/common.ts @@ -16,7 +16,7 @@ export const identityValidation = z 'This is not a Ulixee identity (Bech32 encoded hash starting with "id1").', ); -export const creditIdValidation = z.string().length(32); +export const giftCardIdValidation = z.string().length(32); export const hashValidation = z .instanceof(Buffer) diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts index a3863ec5b..5dfc40f7d 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/databox/DataboxApis.ts @@ -52,9 +52,9 @@ export const DataboxApiSchemas = { maxMilliseconds: positiveInt.describe('Max milliseconds spent before response.'), averageTotalPricePerQuery: positiveInt.describe('Average total microgons paid for a query.'), maxPricePerQuery: positiveInt.describe('The largest total microgon price seen.'), - creditPaymentAddresses: addressValidation + giftCardPaymentAddresses: addressValidation .array() - .describe('The addresses this databox allows credit payments for (if any).'), + .describe('The addresses this databox allows gift card payments for (if any).'), basePricePerQuery: micronoteTokenValidation.describe('The databox base price per query'), computePricePerKb: micronoteTokenValidation.describe( 'The current server price per kilobyte. NOTE: if a server is implementing surge pricing, this amount could vary.', diff --git a/shared/specification/sidechain/CreditApis.ts b/shared/specification/sidechain/GiftCardApis.ts similarity index 64% rename from shared/specification/sidechain/CreditApis.ts rename to shared/specification/sidechain/GiftCardApis.ts index 4dde73d22..e4c2be358 100644 --- a/shared/specification/sidechain/CreditApis.ts +++ b/shared/specification/sidechain/GiftCardApis.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; import { addressValidation, - creditIdValidation, + giftCardIdValidation, identityValidation, micronoteTokenValidation, signatureValidation, @@ -10,33 +10,33 @@ import { import { AddressSignatureSchema } from '../types/IAddressSignature'; import { MicronoteBatchSchema } from '../types/IMicronoteBatch'; -export const CreditApiSchemas = { - 'Credit.create': { +export const GiftCardApiSchemas = { + 'GiftCard.create': { args: z.object({ batchSlug: MicronoteBatchSchema.shape.batchSlug, microgons: micronoteTokenValidation, - allowedRecipientAddresses: z.array(addressValidation), - allowedRecipientSignatures: z.array(AddressSignatureSchema), + redeemableWithAddresses: z.array(addressValidation), + redeemableAddressSignatures: z.array(AddressSignatureSchema), }), result: z.object({ - creditId: creditIdValidation, + giftCardId: giftCardIdValidation, sidechainIdentity: identityValidation, sidechainValidationSignature: signatureValidation, }), }, - 'Credit.claim': { + 'GiftCard.claim': { args: z.object({ batchSlug: MicronoteBatchSchema.shape.batchSlug, - creditId: creditIdValidation, + giftCardId: giftCardIdValidation, address: addressValidation, }), result: z.object({ fundsId: z.number().int().positive(), microgons: micronoteTokenValidation, - allowedRecipientAddresses: z.array(addressValidation), + redeemableWithAddresses: z.array(addressValidation), }), }, }; -type ICreditApis = IZodSchemaToApiTypes; -export default ICreditApis; +type IGiftCardApis = IZodSchemaToApiTypes; +export default IGiftCardApis; diff --git a/shared/specification/sidechain/MicronoteBatchApis.ts b/shared/specification/sidechain/MicronoteBatchApis.ts index 9e0944d94..7dc4a7730 100644 --- a/shared/specification/sidechain/MicronoteBatchApis.ts +++ b/shared/specification/sidechain/MicronoteBatchApis.ts @@ -11,7 +11,7 @@ export const MicronoteBatchApiSchemas = { args: z.undefined().nullish(), result: z.object({ active: MicronoteBatchSchema, - credit: MicronoteBatchSchema.optional(), + giftCard: MicronoteBatchSchema.optional(), }), }, 'MicronoteBatch.fund': { diff --git a/shared/specification/sidechain/index.ts b/shared/specification/sidechain/index.ts index 5d59621e6..26b70e249 100644 --- a/shared/specification/sidechain/index.ts +++ b/shared/specification/sidechain/index.ts @@ -4,7 +4,7 @@ import { MicronoteApiSchemas } from './MicronoteApis'; import { FundingTransferApiSchemas } from './FundingTransferApis'; import { AddressApiSchemas } from './AddressApis'; import { StakeApiSchemas } from './StakeApis'; -import { CreditApiSchemas } from './CreditApis'; +import { GiftCardApiSchemas } from './GiftCardApis'; import { SidechainSettingsApiSchemas } from './SidechainSettingsApis'; import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; @@ -16,7 +16,7 @@ const SidechainApiSchema = { ...MicronoteBatchApiSchemas, ...NoteApiSchemas, ...StakeApiSchemas, - ...CreditApiSchemas, + ...GiftCardApiSchemas, }; export type ISidechainApiTypes = IZodSchemaToApiTypes; diff --git a/shared/specification/types/IDataboxManifest.ts b/shared/specification/types/IDataboxManifest.ts index dfbe644a0..8df3dff88 100644 --- a/shared/specification/types/IDataboxManifest.ts +++ b/shared/specification/types/IDataboxManifest.ts @@ -28,9 +28,9 @@ export const DataboxManifestSchema = z.object({ .optional() .describe('Price per query if requiring payment'), paymentAddress: addressValidation.optional(), - creditsAddress: addressValidation + giftCardAddress: addressValidation .optional() - .describe('An address this Databox is accepting credits'), + .describe('An address this Databox is accepting gift cards'), }); export type IVersionHistoryEntry = z.infer< diff --git a/shared/specification/types/IMicronoteBatch.ts b/shared/specification/types/IMicronoteBatch.ts index a95d2caaa..bdb135b65 100644 --- a/shared/specification/types/IMicronoteBatch.ts +++ b/shared/specification/types/IMicronoteBatch.ts @@ -4,9 +4,9 @@ import { addressValidation, identityValidation, signatureValidation } from '../c export const MicronoteBatchSchema = z.object({ batchSlug: z .string() - .regex(/^(?:credit_|micro_)(0x|0h)?[0-9A-F]+$/i) + .regex(/^(?:gifts_|micro_)[0-9A-F]+$/i) .length(14), - isCreditBatch: z.boolean(), + isGiftCardBatch: z.boolean(), micronoteBatchIdentity: identityValidation, micronoteBatchAddress: addressValidation, sidechainIdentity: identityValidation, diff --git a/shared/specification/types/IPayment.ts b/shared/specification/types/IPayment.ts index 39a1e679c..7d5409bdb 100644 --- a/shared/specification/types/IPayment.ts +++ b/shared/specification/types/IPayment.ts @@ -13,7 +13,7 @@ export const PaymentSchema = z.object({ micronoteId: micronoteIdValidation, blockHeight: blockHeightValidation, batchSlug: MicronoteBatchSchema.shape.batchSlug, - isCreditBatch: z.boolean(), + isGiftCardBatch: z.boolean(), micronoteBatchUrl: z.string().url(), micronoteBatchIdentity: identityValidation, micronoteSignature: signatureValidation, From 2efa7d4a0c6b438a6d958bce414f6f7899a95672 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 10 Aug 2022 17:59:54 -0400 Subject: [PATCH 025/147] feat: add port in use fn --- shared/commons/config/servers.ts | 13 +++++++++++++ shared/commons/lib/objectUtils.ts | 24 ++++++++++++++++++++++++ shared/commons/lib/utils.ts | 22 ++++++++++++++++++++++ shared/crypto/bin/cli.ts | 2 +- shared/crypto/cli.ts | 19 +++++++++++-------- shared/crypto/lib/Identity.ts | 15 ++++++++------- 6 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 shared/commons/lib/objectUtils.ts diff --git a/shared/commons/config/servers.ts b/shared/commons/config/servers.ts index c83e4c658..e802b9e0d 100644 --- a/shared/commons/config/servers.ts +++ b/shared/commons/config/servers.ts @@ -3,6 +3,7 @@ import * as Path from 'path'; import { getCacheDirectory } from '../lib/dirUtils'; import { safeOverwriteFile } from '../lib/fileUtils'; import { isSemverSatisfied } from '../lib/VersionUtils'; +import { isPortInUse } from '../lib/utils'; export default class UlixeeServerConfig { public static global = new UlixeeServerConfig(Path.join(getCacheDirectory(), 'ulixee')); @@ -52,6 +53,18 @@ export default class UlixeeServerConfig { return null; } + public async checkLocalVersionHost(version: string, host: string): Promise { + if (!host?.startsWith('localhost')) return host; + + if (host?.startsWith('localhost')) { + if (!(await isPortInUse(host.split(':').pop()))) { + await UlixeeServerConfig.global.setVersionHost(version, null); + return null; + } + } + return host; + } + public save(): Promise { return safeOverwriteFile(this.configPath, JSON.stringify(this.getData(), null, 2)); } diff --git a/shared/commons/lib/objectUtils.ts b/shared/commons/lib/objectUtils.ts new file mode 100644 index 000000000..7601711c6 --- /dev/null +++ b/shared/commons/lib/objectUtils.ts @@ -0,0 +1,24 @@ +export function filterUndefined(object: T, omitKeys?: string[]): Partial { + if (!object) return object; + const result: Partial = {}; + for (const [key, value] of Object.entries(object)) { + if (omitKeys?.includes(key)) continue; + if (value !== undefined) result[key] = value; + } + return result; +} + +export function omit( + object: T, + keys: Keys[], +): Pick> { + object = Object(object); + const result = {} as any; + + for (const [key, value] of Object.keys(object)) { + if (!keys.includes(key as any)) { + result[key] = value; + } + } + return result; +} diff --git a/shared/commons/lib/utils.ts b/shared/commons/lib/utils.ts index 14154976b..0710525bb 100644 --- a/shared/commons/lib/utils.ts +++ b/shared/commons/lib/utils.ts @@ -1,3 +1,4 @@ +import * as net from 'net'; import IResolvablePromise from '../interfaces/IResolvablePromise'; import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; import Resolvable from './Resolvable'; @@ -12,6 +13,27 @@ export function assert(value: unknown, message?: string, reject?): void { } } +export function isPortInUse(port: number | string): Promise { + return new Promise((resolve, reject) => { + const client = new net.Socket(); + + let isInUse = true; + client.once('error', err => { + if ((err as any).code === 'ECONNREFUSED') { + isInUse = false; + resolve(isInUse); + } else { + reject(err); + } + client.removeAllListeners().end().destroy().unref(); + }); + client.connect(Number(port), () => { + resolve(isInUse); + client.removeAllListeners().end().destroy().unref(); + }); + }); +} + // @deprecated - change case... can't remove due to hero dependency export function getCallSite(priorToFilename?: string, endFilename?: string): ISourceCodeLocation[] { return getCallsite(priorToFilename, endFilename); diff --git a/shared/crypto/bin/cli.ts b/shared/crypto/bin/cli.ts index d39c39f46..501e5e29f 100644 --- a/shared/crypto/bin/cli.ts +++ b/shared/crypto/bin/cli.ts @@ -3,4 +3,4 @@ import '@ulixee/commons/lib/SourceMapSupport'; import cli from '../cli'; -cli().name('@ulixee/crypto').parse(); +cli().name('@ulixee/crypto').parseAsync().catch(console.error); diff --git a/shared/crypto/cli.ts b/shared/crypto/cli.ts index 836ffe7f5..a5a115a1f 100644 --- a/shared/crypto/cli.ts +++ b/shared/crypto/cli.ts @@ -56,10 +56,13 @@ export default function cliCommands(): Command { try { const { transferSignatures, claimSignatures, transferSalt, claimSalt } = args; const signersCount = signerPattern.length; - assert(signerPattern.length <= 6, 'A max of 6 signing Identities is allowed in an Address.'); + assert( + signerPattern.length <= 6, + 'A max of 6 signing Identities is allowed in an Address.', + ); assert(signerPattern.length > 0, 'You must specify at least one key'); assert( - signerPattern.match(/[TCU]+/i), + signerPattern.match(/^[TCU]{1,6}$/i), 'Valid signer options are T=Transfer, C=Claim, U=Universal', ); assert( @@ -117,15 +120,15 @@ export default function cliCommands(): Command { '-f, --filename ', 'Save this Identity to a filepath. If not specified, will be console logged.', ) - .action(async ({ path, passphrase, cipher }) => { + .enablePositionalOptions(true) + .action(async ({ filename, passphraseCipher, passphrase }) => { const identity = await Identity.create(); - if (path) { - await identity.save(path, { passphrase, cipher }); - const finalPath = await this.lockfile.save(path); - console.log('Saved to %s', finalPath); // eslint-disable-line no-console + if (filename) { + await identity.save(filename, { passphrase, cipher: passphraseCipher }); + console.log('Saved to %s', filename); // eslint-disable-line no-console } else { - console.log(identity.export(passphrase, cipher)); // eslint-disable-line no-console + console.log(identity.export(passphrase, passphraseCipher)); // eslint-disable-line no-console } }); diff --git a/shared/crypto/lib/Identity.ts b/shared/crypto/lib/Identity.ts index 8b5705a19..0b9cc06c2 100644 --- a/shared/crypto/lib/Identity.ts +++ b/shared/crypto/lib/Identity.ts @@ -5,6 +5,7 @@ import { createPrivateKey, generateKeyPair, generateKeyPairSync, + KeyExportOptions, KeyObject, sign, verify, @@ -65,15 +66,15 @@ export default class Identity { } public export(passphrase?: string, cipher?: string): string { - if (passphrase) { - cipher ??= Identity.defaultPkcsCipher; - } - return this.privateKey.export({ + const options: KeyExportOptions<'pem'> = { type: 'pkcs8', format: 'pem', - cipher, - passphrase, - }) as string; + }; + if (passphrase) { + options.passphrase = passphrase; + options.cipher = cipher ?? Identity.defaultPkcsCipher; + } + return this.privateKey.export(options) as string; } public toJSON(): string { From c93f1a048234ffe9260fc7043dcfc06b710183da Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 15 Aug 2022 16:50:59 -0400 Subject: [PATCH 026/147] =?UTF-8?q?feat(net):=20don=E2=80=99t=20throw=20di?= =?UTF-8?q?sconnected=20if=20launch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/commons/lib/ShutdownHandler.ts | 1 + shared/net/lib/ConnectionToCore.ts | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/shared/commons/lib/ShutdownHandler.ts b/shared/commons/lib/ShutdownHandler.ts index 6c80c918a..12cf90de3 100644 --- a/shared/commons/lib/ShutdownHandler.ts +++ b/shared/commons/lib/ShutdownHandler.ts @@ -24,6 +24,7 @@ export default class ShutdownHandler { private static registerSignals(): void { if (!this.isRegistered) { this.isRegistered = true; + process.once('beforeExit', code => ShutdownHandler.onSignal('beforeExit' as any, code)); process.once('exit' as any, code => ShutdownHandler.onSignal('exit', code)); process.once('SIGTERM', ShutdownHandler.onSignal.bind(this)); process.once('SIGINT', ShutdownHandler.onSignal.bind(this)); diff --git a/shared/net/lib/ConnectionToCore.ts b/shared/net/lib/ConnectionToCore.ts index 3f3fce058..2f43f0cea 100644 --- a/shared/net/lib/ConnectionToCore.ts +++ b/shared/net/lib/ConnectionToCore.ts @@ -72,6 +72,7 @@ export default class ConnectionToCore< const connectError = await this.transport.connect?.(); if (connectError) throw connectError; + // disconnected during connect if (this.hasActiveSessions() && this.disconnectPromise && !this.didAutoConnect) { throw new DisconnectedError(this.transport.host); } @@ -175,6 +176,9 @@ export default class ConnectionToCore< } } + /** + * Override fn to control active sessions + */ public hasActiveSessions(): boolean { return false; } @@ -201,7 +205,7 @@ export default class ConnectionToCore< (responseError as any).isDisconnecting === true; delete (responseError as any).isDisconnecting; - if (isDisconnected) { + if (isDisconnected && !isBrowserLaunchError(responseError)) { responseError = new DisconnectedError(this.transport.host); } this.pendingMessages.reject(id, responseError); @@ -237,3 +241,7 @@ export default class ConnectionToCore< this.isSendingDisconnect = false; } } + +function isBrowserLaunchError(error: Error): boolean { + return error.name === 'BrowserLaunchError' || error.name === 'DependenciesMissingError'; +} From 84d96be21cf92e655078d34ec7c7377ea1e15db4 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 15 Aug 2022 17:25:21 -0400 Subject: [PATCH 027/147] =?UTF-8?q?fix(net):=20don=E2=80=99t=20unlisten=20?= =?UTF-8?q?to=20close=20events?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/net/lib/WsTransportToCore.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/net/lib/WsTransportToCore.ts b/shared/net/lib/WsTransportToCore.ts index 40272bddc..39cc6bef5 100644 --- a/shared/net/lib/WsTransportToCore.ts +++ b/shared/net/lib/WsTransportToCore.ts @@ -67,7 +67,7 @@ export default class WsTransportToCore< this.isDisconnecting = true; this.emit('disconnected'); this.isConnected = false; - this.events.close(); + this.events.close('error'); const webSocket = this.webSocket; this.webSocket = null; if (isWsOpen(webSocket)) { @@ -98,7 +98,7 @@ export default class WsTransportToCore< this.webSocket = webSocket; this.events.once(webSocket, 'close', this.disconnect); - this.events.once(webSocket, 'error', this.disconnect); + this.events.on(webSocket, 'error', this.disconnect); this.events.on(webSocket, 'message', this.onMessage); } const connectOrError = await this.connectPromise; From a566f1b71c4c6f4af77bbec45adaa11774d92057 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 16 Aug 2022 13:47:18 -0400 Subject: [PATCH 028/147] v2.0.0-alpha.9 --- shared/CHANGELOG.md | 20 ++++++++++++++++++++ shared/commons/CHANGELOG.md | 14 ++++++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 12 ++++++++++++ shared/crypto/package.json | 10 +++++----- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 19 +++++++++++++++++++ shared/net/package.json | 4 ++-- shared/specification/CHANGELOG.md | 13 +++++++++++++ shared/specification/package.json | 2 +- 10 files changed, 88 insertions(+), 10 deletions(-) create mode 100644 shared/crypto/CHANGELOG.md create mode 100644 shared/specification/CHANGELOG.md diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index acfdc7813..d47c52ddb 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,26 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) + + +### Bug Fixes + +* **net:** don’t unlisten to close events ([bfd4dee](https://github.com/ulixee/shared/commit/bfd4deea85cdf72fec319038503744e54b1f5e69)) + + +### Features + +* add port in use fn ([b8c1a10](https://github.com/ulixee/shared/commit/b8c1a10c6da91a303d284e0e4c0723bc9f5dcf17)) +* api function extractor ([b96c7c1](https://github.com/ulixee/shared/commit/b96c7c1bf68c65cdba9278591507b4a3405c8ab9)) +* **net:** add remoteId to transports for logs ([1cbc117](https://github.com/ulixee/shared/commit/1cbc117230644fd1e8dc3ba14b7bf01cfdb3142d)) +* **net:** don’t throw disconnected if launch ([66176c7](https://github.com/ulixee/shared/commit/66176c7c4050028749d26a9aa63dd46b0d96d3f1)) +* specification, crypto projects ([fa61e3d](https://github.com/ulixee/shared/commit/fa61e3d221dacc3c1509309ebbfc7a05cf43923c)) + + + + + # [2.0.0-alpha.8](https://github.com/ulixee/commons/compare/v2.0.0-alpha.7...v2.0.0-alpha.8) (2022-07-14) **Note:** Version bump only for package @ulixee/shared-monorepo diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 78d9a0f6e..b5e6d1491 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) + + +### Features + +* add port in use fn ([b8c1a10](https://github.com/ulixee/shared/commit/b8c1a10c6da91a303d284e0e4c0723bc9f5dcf17)) +* **net:** add remoteId to transports for logs ([1cbc117](https://github.com/ulixee/shared/commit/1cbc117230644fd1e8dc3ba14b7bf01cfdb3142d)) +* **net:** don’t throw disconnected if launch ([66176c7](https://github.com/ulixee/shared/commit/66176c7c4050028749d26a9aa63dd46b0d96d3f1)) +* specification, crypto projects ([fa61e3d](https://github.com/ulixee/shared/commit/fa61e3d221dacc3c1509309ebbfc7a05cf43923c)) + + + + + # [2.0.0-alpha.8](https://github.com/ulixee/commons/compare/v2.0.0-alpha.7...v2.0.0-alpha.8) (2022-07-14) **Note:** Version bump only for package @ulixee/commons diff --git a/shared/commons/package.json b/shared/commons/package.json index fa37a52cb..551bfa705 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.8", + "version": "2.0.0-alpha.9", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md new file mode 100644 index 000000000..2e072c4c4 --- /dev/null +++ b/shared/crypto/CHANGELOG.md @@ -0,0 +1,12 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) + + +### Features + +* add port in use fn ([b8c1a10](https://github.com/ulixee/shared/commit/b8c1a10c6da91a303d284e0e4c0723bc9f5dcf17)) +* specification, crypto projects ([fa61e3d](https://github.com/ulixee/shared/commit/fa61e3d221dacc3c1509309ebbfc7a05cf43923c)) diff --git a/shared/crypto/package.json b/shared/crypto/package.json index bb2592c78..8654b0f45 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,14 +1,14 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.8", + "version": "2.0.0-alpha.9", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { + "@ulixee/commons": "2.0.0-alpha.9", + "@ulixee/crypto": "2.0.0-alpha.9", + "@ulixee/specification": "2.0.0-alpha.9", "bignumber.js": "^9.0.2", - "commander": "^9.3.0", - "@ulixee/commons": "2.0.0-alpha.8", - "@ulixee/specification": "2.0.0-alpha.8", - "@ulixee/crypto": "2.0.0-alpha.8" + "commander": "^9.3.0" } } diff --git a/shared/lerna.json b/shared/lerna.json index e2429eec3..f871aa6bb 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.8", + "version": "2.0.0-alpha.9", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index 624ee8f7d..a3666fa11 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) + + +### Bug Fixes + +* **net:** don’t unlisten to close events ([bfd4dee](https://github.com/ulixee/shared/commit/bfd4deea85cdf72fec319038503744e54b1f5e69)) + + +### Features + +* api function extractor ([b96c7c1](https://github.com/ulixee/shared/commit/b96c7c1bf68c65cdba9278591507b4a3405c8ab9)) +* **net:** add remoteId to transports for logs ([1cbc117](https://github.com/ulixee/shared/commit/1cbc117230644fd1e8dc3ba14b7bf01cfdb3142d)) +* **net:** don’t throw disconnected if launch ([66176c7](https://github.com/ulixee/shared/commit/66176c7c4050028749d26a9aa63dd46b0d96d3f1)) +* specification, crypto projects ([fa61e3d](https://github.com/ulixee/shared/commit/fa61e3d221dacc3c1509309ebbfc7a05cf43923c)) + + + + + # [2.0.0-alpha.8](https://github.com/ulixee/commons/compare/v2.0.0-alpha.7...v2.0.0-alpha.8) (2022-07-14) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index cc390618b..ae5509187 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.8", + "version": "2.0.0-alpha.9", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.8", + "@ulixee/commons": "2.0.0-alpha.9", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md new file mode 100644 index 000000000..d72061f14 --- /dev/null +++ b/shared/specification/CHANGELOG.md @@ -0,0 +1,13 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) + + +### Features + +* api function extractor ([b96c7c1](https://github.com/ulixee/shared/commit/b96c7c1bf68c65cdba9278591507b4a3405c8ab9)) +* **net:** add remoteId to transports for logs ([1cbc117](https://github.com/ulixee/shared/commit/1cbc117230644fd1e8dc3ba14b7bf01cfdb3142d)) +* specification, crypto projects ([fa61e3d](https://github.com/ulixee/shared/commit/fa61e3d221dacc3c1509309ebbfc7a05cf43923c)) diff --git a/shared/specification/package.json b/shared/specification/package.json index 58a3e3a68..a355b34ad 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.8", + "version": "2.0.0-alpha.9", "description": "", "main": "./index.js", "license": "MIT", From 85387d3b96651899643c27d7c56bad53b62ac54f Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 16 Aug 2022 18:31:28 -0400 Subject: [PATCH 029/147] fix(specification): publishing broken --- shared/specification/tsconfig.dist.json | 8 ++++++++ shared/tsconfig.dist.json | 7 ++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 shared/specification/tsconfig.dist.json diff --git a/shared/specification/tsconfig.dist.json b/shared/specification/tsconfig.dist.json new file mode 100644 index 000000000..5a3db5dcb --- /dev/null +++ b/shared/specification/tsconfig.dist.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.dist.json", + "compilerOptions": { + "strict": true + }, + "include": ["**/*.ts", "*.ts", "package.json", ".eslintrc.js"], + "exclude": ["**/tsconfig*.json", "**/node_modules", "**/build"] +} diff --git a/shared/tsconfig.dist.json b/shared/tsconfig.dist.json index 85fb7a53a..7b44bead6 100644 --- a/shared/tsconfig.dist.json +++ b/shared/tsconfig.dist.json @@ -4,5 +4,10 @@ "outDir": "./build-dist", "sourceMap": true, "inlineSourceMap": false - } + }, + "references": [ + { + "path": "specification/tsconfig.dist.json" + } + ] } From 91777bb12f2713709af43af9be5b57f9c3c299f9 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 16 Aug 2022 18:31:43 -0400 Subject: [PATCH 030/147] v2.0.0-alpha.10 --- shared/CHANGELOG.md | 11 +++++++++++ shared/commons/CHANGELOG.md | 8 ++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 8 ++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/specification/CHANGELOG.md | 11 +++++++++++ shared/specification/package.json | 2 +- 10 files changed, 55 insertions(+), 9 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index d47c52ddb..2a11ce3b5 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) + + +### Bug Fixes + +* **specification:** publishing broken ([88539ee](https://github.com/ulixee/shared/commit/88539ee5b8663d0c19b0518fb3b4ed218dd6dbbe)) + + + + + # [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index b5e6d1491..5b9e71721 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) + +**Note:** Version bump only for package @ulixee/commons + + + + + # [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) diff --git a/shared/commons/package.json b/shared/commons/package.json index 551bfa705..6893be13a 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.9", + "version": "2.0.0-alpha.10", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 2e072c4c4..926d92d69 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) + +**Note:** Version bump only for package @ulixee/crypto + + + + + # [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 8654b0f45..6584d99c1 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.9", + "version": "2.0.0-alpha.10", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.9", - "@ulixee/crypto": "2.0.0-alpha.9", - "@ulixee/specification": "2.0.0-alpha.9", + "@ulixee/commons": "2.0.0-alpha.10", + "@ulixee/crypto": "2.0.0-alpha.10", + "@ulixee/specification": "2.0.0-alpha.10", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index f871aa6bb..a2dd48348 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.9", + "version": "2.0.0-alpha.10", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index a3666fa11..c7aba35f8 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) diff --git a/shared/net/package.json b/shared/net/package.json index ae5509187..3511f6efd 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.9", + "version": "2.0.0-alpha.10", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.9", + "@ulixee/commons": "2.0.0-alpha.10", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index d72061f14..7475752ee 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) + + +### Bug Fixes + +* **specification:** publishing broken ([88539ee](https://github.com/ulixee/shared/commit/88539ee5b8663d0c19b0518fb3b4ed218dd6dbbe)) + + + + + # [2.0.0-alpha.9](https://github.com/ulixee/shared/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2022-08-16) diff --git a/shared/specification/package.json b/shared/specification/package.json index a355b34ad..ebb8a6001 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.9", + "version": "2.0.0-alpha.10", "description": "", "main": "./index.js", "license": "MIT", From ce1637592221e69b08bfcb2f0e73cfa886c32031 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 26 Aug 2022 17:28:56 -0400 Subject: [PATCH 031/147] feat(commons): env utils + timed cache feat(specifications): remove register signature feat(specifications): move api to get batches --- shared/commons/lib/TimedCache.ts | 18 +++++ shared/commons/lib/TypeSerializer.ts | 3 +- shared/commons/lib/envUtils.ts | 72 +++++++++++++++++++ shared/commons/lib/hashUtils.ts | 4 +- shared/crypto/lib/Address.ts | 2 +- shared/crypto/lib/Identity.ts | 7 +- shared/specification/sidechain/AddressApis.ts | 2 - .../sidechain/MicronoteBatchApis.ts | 7 -- ...inSettingsApis.ts => SidechainInfoApis.ts} | 15 +++- shared/specification/sidechain/index.ts | 4 +- shared/specification/types/IMicronoteBatch.ts | 3 + 11 files changed, 118 insertions(+), 19 deletions(-) create mode 100644 shared/commons/lib/TimedCache.ts create mode 100644 shared/commons/lib/envUtils.ts rename shared/specification/sidechain/{SidechainSettingsApis.ts => SidechainInfoApis.ts} (63%) diff --git a/shared/commons/lib/TimedCache.ts b/shared/commons/lib/TimedCache.ts new file mode 100644 index 000000000..bad857414 --- /dev/null +++ b/shared/commons/lib/TimedCache.ts @@ -0,0 +1,18 @@ +export default class TimedCache { + public set value(value: T) { + this.#value = value; + if (value !== null) { + this.#expireTime = Date.now() + this.cacheSeconds * 1e3; + } + } + + public get value(): T { + if (this.#expireTime && this.#expireTime < Date.now()) this.#value = null; + return this.#value; + } + + #value: T; + #expireTime: number; + + constructor(readonly cacheSeconds: number) {} +} diff --git a/shared/commons/lib/TypeSerializer.ts b/shared/commons/lib/TypeSerializer.ts index d758e0254..2c024af3a 100644 --- a/shared/commons/lib/TypeSerializer.ts +++ b/shared/commons/lib/TypeSerializer.ts @@ -71,7 +71,7 @@ export default class TypeSerializer { object: T, options?: { ignoreProperties?: (keyof T)[]; sortKeys?: boolean }, ): unknown { - if (!object) return object; + if (object === undefined || object === null) return object; const replaced = this.replacer(null, object); if (replaced !== object || (typeof replaced === 'object' && '__type' in replaced)) { @@ -84,6 +84,7 @@ export default class TypeSerializer { } const keys = Object.keys(object); + if (options?.sortKeys) keys.sort(); const response: any = {}; for (const key of keys) { diff --git a/shared/commons/lib/envUtils.ts b/shared/commons/lib/envUtils.ts new file mode 100644 index 000000000..047a8d1dc --- /dev/null +++ b/shared/commons/lib/envUtils.ts @@ -0,0 +1,72 @@ +import * as Fs from 'fs'; +import * as Path from 'path'; + +/** + * Will load env files with this precedence (.env.defaults, .env., .env) + */ +export function loadEnv(baseDir: string): void { + const envName = process.env.NODE_ENV?.toLowerCase() ?? 'development'; + const env: Record = {}; + for (const envFile of ['.env.defaults', `.env.${envName}`, '.env']) { + const path = Path.join(baseDir, envFile); + if (!Fs.existsSync(path)) continue; + applyEnvironmentVariables(path, env); + } + // don't overwrite already set variables + for (const [key, value] of Object.entries(env)) { + if (!process.env[key]) process.env[key] = value; + } +} + +// NOTE: imported from dotenv +export function applyEnvironmentVariables(path: string, env: Record): void { + let lines = Fs.readFileSync(path, 'utf8'); + + // Convert line breaks to same format + lines = lines.replace(/\r\n?/gm, '\n'); + + const LineRegex = + /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm; + + const StripSurroundingQuotesRegex = /^(['"`])([\s\S]*)\1$/gm; + + let match = LineRegex.exec(lines); + while (match) { + // eslint-disable-next-line prefer-const + let [, key, value] = match; + + value = (value ?? '').trim(); + + // Check if double quoted before stripping + const isQuoted = StripSurroundingQuotesRegex.test(value); + + value = value.replace(StripSurroundingQuotesRegex, '$2'); + + if (isQuoted) { + // Expand newlines if double quoted + value = value.replace(/\\n/g, '\n').replace(/\\r/g, '\r'); + } + + if (value === '') { + delete env[key]; + } else { + env[key] = value; + } + match = LineRegex.exec(lines); + } +} + +export function parseEnvList(envvar: string): string[] { + if (!envvar) return []; + return envvar.split(',').map(x => x.trim()); +} + +export function parseEnvInt(envvar: string): number | null { + if (!envvar) return null; + return parseInt(envvar, 10); +} + +export function parseEnvBigint(envvar: string): bigint | null { + if (!envvar) return null; + return BigInt(envvar); +} diff --git a/shared/commons/lib/hashUtils.ts b/shared/commons/lib/hashUtils.ts index 361f865cb..6be776f23 100644 --- a/shared/commons/lib/hashUtils.ts +++ b/shared/commons/lib/hashUtils.ts @@ -1,6 +1,8 @@ import { createHash } from 'crypto'; import TypeSerializer from './TypeSerializer'; +export const hashMessagePrefix = '\x18Ulixee Signed Message:\n'; + export function sha3(data: Buffer | string): Buffer { return createHash('sha3-256').update(data).digest(); } @@ -22,7 +24,7 @@ export function hashObject( // sort keys for consistent hash const json = sortedJsonStringify(obj, options?.ignoreProperties); - let buffer = Buffer.from(json); + let buffer = Buffer.from(`${hashMessagePrefix}${json.length}${json}`); if (options?.prefix) buffer = Buffer.concat([options.prefix, buffer]); return createHash('sha3-256').update(buffer).digest(); diff --git a/shared/crypto/lib/Address.ts b/shared/crypto/lib/Address.ts index 7fc0dc19d..c30453568 100644 --- a/shared/crypto/lib/Address.ts +++ b/shared/crypto/lib/Address.ts @@ -156,7 +156,7 @@ export default class Address { ); if (address.bech32 !== bech32) throw new Error( - `Failed to load Address Address. Different key calculated. (calculated: ${address.bech32}, stored: ${bech32})`, + `Failed to load Address. Different key calculated. (calculated: ${address.bech32}, stored: ${bech32})`, ); return address; } diff --git a/shared/crypto/lib/Identity.ts b/shared/crypto/lib/Identity.ts index 0b9cc06c2..db6a08caf 100644 --- a/shared/crypto/lib/Identity.ts +++ b/shared/crypto/lib/Identity.ts @@ -105,9 +105,12 @@ export default class Identity { // CLASS METHODS //////////////////////// - public static loadFromFile(filepath: string, options?: { keyPassphrase?: string }): Identity { + public static loadFromFile( + filepath: string, + options?: { relativeToPath?: string; keyPassphrase?: string }, + ): Identity { if (!path.isAbsolute(filepath)) { - filepath = path.join(process.cwd(), filepath); + filepath = path.join(options?.relativeToPath ?? process.cwd(), filepath); } const data = readFileSync(filepath, 'utf8'); return this.loadFromPem(data, options); diff --git a/shared/specification/sidechain/AddressApis.ts b/shared/specification/sidechain/AddressApis.ts index 765141da0..c0c445f6b 100644 --- a/shared/specification/sidechain/AddressApis.ts +++ b/shared/specification/sidechain/AddressApis.ts @@ -1,7 +1,6 @@ import { z } from 'zod'; import { addressValidation } from '../common'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; -import { AddressSignatureSchema } from '../types/IAddressSignature'; export const AddressApiSchemas = { 'Address.getBalance': { @@ -15,7 +14,6 @@ export const AddressApiSchemas = { 'Address.register': { args: z.object({ address: addressValidation, - signature: AddressSignatureSchema, }), result: z.object({ success: z.boolean(), diff --git a/shared/specification/sidechain/MicronoteBatchApis.ts b/shared/specification/sidechain/MicronoteBatchApis.ts index 7dc4a7730..bb1f1b8b5 100644 --- a/shared/specification/sidechain/MicronoteBatchApis.ts +++ b/shared/specification/sidechain/MicronoteBatchApis.ts @@ -7,13 +7,6 @@ import { IZodSchemaToApiTypes } from '../utils/IZodApi'; const fundsIdValidation = z.number().int().positive(); export const MicronoteBatchApiSchemas = { - 'MicronoteBatch.get': { - args: z.undefined().nullish(), - result: z.object({ - active: MicronoteBatchSchema, - giftCard: MicronoteBatchSchema.optional(), - }), - }, 'MicronoteBatch.fund': { args: z.object({ note: NoteSchema, diff --git a/shared/specification/sidechain/SidechainSettingsApis.ts b/shared/specification/sidechain/SidechainInfoApis.ts similarity index 63% rename from shared/specification/sidechain/SidechainSettingsApis.ts rename to shared/specification/sidechain/SidechainInfoApis.ts index 0cf10ac14..28c48846a 100644 --- a/shared/specification/sidechain/SidechainSettingsApis.ts +++ b/shared/specification/sidechain/SidechainInfoApis.ts @@ -2,8 +2,9 @@ import { z } from 'zod'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; import { identityValidation, micronoteTokenValidation, signatureValidation } from '../common'; import { BlockSettingsSchema } from '../types/IBlockSettings'; +import { MicronoteBatchSchema } from '../types/IMicronoteBatch'; -export const SidechainSettingsApiSchemas = { +export const SidechainInfoApiSchemas = { 'Sidechain.settings': { args: z.object({ identity: identityValidation @@ -17,11 +18,19 @@ export const SidechainSettingsApiSchemas = { rootIdentities: identityValidation.array(), identityProofSignatures: signatureValidation.array().optional(), latestBlockSettings: BlockSettingsSchema, + usdToArgonConversionRate: z.number(), settlementFeeMicrogons: micronoteTokenValidation, batchDurationMinutes: z.number().int(), }), }, + 'Sidechain.openBatches': { + args: z.undefined().nullish(), + result: z.object({ + micronote: MicronoteBatchSchema.array(), + giftCard: MicronoteBatchSchema.optional(), + }), + }, }; -type ISidechainSettingsApis = IZodSchemaToApiTypes; -export default ISidechainSettingsApis; +type ISidechainInfoApis = IZodSchemaToApiTypes; +export default ISidechainInfoApis; diff --git a/shared/specification/sidechain/index.ts b/shared/specification/sidechain/index.ts index 26b70e249..44b821c84 100644 --- a/shared/specification/sidechain/index.ts +++ b/shared/specification/sidechain/index.ts @@ -5,11 +5,11 @@ import { FundingTransferApiSchemas } from './FundingTransferApis'; import { AddressApiSchemas } from './AddressApis'; import { StakeApiSchemas } from './StakeApis'; import { GiftCardApiSchemas } from './GiftCardApis'; -import { SidechainSettingsApiSchemas } from './SidechainSettingsApis'; +import { SidechainInfoApiSchemas } from './SidechainInfoApis'; import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; const SidechainApiSchema = { - ...SidechainSettingsApiSchemas, + ...SidechainInfoApiSchemas, ...AddressApiSchemas, ...FundingTransferApiSchemas, ...MicronoteApiSchemas, diff --git a/shared/specification/types/IMicronoteBatch.ts b/shared/specification/types/IMicronoteBatch.ts index bdb135b65..1c22ffe7e 100644 --- a/shared/specification/types/IMicronoteBatch.ts +++ b/shared/specification/types/IMicronoteBatch.ts @@ -2,10 +2,13 @@ import { z } from 'zod'; import { addressValidation, identityValidation, signatureValidation } from '../common'; export const MicronoteBatchSchema = z.object({ + batchHost: z.string().url(), batchSlug: z .string() .regex(/^(?:gifts_|micro_)[0-9A-F]+$/i) .length(14), + plannedClosingTime: z.date(), + stopNewNotesTime: z.date(), isGiftCardBatch: z.boolean(), micronoteBatchIdentity: identityValidation, micronoteBatchAddress: addressValidation, From cab201ada33541051c2c954dd8d11f5e5f2676e7 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 31 Aug 2022 14:41:07 -0400 Subject: [PATCH 032/147] chore: ramp apis --- shared/commons/lib/envUtils.ts | 9 ++--- shared/specification/sidechain/RampApis.ts | 45 ++++++++++++++++++++++ shared/specification/sidechain/index.ts | 2 + 3 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 shared/specification/sidechain/RampApis.ts diff --git a/shared/commons/lib/envUtils.ts b/shared/commons/lib/envUtils.ts index 047a8d1dc..58a7ca275 100644 --- a/shared/commons/lib/envUtils.ts +++ b/shared/commons/lib/envUtils.ts @@ -28,16 +28,16 @@ export function applyEnvironmentVariables(path: string, env: Record; +export default IRampApis; diff --git a/shared/specification/sidechain/index.ts b/shared/specification/sidechain/index.ts index 44b821c84..62427ddd2 100644 --- a/shared/specification/sidechain/index.ts +++ b/shared/specification/sidechain/index.ts @@ -6,6 +6,7 @@ import { AddressApiSchemas } from './AddressApis'; import { StakeApiSchemas } from './StakeApis'; import { GiftCardApiSchemas } from './GiftCardApis'; import { SidechainInfoApiSchemas } from './SidechainInfoApis'; +import { RampApiSchemas } from './RampApis'; import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; const SidechainApiSchema = { @@ -17,6 +18,7 @@ const SidechainApiSchema = { ...NoteApiSchemas, ...StakeApiSchemas, ...GiftCardApiSchemas, + ...RampApiSchemas, }; export type ISidechainApiTypes = IZodSchemaToApiTypes; From 5f32175f5778a354f70a44539502c404f05b4500 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 31 Aug 2022 17:13:42 -0400 Subject: [PATCH 033/147] v2.0.0-alpha.11 --- shared/CHANGELOG.md | 11 +++++++++++ shared/commons/CHANGELOG.md | 11 +++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 11 +++++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/specification/CHANGELOG.md | 11 +++++++++++ shared/specification/package.json | 2 +- 10 files changed, 61 insertions(+), 9 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 2a11ce3b5..597af495c 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) + + +### Features + +* **commons:** env utils + timed cache ([8583846](https://github.com/ulixee/shared/commit/8583846f891cc1f93c079c8f6e3b1868ba7fcb5e)) + + + + + # [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 5b9e71721..10e764639 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) + + +### Features + +* **commons:** env utils + timed cache ([8583846](https://github.com/ulixee/shared/commit/8583846f891cc1f93c079c8f6e3b1868ba7fcb5e)) + + + + + # [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) **Note:** Version bump only for package @ulixee/commons diff --git a/shared/commons/package.json b/shared/commons/package.json index 6893be13a..cbe518d9d 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.10", + "version": "2.0.0-alpha.11", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 926d92d69..20fd7abb6 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) + + +### Features + +* **commons:** env utils + timed cache ([8583846](https://github.com/ulixee/shared/commit/8583846f891cc1f93c079c8f6e3b1868ba7fcb5e)) + + + + + # [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) **Note:** Version bump only for package @ulixee/crypto diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 6584d99c1..c2c1fc015 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.10", + "version": "2.0.0-alpha.11", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.10", - "@ulixee/crypto": "2.0.0-alpha.10", - "@ulixee/specification": "2.0.0-alpha.10", + "@ulixee/commons": "2.0.0-alpha.11", + "@ulixee/crypto": "2.0.0-alpha.11", + "@ulixee/specification": "2.0.0-alpha.11", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index a2dd48348..e5b8908a2 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.10", + "version": "2.0.0-alpha.11", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index c7aba35f8..339ebbf87 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index 3511f6efd..d3f67cace 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.10", + "version": "2.0.0-alpha.11", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.10", + "@ulixee/commons": "2.0.0-alpha.11", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 7475752ee..efa7de7b7 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) + + +### Features + +* **commons:** env utils + timed cache ([8583846](https://github.com/ulixee/shared/commit/8583846f891cc1f93c079c8f6e3b1868ba7fcb5e)) + + + + + # [2.0.0-alpha.10](https://github.com/ulixee/shared/compare/v2.0.0-alpha.9...v2.0.0-alpha.10) (2022-08-16) diff --git a/shared/specification/package.json b/shared/specification/package.json index ebb8a6001..d96bb31c2 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.10", + "version": "2.0.0-alpha.11", "description": "", "main": "./index.js", "license": "MIT", From 70beb1867c0d9865a1ceafc5774e0c4116c19637 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 9 Sep 2022 09:28:01 -0400 Subject: [PATCH 034/147] fix(commons): typeserializer not deep on map fix(commons): log deep node errors feat(net): api registry as feature feat(specification): sidechain.audit api --- shared/commons/interfaces/ILog.ts | 2 +- shared/commons/lib/Logger.ts | 21 ++++- shared/commons/lib/TypeSerializer.ts | 29 +++--- shared/commons/lib/envUtils.ts | 6 +- shared/net/interfaces/IApiHandler.ts | 4 + shared/net/interfaces/IApiHandlers.ts | 2 +- shared/net/lib/ApiRegistry.ts | 88 +++++++++++++++++++ .../sidechain/SidechainInfoApis.ts | 16 +++- .../types/IArithmeticEncoding.ts | 2 +- shared/specification/types/IBlock.ts | 2 +- shared/specification/types/IBlockSettings.ts | 1 + shared/specification/types/IMicronoteBatch.ts | 1 + shared/specification/utils/ApiRouter.ts | 36 -------- ...{ApiHandler.ts => ValidatingApiHandler.ts} | 6 +- 14 files changed, 158 insertions(+), 58 deletions(-) create mode 100644 shared/net/interfaces/IApiHandler.ts create mode 100644 shared/net/lib/ApiRegistry.ts delete mode 100644 shared/specification/utils/ApiRouter.ts rename shared/specification/utils/{ApiHandler.ts => ValidatingApiHandler.ts} (86%) diff --git a/shared/commons/interfaces/ILog.ts b/shared/commons/interfaces/ILog.ts index c65b2d24a..bb8b18b20 100644 --- a/shared/commons/interfaces/ILog.ts +++ b/shared/commons/interfaces/ILog.ts @@ -7,7 +7,7 @@ export interface IBoundLog { stats(action: string, data?: T): number; info(action: string, data?: T): number; warn(action: string, data?: T): number; - error(action: string, data?: T): number; + error(action: string, data?: T | { error: Error }): number; createChild(module, boundData?: any): IBoundLog; } diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index 2a3b600d3..537110629 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -39,7 +39,7 @@ class Log implements ILog { return this.log('warn', action, data); } - public error(action: string, data?: ILogData): number { + public error(action: string, data?: ILogData | { error: Error }): number { return this.log('error', action, data); } @@ -78,7 +78,7 @@ class Log implements ILog { ); } - private log(level: LogLevel, action: string, data?: ILogData): number { + private log(level: LogLevel, action: string, data?: ILogData | any): number { let logData: object; let sessionId: string = this.boundContext.sessionId; let parentId: number; @@ -165,6 +165,12 @@ export function translateToPrintable( result.error = value; continue; } + if (key === 'error') { + result.error = new Error((value as any).message); + Object.assign(result.error, value); + continue; + } + const printable = translateValueToPrintable(value); if (printable === null || printable === undefined) continue; printData[key] = printable; @@ -243,6 +249,7 @@ function extractPathFromModule(module: NodeModule): string { return fullPath .replace(/^(.*)[/\\]unblocked[/\\](.+)$/, '$2') .replace(/^(.*)[/\\]ulixee[/\\](.+)$/, '$2') + .replace(/^(.*)[/\\]payments[/\\](.+)$/, '$2') .replace(/^(.*)[/\\]@ulixee[/\\](.+)$/, '$2') .replace(/^(.*)[/\\]commons[/\\](.+)$/, '$2') .replace(/^.*[/\\]packages[/\\](.+)$/, '$1'); @@ -319,7 +326,15 @@ registerNamespaceMapping((ns, active, skip) => { registerNamespaceMapping((ns, active) => { if (ns.includes('ulx:*') || ns.includes('ulx*')) { - active.push(/^apps[/-]chromealive*/, /hero[/-].*/, /net\/.*/, /databox[/-].*/); + active.push( + /^apps[/-]chromealive*/, + /hero[/-].*/, + /net\/.*/, + /databox[/-].*/, + /mainchain[/-].*/, + /sidechain[/-].*/, + /ramps[/-].*/, + ); } else if (ns.includes('hero')) { active.push(/^hero[/-].*/, /net\/.*/); } else if (ns.includes('databox')) { diff --git a/shared/commons/lib/TypeSerializer.ts b/shared/commons/lib/TypeSerializer.ts index 2c024af3a..12eb5ac0b 100644 --- a/shared/commons/lib/TypeSerializer.ts +++ b/shared/commons/lib/TypeSerializer.ts @@ -73,14 +73,14 @@ export default class TypeSerializer { ): unknown { if (object === undefined || object === null) return object; - const replaced = this.replacer(null, object); + const replaced = this.typeReplacer(null, object, { sortKeys: options?.sortKeys }); if (replaced !== object || (typeof replaced === 'object' && '__type' in replaced)) { return replaced; } if (object && typeof object === Types.object) { if (Array.isArray(object)) { - return object.map(x => this.replace(x)); + return object.map(x => this.replace(x, options)); } const keys = Object.keys(object); @@ -91,14 +91,14 @@ export default class TypeSerializer { if (options?.ignoreProperties) { if (options.ignoreProperties.includes(key as any)) continue; } - response[key] = this.replace(object[key]); + response[key] = this.replace(object[key], options); } return response; } return object; } - private static replacer(_: string, value: any): any { + private static typeReplacer(_: string, value: any, options?: { sortKeys?: boolean }): any { if (value === null || value === undefined) return value; if (value === true || value === false) return value; @@ -130,15 +130,19 @@ export default class TypeSerializer { if (value instanceof Error) { const { name, message, stack, ...data } = value; - return { __type: Types.Error, value: { name, message, stack, ...data } }; + const extras = this.replace(data, options) as object; + return { __type: Types.Error, value: { name, message, stack, ...extras } }; } if (value instanceof Map) { - return { __type: Types.Map, value: [...value.entries()] }; + return { + __type: Types.Map, + value: [...value.entries()].map(x => this.replace(x, options)), + }; } if (value instanceof Set) { - return { __type: Types.Set, value: [...value] }; + return { __type: Types.Set, value: [...value].map(x => this.replace(x, options)) }; } if (this.isNodejs) { @@ -217,10 +221,15 @@ export default class TypeSerializer { return new globalThis[arrayType](uint8Array.buffer, byteOffset, byteLength); } if (type === Types.RegExp) return new RegExp(value[0], value[1]); - if (type === Types.Map) return new Map(value); - if (type === Types.Set) return new Set(value); + if (type === Types.Map) { + return new Map(value); + } + if (type === Types.Set) { + return new Set(value); + } if (type === Types.Error) { const { name, message, stack, ...data } = value; + const extras = this.revive(data); let Constructor = this.errorTypes && this.errorTypes.get(name); if (!Constructor) { if (this.isNodejs) { @@ -234,7 +243,7 @@ export default class TypeSerializer { const e = new Constructor(message); e.name = name; - Object.assign(e, data); + Object.assign(e, extras); if (stack) { e.stack = `${stack}\n${`------${stackMarker}`.padEnd(50, '-')}\n${startStack}`; } diff --git a/shared/commons/lib/envUtils.ts b/shared/commons/lib/envUtils.ts index 58a7ca275..f2b70300a 100644 --- a/shared/commons/lib/envUtils.ts +++ b/shared/commons/lib/envUtils.ts @@ -28,7 +28,6 @@ export function applyEnvironmentVariables(path: string, env: Record; +} diff --git a/shared/net/interfaces/IApiHandlers.ts b/shared/net/interfaces/IApiHandlers.ts index 065255680..d7ec17408 100644 --- a/shared/net/interfaces/IApiHandlers.ts +++ b/shared/net/interfaces/IApiHandlers.ts @@ -1,4 +1,4 @@ -type IAsyncFunc = (...args: any) => Promise | any; +export type IAsyncFunc = (...args: any) => Promise | any; type IPromiseType = T extends PromiseLike ? U : T; type RestParameters any> = T extends (...args: infer P) => any ? P : []; diff --git a/shared/net/lib/ApiRegistry.ts b/shared/net/lib/ApiRegistry.ts new file mode 100644 index 000000000..741613286 --- /dev/null +++ b/shared/net/lib/ApiRegistry.ts @@ -0,0 +1,88 @@ +import Logger from '@ulixee/commons/lib/Logger'; +import { IncomingMessage, ServerResponse } from 'http'; +import { IBoundLog } from '@ulixee/commons/interfaces/ILog'; +import HttpTransportToClient from './HttpTransportToClient'; +import ITransportToClient from '../interfaces/ITransportToClient'; +import ConnectionToClient from './ConnectionToClient'; +import { IAsyncFunc } from '../interfaces/IApiHandlers'; +import IApiHandler from '../interfaces/IApiHandler'; +import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; + +const { log } = Logger(module); + +export default class ApiRegistry { + public apiHandlerMetadataFn: ( + apiRequest: ICoreRequestPayload, + logger: IBoundLog, + ) => IHandlerMetadata; + + private handlersByCommand: { [command: string]: IAsyncFunc } = {}; + + constructor(endpoints: IApiHandler[] = []) { + this.register(...endpoints); + } + + public hasHandlerForPath(path: string): boolean { + return !!this.handlersByCommand[path.substring(1)]; + } + + public register(...endpoints: IApiHandler[]): void { + for (const endpoint of endpoints) { + this.handlersByCommand[endpoint.command] = endpoint.handler.bind(endpoint) as any; + } + } + + public createConnection( + transport: ITransportToClient, + handlerMetadata?: IHandlerMetadata, + ): ConnectionToClient { + const connection = new ConnectionToClient(transport, this.handlersByCommand); + connection.handlerMetadata = handlerMetadata; + return connection; + } + + public async handleHttpRoute(req: IncomingMessage, res: ServerResponse): Promise { + const startTime = Date.now(); + + const transport = new HttpTransportToClient(req, res); + const apiRequest = await transport.readRequest(); + const { command, messageId } = apiRequest; + const handler = this.handlersByCommand[command]; + if (!handler) return false; + + const logger = log.createChild(module, { + remote: transport.remoteId, + messageId, + command, + }); + + let data: any; + try { + logger.info(`api/${apiRequest.command}`, { + path: req.url, + apiRequest, + }); + + let args = apiRequest.args; + if (!Array.isArray(args)) args = [apiRequest.args]; + + const handlerMetadata = this.apiHandlerMetadataFn + ? this.apiHandlerMetadataFn(apiRequest, logger) + : { logger }; + data = await handler(...args, handlerMetadata); + } catch (error) { + logger.error(`api/${apiRequest.command}:ERROR`, { + error, + }); + data = error; + } + + await transport.send({ + responseId: messageId, + data, + }); + + logger.stats(`api/${apiRequest.command}:END`, { data, millis: Date.now() - startTime }); + return true; + } +} diff --git a/shared/specification/sidechain/SidechainInfoApis.ts b/shared/specification/sidechain/SidechainInfoApis.ts index 28c48846a..2449de26a 100644 --- a/shared/specification/sidechain/SidechainInfoApis.ts +++ b/shared/specification/sidechain/SidechainInfoApis.ts @@ -18,11 +18,25 @@ export const SidechainInfoApiSchemas = { rootIdentities: identityValidation.array(), identityProofSignatures: signatureValidation.array().optional(), latestBlockSettings: BlockSettingsSchema, - usdToArgonConversionRate: z.number(), settlementFeeMicrogons: micronoteTokenValidation, batchDurationMinutes: z.number().int(), }), }, + 'Sidechain.audit': { + args: z.undefined().nullish(), + result: z.object({ + auditDate: z.date(), + argonsInCirculation_e2: z + .bigint() + .describe('Argons with centagon precision as a whole number (e-2).'), + argonsBurnedYesterday_e2: z + .bigint() + .describe('Argons burned in the previous day (starting UTC 0:00 to UTC 23:59).'), + argonsBurnedRolling30DayAverage_e2: z + .bigint() + .describe('Average daily Argons burned over the previous 30 days.'), + }), + }, 'Sidechain.openBatches': { args: z.undefined().nullish(), result: z.object({ diff --git a/shared/specification/types/IArithmeticEncoding.ts b/shared/specification/types/IArithmeticEncoding.ts index d31d9e67d..95afd0352 100644 --- a/shared/specification/types/IArithmeticEncoding.ts +++ b/shared/specification/types/IArithmeticEncoding.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; export const ArithmeticEncodingSchema = z.object({ powerOf2: z.number().nonnegative(), - multiplierInThousandths: z.number().nonnegative().optional(), + multiplierE6: z.number().nonnegative().optional(), }); type IArithmeticEncoding = z.infer; diff --git a/shared/specification/types/IBlock.ts b/shared/specification/types/IBlock.ts index 9ee106ec8..988bd8016 100644 --- a/shared/specification/types/IBlock.ts +++ b/shared/specification/types/IBlock.ts @@ -12,7 +12,7 @@ export const BlockSchema = z.object({ sharesLedger: TransactionSchema.array(), // all share trades must happen in the sharesLedger // these fields can be rolled off coinages: CoinageSchema.array(), - datumSummary: DatumSummarySchema.array(), + datumSummary: DatumSummarySchema, bitSampling: z.object({ bitDatumHistories: BitDatumHistorySchema.array(), }), diff --git a/shared/specification/types/IBlockSettings.ts b/shared/specification/types/IBlockSettings.ts index c1c32346b..fb1f592b1 100644 --- a/shared/specification/types/IBlockSettings.ts +++ b/shared/specification/types/IBlockSettings.ts @@ -23,6 +23,7 @@ export const BlockSettingsSchema = z.object({ nextLinkTarget: ArithmeticEncodingSchema, height: z.number().int().nonnegative(), sidechains: ApprovedSidechainSchema.array(), + minimumMicronoteBurnPercent: z.number().int().nonnegative(), }); type IBlockSettings = z.infer; diff --git a/shared/specification/types/IMicronoteBatch.ts b/shared/specification/types/IMicronoteBatch.ts index 1c22ffe7e..bb8fc3668 100644 --- a/shared/specification/types/IMicronoteBatch.ts +++ b/shared/specification/types/IMicronoteBatch.ts @@ -10,6 +10,7 @@ export const MicronoteBatchSchema = z.object({ plannedClosingTime: z.date(), stopNewNotesTime: z.date(), isGiftCardBatch: z.boolean(), + minimumFundingCentagons: z.bigint().refine(x => x >= 1n), micronoteBatchIdentity: identityValidation, micronoteBatchAddress: addressValidation, sidechainIdentity: identityValidation, diff --git a/shared/specification/utils/ApiRouter.ts b/shared/specification/utils/ApiRouter.ts deleted file mode 100644 index dcea6a782..000000000 --- a/shared/specification/utils/ApiRouter.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { IZodApiSpec, IZodHandlers, IZodSchemaToApiTypes } from './IZodApi'; -import ApiHandler from './ApiHandler'; - -export default class ApiRouter< - ApiSpec extends IZodApiSpec, - IHandlers extends IZodHandlers, -> { - public handlers: IHandlers = {} as any; - - constructor( - readonly schema: ApiSpec, - handlers: ApiHandler>[] - ) { - this.register(...handlers) - } - - register( - ...handlers: ApiHandler>[] - ): ApiRouter { - for (const apiHandler of handlers) { - this.handlers[apiHandler.command] = apiHandler.handler.bind(apiHandler) as any; - } - return this; - } - - registerHandler( - command: Command, - handler: IHandlers[Command], - ): ApiRouter { - const apiHandler = new ApiHandler(command as any, this.schema, { - handler, - }); - this.handlers[command] = apiHandler.handler.bind(apiHandler) as any; - return this; - } -} diff --git a/shared/specification/utils/ApiHandler.ts b/shared/specification/utils/ValidatingApiHandler.ts similarity index 86% rename from shared/specification/utils/ApiHandler.ts rename to shared/specification/utils/ValidatingApiHandler.ts index c234a2b79..550dfaddb 100644 --- a/shared/specification/utils/ApiHandler.ts +++ b/shared/specification/utils/ValidatingApiHandler.ts @@ -1,14 +1,14 @@ import { IZodApiSpec, IZodApiTypes, IZodSchemaToApiTypes } from './IZodApi'; import ValidationError from './ValidationError'; -export default class ApiHandler< +export default class ValidatingApiHandler< APIs extends IZodApiSpec, Command extends keyof APIs & string, APISpec extends IZodSchemaToApiTypes, IHandlerOptions = any, > { protected apiHandler: ( - this: ApiHandler, + this: ValidatingApiHandler, args: APISpec[Command]['args'], options?: IHandlerOptions, ) => Promise; @@ -19,7 +19,7 @@ export default class ApiHandler< public readonly command: Command, protected apiSchema: APIs, args: { - handler: ApiHandler['apiHandler']; + handler: ValidatingApiHandler['apiHandler']; }, ) { this.apiHandler = args.handler.bind(this); From 9422fcd2bc24ee81dbbcb1af28318b7bd88fc712 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 16 Sep 2022 17:06:11 -0400 Subject: [PATCH 035/147] fix(commons): add env bool fix(commons): source map support ts-node --- shared/commons/lib/SourceMapSupport.ts | 6 ++++-- shared/commons/lib/envUtils.ts | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/shared/commons/lib/SourceMapSupport.ts b/shared/commons/lib/SourceMapSupport.ts index 8338ae5de..ec27d9cf3 100644 --- a/shared/commons/lib/SourceMapSupport.ts +++ b/shared/commons/lib/SourceMapSupport.ts @@ -24,6 +24,9 @@ export class SourceMapSupport { } static install(): void { + // ts-node does it's own translations + if (process.execArgv?.includes('ts-node')) return; + if (!Error[Symbol.for('source-map-support')]) { Error[Symbol.for('source-map-support')] = true; Error.prepareStackTrace = this.prepareStackTrace.bind(this); @@ -125,7 +128,6 @@ export class SourceMapSupport { const name = error.name ?? error[Symbol.toStringTag] ?? error.constructor?.name ?? 'Error'; const message = error.message ?? ''; const errorString = `${name}: ${message}`; - // track fn name as we go backwards through stack const processedStack = []; let containingFnName: string = null; @@ -135,7 +137,7 @@ export class SourceMapSupport { containingFnName = null; } else { const filename = frame.getFileName() || (frame as any).getScriptNameOrSourceURL(); - if (filename) { + if (filename && !filename.endsWith('.ts')) { const position = this.getOriginalSourcePosition({ filename, line: frame.getLineNumber(), diff --git a/shared/commons/lib/envUtils.ts b/shared/commons/lib/envUtils.ts index f2b70300a..e0afc1873 100644 --- a/shared/commons/lib/envUtils.ts +++ b/shared/commons/lib/envUtils.ts @@ -64,6 +64,18 @@ export function parseEnvInt(envvar: string): number | null { return parseInt(envvar, 10); } +export function parseEnvPath(envvar: string, relativeTo?: string): string { + if (!envvar) return null; + if (Path.isAbsolute(envvar)) return envvar; + return Path.resolve(relativeTo ?? process.cwd(), envvar); +} + +export function parseEnvBool(envvar: string): boolean { + if (envvar === '1' || envvar?.toLowerCase() === 'true' || envvar?.toLowerCase() === 'yes') + return true; + return false; +} + export function parseEnvBigint(envvar: string): bigint | null { if (!envvar) return null; if (envvar.includes('e')) { From 9ea23605079c35f2b2dd3c585972e1abc09cb936 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Sun, 2 Oct 2022 17:56:29 -0400 Subject: [PATCH 036/147] fix: only log errors with values; parse env paths --- shared/commons/lib/Logger.ts | 2 +- shared/commons/lib/envUtils.ts | 8 +++++--- shared/net/lib/HttpTransportToClient.ts | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index 537110629..c9e3f20a2 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -165,7 +165,7 @@ export function translateToPrintable( result.error = value; continue; } - if (key === 'error') { + if (key === 'error' && value) { result.error = new Error((value as any).message); Object.assign(result.error, value); continue; diff --git a/shared/commons/lib/envUtils.ts b/shared/commons/lib/envUtils.ts index e0afc1873..5db0c6f4b 100644 --- a/shared/commons/lib/envUtils.ts +++ b/shared/commons/lib/envUtils.ts @@ -1,10 +1,11 @@ import * as Fs from 'fs'; import * as Path from 'path'; +import * as Os from 'os'; /** * Will load env files with this precedence (.env.defaults, .env., .env) */ -export function loadEnv(baseDir: string): void { +export function loadEnv(baseDir: string, overwriteSetValues = false): void { const envName = process.env.NODE_ENV?.toLowerCase() ?? 'development'; const env: Record = {}; for (const envFile of ['.env.defaults', `.env.${envName}`, '.env']) { @@ -14,14 +15,14 @@ export function loadEnv(baseDir: string): void { } // don't overwrite already set variables for (const [key, value] of Object.entries(env)) { - if (!process.env[key]) process.env[key] = value; + if (process.env[key] && !overwriteSetValues) continue; + process.env[key] = value; } } // NOTE: imported from dotenv export function applyEnvironmentVariables(path: string, env: Record): void { let lines = Fs.readFileSync(path, 'utf8'); - // Convert line breaks to same format lines = lines.replace(/\r\n?/gm, '\n'); @@ -66,6 +67,7 @@ export function parseEnvInt(envvar: string): number | null { export function parseEnvPath(envvar: string, relativeTo?: string): string { if (!envvar) return null; + if (envvar?.startsWith('~')) envvar = Path.join(Os.homedir(), envvar.slice(1)); if (Path.isAbsolute(envvar)) return envvar; return Path.resolve(relativeTo ?? process.cwd(), envvar); } diff --git a/shared/net/lib/HttpTransportToClient.ts b/shared/net/lib/HttpTransportToClient.ts index 0ac3a474a..037defe2d 100644 --- a/shared/net/lib/HttpTransportToClient.ts +++ b/shared/net/lib/HttpTransportToClient.ts @@ -10,7 +10,7 @@ import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; import ICoreEventPayload from '../interfaces/ICoreEventPayload'; -const Kb = 1024; +const Kb = 1e3; export default class HttpTransportToClient extends TypedEventEmitter> @@ -44,7 +44,7 @@ export default class HttpTransportToClient> { const req = this.request; From 07f768f6ea4b812ece42602de7eff4b33632476b Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 3 Oct 2022 11:38:49 -0400 Subject: [PATCH 037/147] v2.0.0-alpha.12 --- shared/CHANGELOG.md | 13 +++++++++++++ shared/commons/CHANGELOG.md | 13 +++++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 8 ++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 12 ++++++++++++ shared/net/package.json | 4 ++-- shared/specification/CHANGELOG.md | 11 +++++++++++ shared/specification/package.json | 2 +- 10 files changed, 66 insertions(+), 9 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 597af495c..7c73ed6ef 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) + + +### Bug Fixes + +* **commons:** add env bool ([3018132](https://github.com/ulixee/shared/commit/301813222d3da2b7429668e972d70e093c0056c0)) +* **commons:** typeserializer not deep on map ([1f01a5c](https://github.com/ulixee/shared/commit/1f01a5c04d3c8318f44b0a5ac8509247313c7153)) +* only log errors with values; parse env paths ([2e027fe](https://github.com/ulixee/shared/commit/2e027fe9fdb7e193b0ee432543d4216e00149fc8)) + + + + + # [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 10e764639..77b4b86f3 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) + + +### Bug Fixes + +* **commons:** add env bool ([3018132](https://github.com/ulixee/shared/commit/301813222d3da2b7429668e972d70e093c0056c0)) +* **commons:** typeserializer not deep on map ([1f01a5c](https://github.com/ulixee/shared/commit/1f01a5c04d3c8318f44b0a5ac8509247313c7153)) +* only log errors with values; parse env paths ([2e027fe](https://github.com/ulixee/shared/commit/2e027fe9fdb7e193b0ee432543d4216e00149fc8)) + + + + + # [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) diff --git a/shared/commons/package.json b/shared/commons/package.json index cbe518d9d..48083f7d6 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.11", + "version": "2.0.0-alpha.12", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 20fd7abb6..84eb71c76 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) + +**Note:** Version bump only for package @ulixee/crypto + + + + + # [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) diff --git a/shared/crypto/package.json b/shared/crypto/package.json index c2c1fc015..53f435e6d 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.11", + "version": "2.0.0-alpha.12", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.11", - "@ulixee/crypto": "2.0.0-alpha.11", - "@ulixee/specification": "2.0.0-alpha.11", + "@ulixee/commons": "2.0.0-alpha.12", + "@ulixee/crypto": "2.0.0-alpha.12", + "@ulixee/specification": "2.0.0-alpha.12", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index e5b8908a2..43afdbc57 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.11", + "version": "2.0.0-alpha.12", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index 339ebbf87..a01f1ab36 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) + + +### Bug Fixes + +* **commons:** typeserializer not deep on map ([1f01a5c](https://github.com/ulixee/shared/commit/1f01a5c04d3c8318f44b0a5ac8509247313c7153)) +* only log errors with values; parse env paths ([2e027fe](https://github.com/ulixee/shared/commit/2e027fe9fdb7e193b0ee432543d4216e00149fc8)) + + + + + # [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index d3f67cace..31cef9733 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.11", + "version": "2.0.0-alpha.12", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.11", + "@ulixee/commons": "2.0.0-alpha.12", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index efa7de7b7..4cfe5f09a 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) + + +### Bug Fixes + +* **commons:** typeserializer not deep on map ([1f01a5c](https://github.com/ulixee/shared/commit/1f01a5c04d3c8318f44b0a5ac8509247313c7153)) + + + + + # [2.0.0-alpha.11](https://github.com/ulixee/shared/compare/v2.0.0-alpha.10...v2.0.0-alpha.11) (2022-08-31) diff --git a/shared/specification/package.json b/shared/specification/package.json index d96bb31c2..609a24b3e 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.11", + "version": "2.0.0-alpha.12", "description": "", "main": "./index.js", "license": "MIT", From a2ef72d37baa3c013b8e62455f444e6d91b66b3e Mon Sep 17 00:00:00 2001 From: Caleb Clark Date: Thu, 13 Oct 2022 10:23:20 -0500 Subject: [PATCH 038/147] feat: updated Databox specifications to match changes in ulixee --- shared/.nvmrc | 2 +- shared/specification/databox/DataboxApis.ts | 4 ++-- shared/specification/types/IDataboxManifest.ts | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/shared/.nvmrc b/shared/.nvmrc index 62df50f1e..70ffbd183 100644 --- a/shared/.nvmrc +++ b/shared/.nvmrc @@ -1 +1 @@ -14.17.0 +14.20.0 \ No newline at end of file diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts index 5dfc40f7d..942957ffb 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/databox/DataboxApis.ts @@ -62,7 +62,7 @@ export const DataboxApiSchemas = { schema: z.any().optional().describe('A schema describing how to interact with this databox'), }), }, - 'Databox.run': { + 'Databox.exec': { args: z.object({ versionHash: databoxVersionHashValidation.describe('The hash of this unique databox version'), input: z.any().optional().describe('Optional input parameters for your databox'), @@ -90,7 +90,7 @@ export const DataboxApiSchemas = { .optional(), }), }, - 'Databox.runLocalScript': { + 'Databox.execLocalScript': { args: z.object({ scriptPath: z .string() diff --git a/shared/specification/types/IDataboxManifest.ts b/shared/specification/types/IDataboxManifest.ts index 8df3dff88..c2f969798 100644 --- a/shared/specification/types/IDataboxManifest.ts +++ b/shared/specification/types/IDataboxManifest.ts @@ -22,8 +22,11 @@ export const DataboxManifestSchema = z.object({ 'This is not a Databox scripthash (Bech32 encoded hash starting with "scr").', ), scriptEntrypoint: z.string().describe('A relative path from a project root'), - runtimeName: z.string(), - runtimeVersion: z.string().describe('Version of the Databox Core Runtime'), + coreVersion: z.string().describe('Version of the Databox Core Runtime'), + corePlugins: z + .record(z.string()) + .optional() + .describe('plugin dependencies required for execution'), pricePerQuery: micronoteTokenValidation .optional() .describe('Price per query if requiring payment'), From 2efe76a6d81fb913807fbd83b5add31b7ffb5838 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 17 Oct 2022 14:26:05 -0400 Subject: [PATCH 039/147] feat: schemas --- shared/package.json | 3 +- shared/schema/index.ts | 100 ++++++++++++ shared/schema/interfaces/IValidationResult.ts | 10 ++ shared/schema/lib/ArraySchema.ts | 33 ++++ shared/schema/lib/BaseSchema.ts | 153 ++++++++++++++++++ shared/schema/lib/BigintSchema.ts | 34 ++++ shared/schema/lib/BooleanSchema.ts | 13 ++ shared/schema/lib/BufferSchema.ts | 38 +++++ shared/schema/lib/DateSchema.ts | 37 +++++ shared/schema/lib/DateUtilities.ts | 39 +++++ shared/schema/lib/NumberSchema.ts | 60 +++++++ shared/schema/lib/ObjectSchema.ts | 57 +++++++ shared/schema/lib/RecordSchema.ts | 49 ++++++ shared/schema/lib/StringSchema.ts | 139 ++++++++++++++++ shared/schema/package.json | 9 ++ shared/schema/test/Number.test.ts | 36 +++++ shared/schema/test/Object.test.ts | 63 ++++++++ shared/schema/test/String.test.ts | 51 ++++++ shared/schema/yarn.lock | 8 + shared/specification/package.json | 3 +- shared/specification/tsconfig.json | 2 +- shared/specification/types/ISchema.ts | 24 +++ shared/yarn.lock | 5 + 23 files changed, 963 insertions(+), 3 deletions(-) create mode 100644 shared/schema/index.ts create mode 100644 shared/schema/interfaces/IValidationResult.ts create mode 100644 shared/schema/lib/ArraySchema.ts create mode 100644 shared/schema/lib/BaseSchema.ts create mode 100644 shared/schema/lib/BigintSchema.ts create mode 100644 shared/schema/lib/BooleanSchema.ts create mode 100644 shared/schema/lib/BufferSchema.ts create mode 100644 shared/schema/lib/DateSchema.ts create mode 100644 shared/schema/lib/DateUtilities.ts create mode 100644 shared/schema/lib/NumberSchema.ts create mode 100644 shared/schema/lib/ObjectSchema.ts create mode 100644 shared/schema/lib/RecordSchema.ts create mode 100644 shared/schema/lib/StringSchema.ts create mode 100644 shared/schema/package.json create mode 100644 shared/schema/test/Number.test.ts create mode 100644 shared/schema/test/Object.test.ts create mode 100644 shared/schema/test/String.test.ts create mode 100644 shared/schema/yarn.lock create mode 100644 shared/specification/types/ISchema.ts diff --git a/shared/package.json b/shared/package.json index ddd906b56..9eac6c28a 100644 --- a/shared/package.json +++ b/shared/package.json @@ -48,7 +48,8 @@ "net", "crypto", "commons", - "specification" + "specification", + "schema" ] } } diff --git a/shared/schema/index.ts b/shared/schema/index.ts new file mode 100644 index 000000000..c065027ef --- /dev/null +++ b/shared/schema/index.ts @@ -0,0 +1,100 @@ +import BaseSchema from './lib/BaseSchema'; +import NumberSchema, { INumberSchemaConfig } from './lib/NumberSchema'; +import StringSchema, { IStringSchemaConfig } from './lib/StringSchema'; +import BigintSchema, { IBigintSchemaConfig } from './lib/BigintSchema'; +import ObjectSchema, { IObjectSchemaConfig } from './lib/ObjectSchema'; +import ArraySchema, { IArraySchemaConfig } from './lib/ArraySchema'; +import BooleanSchema, { IBooleanSchemaConfig } from './lib/BooleanSchema'; +import BufferSchema, { IBufferSchemaConfig } from './lib/BufferSchema'; +import DateSchema, { IDateSchemaConfig } from './lib/DateSchema'; +import RecordSchema, { IRecordSchemaConfig } from './lib/RecordSchema'; +import { DateUtilities, IUnits } from './lib/DateUtilities'; + +type ISchemaAny = + | StringSchema + | BooleanSchema + | NumberSchema + | BigintSchema + | BufferSchema + | DateSchema + | RecordSchema + | ObjectSchema + | ArraySchema; + +export { ArraySchema, ObjectSchema, ISchemaAny, DateUtilities }; + +type IRecordSchemaType> = { + [P in keyof T]: T[P]['type']; +}; + +export type ExtractSchemaType = T extends BaseSchema + ? T['type'] + : T extends Record + ? IRecordSchemaType + : any; + +export function boolean(config: IBooleanSchemaConfig = {}): BooleanSchema { + return new BooleanSchema(config); +} + +export function number(config: INumberSchemaConfig = {}): NumberSchema { + return new NumberSchema(config); +} + +export function string(config: IStringSchemaConfig = {}): StringSchema { + return new StringSchema(config); +} + +export function bigint(config: IBigintSchemaConfig = {}): BigintSchema { + return new BigintSchema(config); +} + +export function buffer(config: IBufferSchemaConfig = {}): BufferSchema { + return new BufferSchema(config); +} + +export function date(config: IDateSchemaConfig = {}): DateSchema { + return new DateSchema(config); +} + +export function dateAdd(quantity: number, units: IUnits): DateUtilities { + return new DateUtilities({ func: 'add', units, quantity }); +} + +export function dateSubtract(quantity: number, units: IUnits): DateUtilities { + return new DateUtilities({ func: 'subtract', units, quantity }); +} + +export function record>( + config: IRecordSchemaConfig, +): RecordSchema { + return new RecordSchema(config); +} + +export function object>>( + config: IObjectSchemaConfig, +): ObjectSchema; +export function object>>(fields: O): ObjectSchema; +export function object>>( + fieldsOrConfig: IObjectSchemaConfig | O, +): ObjectSchema { + if ( + !fieldsOrConfig.fields || + typeof fieldsOrConfig.fields !== 'object' || + !(Object.values(fieldsOrConfig.fields)[0] instanceof BaseSchema) + ) { + fieldsOrConfig = { fields: fieldsOrConfig } as IObjectSchemaConfig; + } + return new ObjectSchema(fieldsOrConfig as IObjectSchemaConfig); +} + +export function array>(element: E): ArraySchema; +export function array>(config: IArraySchemaConfig): ArraySchema; +export function array>( + elementOrConfig: IArraySchemaConfig | E, +): ArraySchema { + if (elementOrConfig instanceof BaseSchema) { + elementOrConfig = { element: elementOrConfig }; + } + return new ArraySchema(elementOrConfig); +} diff --git a/shared/schema/interfaces/IValidationResult.ts b/shared/schema/interfaces/IValidationResult.ts new file mode 100644 index 000000000..11f7f3144 --- /dev/null +++ b/shared/schema/interfaces/IValidationResult.ts @@ -0,0 +1,10 @@ +export type IValidationError = { + path: string; + code: 'invalidType' | 'constraintFailed' | 'missing'; + message: string; +}; + +export default interface IValidationResult { + success: boolean; + errors: IValidationError[]; +} diff --git a/shared/schema/lib/ArraySchema.ts b/shared/schema/lib/ArraySchema.ts new file mode 100644 index 000000000..9f359ef89 --- /dev/null +++ b/shared/schema/lib/ArraySchema.ts @@ -0,0 +1,33 @@ +import * as assert from 'assert'; +import BaseSchema, { IBaseConfig } from './BaseSchema'; + +export interface IArraySchemaConfig> extends IBaseConfig { + element: E; +} + +export default class ArraySchema> extends BaseSchema< + Array, + IArraySchemaConfig +> { + readonly typeName = 'array'; + element: E; + + constructor(config: IArraySchemaConfig) { + super(config); + assert( + !!config.element, + 'You must provide a definition for the types of elements in this array', + ); + assert(config.element instanceof BaseSchema, 'Element must be an instance of a type of Schema'); + } + + protected validationLogic(value, path, tracker): void { + if (!Array.isArray(value)) { + return this.incorrectType(value, path, tracker); + } + + for (let i = 0; i < value.length; i += 1) { + this.element.validate(value[i], `${path}.${i}`, tracker); + } + } +} diff --git a/shared/schema/lib/BaseSchema.ts b/shared/schema/lib/BaseSchema.ts new file mode 100644 index 000000000..225b58fb8 --- /dev/null +++ b/shared/schema/lib/BaseSchema.ts @@ -0,0 +1,153 @@ +import * as assert from 'assert'; +import IValidationResult, { IValidationError } from '../interfaces/IValidationResult'; + +export interface IBaseConfig { + optional?: boolean; + description?: string; +} + +export default abstract class BaseSchema { + readonly type: Type; + optional?: boolean; + description?: string; + + abstract readonly typeName: string; + + constructor(config?: Config) { + if (config) { + Object.assign(this, config); + if (isDefined(config.description)) { + assert(typeof config.description === 'string', 'description must be a string'); + } + if (isDefined(config.optional)) { + assert(typeof config.optional === 'boolean', 'optional must be a boolean'); + } + } + } + + validate(value: any, path = '', validationTracker = ValidationTracker()): IValidationResult { + if (!validationTracker.has(value, this)) { + this.validationLogic(value, path, validationTracker); + } + return { + success: !validationTracker.errors.length, + errors: validationTracker.errors, + }; + } + + protected abstract validationLogic( + value: any, + path: string, + validationTracker: IValidationTracker, + ): void; + + protected incorrectType(value: unknown, path: string, tracker: IValidationTracker): void { + let actualType: string = typeof value; + if (actualType === 'object') { + if (value === null) actualType = 'null'; + if (Array.isArray(value)) actualType = 'array'; + if (value.constructor?.name !== 'Object') actualType = value.constructor?.name; + } + tracker.errors.push({ + path, + code: 'invalidType', + message: `Expected ${BaseSchema.inspect(this)}, but was ${actualType}`, + }); + } + + protected failedConstraint( + value: unknown, + message: string, + path: string, + tracker: IValidationTracker, + ): void { + const info = message ? `: ${message}` : ''; + tracker.errors.push({ + path, + code: 'constraintFailed', + message: `Failed constraint check for ${BaseSchema.inspect(this)}${info}`, + }); + } + + protected propertyMissing( + property: BaseSchema, + path: string, + tracker: IValidationTracker, + ): void { + tracker.errors.push({ + path, + code: 'missing', + message: `Expected ${BaseSchema.inspect(property, undefined)}, but was missing`, + }); + } + + static inspect(schema: any, needsParens = false, circular = new Set>()): string { + if (circular.has(schema)) { + let s = `CIRCULAR ${schema.typeName}`; + if (needsParens) s = `(${s})`; + return s; + } + circular.add(schema); + + try { + switch (schema.typeName) { + case 'boolean': + case 'number': + case 'bigint': + case 'buffer': + case 'date': + case 'string': { + return schema.typeName; + } + case 'array': + return `${schema}${BaseSchema.inspect(schema.element, true, circular)}[]`; + case 'record': { + const keys = Object.keys(schema.fields); + return keys.length + ? `{ ${keys + .map( + k => + `${schema}${k}${schema.fields[k].optional ? '?' : ''}: ${BaseSchema.inspect( + schema.fields[k], + false, + circular, + )};`, + ) + .join(' ')} }` + : '{}'; + } + } + } finally { + circular.delete(schema); + } + } +} + +export function isDefined(value: any): boolean { + return !(value === null || value === undefined); +} + +export type IValidationTracker = { + errors: IValidationError[]; + has(candidate: object, type: BaseSchema): boolean; +}; + +function ValidationTracker(): IValidationTracker { + const members: WeakMap, true>> = new WeakMap(); + + return { + errors: [], + has(candidate: object, type: BaseSchema): boolean { + let typeSet = members.get(candidate); + const value = typeSet?.get(type) ?? false; + if (candidate !== null && typeof candidate === 'object') { + if (!typeSet) { + typeSet = new WeakMap(); + members.set(candidate, typeSet); + } + typeSet.set(type, true); + } + return value; + }, + }; +} diff --git a/shared/schema/lib/BigintSchema.ts b/shared/schema/lib/BigintSchema.ts new file mode 100644 index 000000000..af465a238 --- /dev/null +++ b/shared/schema/lib/BigintSchema.ts @@ -0,0 +1,34 @@ +import * as assert from 'assert'; +import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; + +export interface IBigintSchemaConfig extends IBaseConfig { + min?: bigint; + max?: bigint; +} + +export default class BigintSchema extends BaseSchema { + readonly typeName = 'bigint'; + min?: bigint; + max?: bigint; + + constructor(config: IBigintSchemaConfig = {}) { + super(config); + if (isDefined(config.min)) assert(typeof config.min === 'bigint', 'Min value must be a bigint'); + if (isDefined(config.max)) assert(typeof config.max === 'bigint', 'Max value must be a bigint'); + } + + protected validationLogic(value: any, path, tracker): void { + if (typeof value !== this.typeName) { + return this.incorrectType(value, path, tracker); + } + + const config = this as IBigintSchemaConfig; + if (config.max !== undefined && config.min !== null && value < config.min) { + return this.failedConstraint(value, ' This value is smaller than the min.', path, tracker); + } + + if (config.max !== undefined && config.max !== null && value > config.max) { + return this.failedConstraint(value, ' This value is larger than the max.', path, tracker); + } + } +} diff --git a/shared/schema/lib/BooleanSchema.ts b/shared/schema/lib/BooleanSchema.ts new file mode 100644 index 000000000..55b133a0f --- /dev/null +++ b/shared/schema/lib/BooleanSchema.ts @@ -0,0 +1,13 @@ +import BaseSchema, { IBaseConfig } from './BaseSchema'; + +export interface IBooleanSchemaConfig extends IBaseConfig {} + +export default class BooleanSchema extends BaseSchema { + readonly typeName = 'boolean'; + + protected validationLogic(value: any, path, tracker): void { + if (typeof value !== this.typeName) { + return this.incorrectType(value, path, tracker); + } + } +} diff --git a/shared/schema/lib/BufferSchema.ts b/shared/schema/lib/BufferSchema.ts new file mode 100644 index 000000000..aedf2b100 --- /dev/null +++ b/shared/schema/lib/BufferSchema.ts @@ -0,0 +1,38 @@ +import * as assert from 'assert'; +import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; + +const IBufferEncodingTypes = [ + 'ascii', + 'utf8', + 'utf16le', + 'ucs2', + 'base64', + 'latin1', + 'binary', + 'hex', +] as const; + +export interface IBufferSchemaConfig extends IBaseConfig { + encoding?: keyof typeof IBufferEncodingTypes; +} + +export default class BufferSchema extends BaseSchema { + readonly typeName = 'buffer'; + encoding?: keyof typeof IBufferEncodingTypes; + + constructor(config?: IBufferSchemaConfig) { + super(config); + + if (isDefined(config.encoding)) + assert( + !IBufferEncodingTypes.includes(config.encoding as any), + `encoding must be one of ${IBufferEncodingTypes.join(', ')}`, + ); + } + + protected validationLogic(value: any, path, tracker): void { + if (!Buffer.isBuffer(value)) { + return this.incorrectType(value, path, tracker); + } + } +} diff --git a/shared/schema/lib/DateSchema.ts b/shared/schema/lib/DateSchema.ts new file mode 100644 index 000000000..6b0daf2e0 --- /dev/null +++ b/shared/schema/lib/DateSchema.ts @@ -0,0 +1,37 @@ +import moment = require('moment'); +import * as assert from 'assert'; +import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; + +export interface IDateSchemaConfig extends IBaseConfig { + future?: boolean; + past?: boolean; +} + +export default class DateSchema extends BaseSchema { + readonly typeName = 'date'; + future?: boolean; + past?: boolean; + + constructor(config: IDateSchemaConfig = {}) { + super(config); + if (isDefined(config.future)) + assert(typeof config.future === 'boolean', 'future must be a boolean'); + if (isDefined(config.past)) assert(typeof config.past === 'boolean', 'past must be a boolean'); + } + + protected validationLogic(value: any, path, tracker): void { + const mDate = moment(value); + if (!mDate.isValid()) { + return this.incorrectType(value, path, tracker); + } + + const config = this as IDateSchemaConfig; + if (config.future && !mDate.isAfter(new Date())) { + return this.failedConstraint(value, ' Value is not a date in the future.', path, tracker); + } + + if (config.past && !mDate.isBefore(new Date())) { + return this.failedConstraint(value, ' Value is not a date in the past.', path, tracker); + } + } +} diff --git a/shared/schema/lib/DateUtilities.ts b/shared/schema/lib/DateUtilities.ts new file mode 100644 index 000000000..8d3e943a2 --- /dev/null +++ b/shared/schema/lib/DateUtilities.ts @@ -0,0 +1,39 @@ +import * as assert from 'assert'; +import moment = require('moment'); + +const Units = ['seconds', 'minutes', 'hours', 'days', 'months', 'years'] as const; +export type IUnits = 'seconds' | 'minutes' | 'hours' | 'days' | 'months' | 'years'; + +interface IDateFunction { + func: 'add' | 'subtract'; + quantity: number; + units: IUnits; +} + +export class DateUtilities implements IDateFunction { + func: 'add' | 'subtract'; + quantity: number; + units: IUnits; + + constructor(config: IDateFunction) { + Object.assign(this, config); + assert(config.func === 'add' || config.func === 'subtract', 'func must be add or subtract'); + assert(typeof config.quantity === 'number', 'quantity must be a number'); + assert(Units.includes(config.units as any), `units must be one of ${Units.join(',')}`); + } + + public evaluate(format: 'date' | 'time'): string; + public evaluate(): Date; + public evaluate(format?: 'date' | 'time'): Date | string { + let result: moment.Moment; + if (this.func === 'add') { + result = moment().add(this.quantity, this.units as any); + } + if (this.func === 'subtract') { + result = moment().subtract(this.quantity, this.units as any); + } + if (format === 'date') return result.format('YYYY-MM-DD'); + if (format === 'time') return result.format('HH:mm'); + return result.toDate(); + } +} diff --git a/shared/schema/lib/NumberSchema.ts b/shared/schema/lib/NumberSchema.ts new file mode 100644 index 000000000..38fbb47ec --- /dev/null +++ b/shared/schema/lib/NumberSchema.ts @@ -0,0 +1,60 @@ +import * as assert from 'assert'; +import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; + +export interface INumberSchemaConfig extends IBaseConfig { + min?: number; + max?: number; + decimals?: number; + integer?: boolean; +} + +export default class NumberSchema extends BaseSchema { + readonly typeName = 'number'; + min?: number; + max?: number; + decimals?: number; + integer?: boolean; + + constructor(config: INumberSchemaConfig = {}) { + super(config); + if (isDefined(config.min)) assert(typeof config.min === 'number', 'Min value must be a number'); + if (isDefined(config.max)) assert(typeof config.max === 'number', 'Max value must be a number'); + if (isDefined(config.decimals)) { + assert(typeof config.decimals === 'number', 'number of required decimals must be a number'); + } + if (isDefined(config.integer)) { + assert(typeof config.integer === 'boolean', 'integer must be a boolean'); + } + } + + protected validationLogic(value: any, path, tracker): void { + if (typeof value !== this.typeName) { + return this.incorrectType(value, path, tracker); + } + + const config = this as INumberSchemaConfig; + if (config.min !== undefined && config.min !== null && value < config.min) { + return this.failedConstraint(value, ' This value is smaller than the min.', path, tracker); + } + + if (config.max !== undefined && config.max !== null && value > config.max) { + return this.failedConstraint(value, ' This value is larger than the max.', path, tracker); + } + + if (config.integer === true && !Number.isInteger(value)) { + return this.failedConstraint(value, ' This value is not an integer.', path, tracker); + } + + if (config.decimals !== undefined && Number.isInteger(config.decimals)) { + const decimals = String(value).split('.')[1]?.length ?? 0; + if (decimals !== config.decimals) { + return this.failedConstraint( + value, + ` This value has an invalid number of decimal places (${decimals})`, + path, + tracker, + ); + } + } + } +} diff --git a/shared/schema/lib/ObjectSchema.ts b/shared/schema/lib/ObjectSchema.ts new file mode 100644 index 000000000..d4458b580 --- /dev/null +++ b/shared/schema/lib/ObjectSchema.ts @@ -0,0 +1,57 @@ +import * as assert from 'assert'; +import BaseSchema, { IBaseConfig } from './BaseSchema'; + +export interface IObjectSchemaConfig>> + extends IBaseConfig { + fields: O; +} + +export default class ObjectSchema>> extends BaseSchema< + { [K in keyof O]?: O[K]['type'] }, + IObjectSchemaConfig +> { + readonly typeName = 'object'; + fields: O; + + constructor(config: IObjectSchemaConfig) { + super(config); + assert(config.fields, 'You must configure the fields for this object'); + assert( + Object.keys(config.fields).length, + 'You must configure one or more fields for this object', + ); + assert( + Object.values(config.fields).every(x => x instanceof BaseSchema), + 'Each value of fields must be a type of Schema', + ); + } + + protected validationLogic(value, path, tracker): void { + if (value === null || value === undefined) { + return this.incorrectType(value, path, tracker); + } + + const fields = this.fields; + const keysOfFields = Object.keys(fields); + if (keysOfFields.length && typeof value !== 'object') { + return this.incorrectType(value, path, tracker); + } + + const keys = [...new Set([...keysOfFields, ...Object.keys(value)])]; + for (const key of keys) { + const childPath = `${path}.${key}`; + if (key in fields) { + const schema: BaseSchema = fields[key]; + if (key in value) { + const keyValue = value[key]; + if (schema.optional && (keyValue === undefined || keyValue === null)) { + } else { + schema.validate(keyValue, childPath, tracker); + } + } else if (!schema.optional) { + this.propertyMissing(schema, childPath, tracker); + } + } + } + } +} diff --git a/shared/schema/lib/RecordSchema.ts b/shared/schema/lib/RecordSchema.ts new file mode 100644 index 000000000..c641dae07 --- /dev/null +++ b/shared/schema/lib/RecordSchema.ts @@ -0,0 +1,49 @@ +import * as assert from 'assert'; +import BaseSchema, { IBaseConfig } from './BaseSchema'; +import StringSchema from './StringSchema'; + +export interface IRecordSchemaConfig> extends IBaseConfig { + values: Value; + keys?: StringSchema; +} + +export default class RecordSchema> extends BaseSchema< + Record, + IRecordSchemaConfig +> { + readonly typeName = 'record'; + values: BaseSchema; + keys?: StringSchema; + + constructor(config: IRecordSchemaConfig) { + super(config); + assert(config.values, 'You must configure the types of values for this record'); + assert( + config.values instanceof BaseSchema, + 'The values definition for this record must be a type of Schema', + ); + if (config.keys) { + assert( + config.keys instanceof StringSchema, + 'The definition for keys of this record must be a StringSchema', + ); + } + } + + protected validationLogic(value, path, tracker): void { + if (value === null || value === undefined) { + return this.incorrectType(value, path, tracker); + } + + if (typeof value !== 'object') { + return this.incorrectType(value, path, tracker); + } + + for (const key of Object.keys(value)) { + const childPath = `${path}.${key}`; + if (this.keys) this.keys.validate(key, childPath, tracker); + const schema = this.values; + schema.validate(value[key], childPath, tracker); + } + } +} diff --git a/shared/schema/lib/StringSchema.ts b/shared/schema/lib/StringSchema.ts new file mode 100644 index 000000000..31c915ff0 --- /dev/null +++ b/shared/schema/lib/StringSchema.ts @@ -0,0 +1,139 @@ +import moment = require('moment'); +import { URL } from 'url'; +import * as assert from 'assert'; +import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; + +export interface IStringSchemaConfig extends IBaseConfig { + format?: 'email' | 'url' | 'date' | 'time'; + regexp?: RegExp; + enum?: string[]; + minLength?: number; + maxLength?: number; + length?: number; +} + +export default class StringSchema extends BaseSchema { + readonly typeName = 'string'; + format?: 'email' | 'url' | 'date' | 'time'; + regexp?: RegExp; + enum?: string[]; + minLength?: number; + maxLength?: number; + length?: number; + + constructor(config: IStringSchemaConfig = {}) { + super(config); + if (isDefined(this.format)) + assert( + ['email', 'url', 'date', 'time'].includes(this.format), + 'format must be one of email, url, date, time', + ); + if (isDefined(this.regexp)) + assert(this.regexp instanceof RegExp, 'regexp must be an instance of a regex'); + if (isDefined(this.enum)) { + assert(Array.isArray(this.enum), 'enum must be an array of values'); + assert( + this.enum.every(x => typeof x === 'string'), + 'enum must contain only strings', + ); + } + if (isDefined(config.minLength)) + assert(typeof config.minLength === 'number', 'minLength value must be a number'); + if (isDefined(config.maxLength)) + assert(typeof config.maxLength === 'number', 'maxLength value must be a number'); + if (isDefined(config.length)) + assert(typeof config.length === 'number', 'length value must be a number'); + } + + protected validationLogic(value: any, path, tracker): void { + if (typeof value !== this.typeName) { + return this.incorrectType(value, path, tracker); + } + + const config = this as IStringSchemaConfig; + if (config.format) { + switch (config.format) { + case 'date': { + if (!moment(value, 'YYYY-MM-DD').isValid()) { + return this.failedConstraint( + value, + ` This value does not follow the YYYY-MM-DD date pattern`, + path, + tracker, + ); + } + break; + } + case 'email': { + if (!regexpEmail.test(value)) { + return this.failedConstraint(value, ' This value is not a valid email', path, tracker); + } + break; + } + case 'time': { + if (!moment(value, 'HH:mm').isValid()) { + return this.failedConstraint( + value, + ` This value does not follow the HH:mm time pattern`, + path, + tracker, + ); + } + break; + } + case 'url': { + try { + new URL(value); + } catch (err) { + return this.failedConstraint(value, ' This value is not a valid url', path, tracker); + } + break; + } + } + } + + if (config.regexp && config.regexp instanceof RegExp && !config.regexp.test(value)) { + return this.failedConstraint( + value, + ` This value does not match the field RegExp: /${config.regexp.source}/${config.regexp.flags}`, + path, + tracker, + ); + } + + if (config.minLength !== undefined && value.length < config.minLength) { + return this.failedConstraint( + value, + ' This value is shorter than the minLength', + path, + tracker, + ); + } + + if (config.maxLength !== undefined && value.length > config.maxLength) { + return this.failedConstraint( + value, + ' This value is shorter than the maxLength', + path, + tracker, + ); + } + + if (config.length !== undefined && value.length !== config.length) { + return this.failedConstraint(value, ' This value is not the required length', path, tracker); + } + + if (config.enum?.length && !config.enum.includes(value)) { + return this.failedConstraint( + value, + ' This value does not match the allowed enum values', + path, + tracker, + ); + } + } +} + +// Taken from HTML spec: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address +const regexpEmail = + /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; diff --git a/shared/schema/package.json b/shared/schema/package.json new file mode 100644 index 000000000..de00bdb16 --- /dev/null +++ b/shared/schema/package.json @@ -0,0 +1,9 @@ +{ + "name": "@ulixee/schema", + "version": "2.0.0-alpha.12", + "description": "A basic schema utility with static constraints to support secure type checking.", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + } +} diff --git a/shared/schema/test/Number.test.ts b/shared/schema/test/Number.test.ts new file mode 100644 index 000000000..8c9e248cd --- /dev/null +++ b/shared/schema/test/Number.test.ts @@ -0,0 +1,36 @@ +import { bigint, number } from '../index'; + +test('should be able to create an int schema', () => { + const schema = number({ integer: true }); + expect(schema.validate(1).success).toBe(true); + expect(schema.validate('test').success).toBe(false); + expect(schema.validate(1.2).success).toBe(false); +}); + +test('should be able to create an decimal schema', () => { + const schema = number({ decimals: 1 }); + expect(schema.validate(1.1).success).toBe(true); + expect(schema.validate('test').success).toBe(false); + expect(schema.validate(1).success).toBe(false); +}); + +test('should be able to create an bigint schema', () => { + const schema = bigint(); + expect(schema.validate(1n).success).toBe(true); + expect(schema.validate('test').success).toBe(false); + expect(schema.validate(1).success).toBe(false); +}); + +test('should be able to validate a number has a max range', () => { + const schema = number({ max: 10 }); + expect(schema.validate(0).success).toBe(true); + expect(schema.validate(-190).success).toBe(true); + expect(schema.validate(11).success).toBe(false); +}); + +test('should be able to validate a number has a min range', () => { + const schema = number({ min: 0 }); + expect(schema.validate(1).success).toBe(true); + expect(schema.validate(-190).success).toBe(false); + expect(schema.validate(1).success).toBe(true); +}); diff --git a/shared/schema/test/Object.test.ts b/shared/schema/test/Object.test.ts new file mode 100644 index 000000000..0424faff6 --- /dev/null +++ b/shared/schema/test/Object.test.ts @@ -0,0 +1,63 @@ +import { array, boolean, ExtractSchemaType, number, object, string } from '../index'; + +test('should be able to create an object schema', () => { + const schema = object({ + fields: { + one: boolean(), + two: string(), + three: number({ optional: true }), + }, + }); + expect(schema.validate({ one: true, two: '' }).success).toBe(true); + expect(schema.validate({ one: true, two: '', three: 1 }).success).toBe(true); + expect(schema.validate({ one: true, two: '', three: '' }).success).toBe(false); + expect(schema.validate({ one: true, two: '', three: '' }).errors).toHaveLength(1); + expect(schema.validate({ one: true, two: '', three: '' }).errors[0]).toEqual( + expect.objectContaining({ + code: 'invalidType', + path: '.three', + }), + ); +}); + +test('should be able to create an object schema with nested objects', () => { + const nested = object({ + one: string(), + two: string({ format: 'email' }), + }); + + const schema = object({ + fields: { + one: boolean(), + twoArray: array(nested), + }, + }); + expect(schema.validate({ one: true, two: '' }).success).toBe(false); + expect(schema.validate({ one: true, twoArray: '' }).errors[0]).toEqual( + expect.objectContaining({ + code: 'invalidType', + path: '.twoArray', + }), + ); + + const jsonExample: ExtractSchemaType = { + one: false, + twoArray: [ + { + one: 'one', + two: 'email@gmail.com', + }, + { + one: 'two', + two: 'notAnEmail', + }, + ], + }; + + expect(schema.validate(jsonExample).errors[0]).toEqual( + expect.objectContaining({ + code: 'constraintFailed', + path: '.twoArray.1.two', + }), + ); +}); diff --git a/shared/schema/test/String.test.ts b/shared/schema/test/String.test.ts new file mode 100644 index 000000000..44063481e --- /dev/null +++ b/shared/schema/test/String.test.ts @@ -0,0 +1,51 @@ +import { string } from '../index'; + +test('should be able to create a string schema', () => { + const schema = string(); + expect(schema.validate('test').success).toBe(true); + expect(schema.validate(1).success).toBe(false); +}); + +test('should be able to test an email format', () => { + const schema = string({ format: 'email' }); + expect(schema.validate('test@test.com').success).toBe(true); + expect(schema.validate('tes').success).toBe(false); + expect(schema.validate(1).success).toBe(false); +}); + +test('should be able to specify a url format', () => { + const schema = string({ format: 'url' }); + expect(schema.validate('https://url.com').success).toBe(true); + expect(schema.validate('test@test.com').success).toBe(false); + expect(schema.validate('tes').success).toBe(false); + expect(schema.validate(1).success).toBe(false); +}); + +test('should be able to specify a date format', () => { + const schema = string({ format: 'date' }); + expect(schema.validate('2022-01-01').success).toBe(true); + expect(schema.validate('2022-12-31').success).toBe(true); + expect(schema.validate('2022-12-32').success).toBe(false); +}); + +test('should be able to specify a time format', () => { + const schema = string({ format: 'time' }); + expect(schema.validate('01:01').success).toBe(true); + expect(schema.validate('23:59').success).toBe(true); + expect(schema.validate('24:01').success).toBe(false); +}); + +test('should be able to validate a string length', () => { + expect(string({ length: 5 }).validate('12345').success).toBe(true); + expect(string({ length: 5 }).validate('1234').success).toBe(false); + expect(string({ maxLength: 5 }).validate('125').success).toBe(true); + expect(string({ maxLength: 5 }).validate('123456').success).toBe(false); + expect(string({ minLength: 5 }).validate('12345').success).toBe(true); + expect(string({ minLength: 5 }).validate('1234').success).toBe(false); +}); + +test('should be able to validate a regex', () => { + const schema = string({ regexp: /[ABC]{3,5}/ }); + expect(schema.validate('AAA').success).toBe(true); + expect(schema.validate('acb').success).toBe(false); +}); diff --git a/shared/schema/yarn.lock b/shared/schema/yarn.lock new file mode 100644 index 000000000..847bb497b --- /dev/null +++ b/shared/schema/yarn.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +moment@^2.29.4: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== diff --git a/shared/specification/package.json b/shared/specification/package.json index 609a24b3e..e0e1bd65c 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -5,6 +5,7 @@ "main": "./index.js", "license": "MIT", "dependencies": { - "zod": "^3.17.3" + "zod": "^3.17.3", + "@ulixee/schema": "2.0.0-alpha.12" } } diff --git a/shared/specification/tsconfig.json b/shared/specification/tsconfig.json index 0c1d1357f..d883d01fe 100644 --- a/shared/specification/tsconfig.json +++ b/shared/specification/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "strict": true + "strictNullChecks": true }, "include": ["**/*.ts", "*.ts", "package.json", ".eslintrc.js"], "exclude": ["**/tsconfig*.json", "**/node_modules", "**/build"] diff --git a/shared/specification/types/ISchema.ts b/shared/specification/types/ISchema.ts new file mode 100644 index 000000000..032a13f47 --- /dev/null +++ b/shared/specification/types/ISchema.ts @@ -0,0 +1,24 @@ +import { z } from 'zod'; + +export const schemaVersionHashValidation = z + .string() + .length(62) + .regex( + /^sch1[ac-hj-np-z02-9]{58}/, + 'This is not a Schema versionHash (Bech32 encoded hash starting with "sch1").', + ); + + +// These are things we need to track, but not totally sure where yet +export const SchemaManifest = z.object({ + schemaCoreHash: schemaVersionHashValidation.describe( + 'A hash of the main attributes of the schema to avoid changes for minor description changes', + ), + baseSchemaHash: schemaVersionHashValidation, + previousVersionHash: schemaVersionHashValidation, +}); + +type ISchemaManifest = z.infer; + +export default ISchemaManifest; +export { z }; diff --git a/shared/yarn.lock b/shared/yarn.lock index d58a0952c..a0055f2e2 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -5319,6 +5319,11 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +moment@^2.29.4: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + mri@^1.1.5: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" From a76e49aa22f56fa4c76dbcb0f03a23d60a8d47cb Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 19 Oct 2022 12:09:00 -0400 Subject: [PATCH 040/147] feat: ability to generate schema interface strings --- shared/.github/workflows/lint-and-test.yml | 4 +- shared/commons/lib/objectUtils.ts | 2 +- shared/schema/interfaces/ISchemaJson.ts | 58 ++++++++ shared/schema/lib/DateSchema.ts | 3 +- shared/schema/lib/ObjectSchema.ts | 12 +- shared/schema/lib/schemaFromJson.ts | 53 +++++++ shared/schema/lib/schemaToInterface.ts | 139 ++++++++++++++++++ shared/schema/package.dist.json | 5 + shared/schema/package.json | 3 + shared/schema/test/schemaToInterface.test.ts | 25 ++++ shared/specification/databox/DataboxApis.ts | 2 +- .../specification/types/IDataboxManifest.ts | 1 + shared/yarn.lock | 5 + 13 files changed, 300 insertions(+), 12 deletions(-) create mode 100644 shared/schema/interfaces/ISchemaJson.ts create mode 100644 shared/schema/lib/schemaFromJson.ts create mode 100644 shared/schema/lib/schemaToInterface.ts create mode 100644 shared/schema/package.dist.json create mode 100644 shared/schema/test/schemaToInterface.test.ts diff --git a/shared/.github/workflows/lint-and-test.yml b/shared/.github/workflows/lint-and-test.yml index be314a9c3..8799762f5 100644 --- a/shared/.github/workflows/lint-and-test.yml +++ b/shared/.github/workflows/lint-and-test.yml @@ -20,11 +20,11 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: submodules: 'true' - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'yarn' diff --git a/shared/commons/lib/objectUtils.ts b/shared/commons/lib/objectUtils.ts index 7601711c6..f7dc8ded3 100644 --- a/shared/commons/lib/objectUtils.ts +++ b/shared/commons/lib/objectUtils.ts @@ -15,7 +15,7 @@ export function omit( object = Object(object); const result = {} as any; - for (const [key, value] of Object.keys(object)) { + for (const [key, value] of Object.entries(object)) { if (!keys.includes(key as any)) { result[key] = value; } diff --git a/shared/schema/interfaces/ISchemaJson.ts b/shared/schema/interfaces/ISchemaJson.ts new file mode 100644 index 000000000..6683aa3c4 --- /dev/null +++ b/shared/schema/interfaces/ISchemaJson.ts @@ -0,0 +1,58 @@ +import { IBaseConfig } from '../lib/BaseSchema'; +import { IBigintSchemaConfig } from '../lib/BigintSchema'; +import { IBooleanSchemaConfig } from '../lib/BooleanSchema'; +import { IBufferSchemaConfig } from '../lib/BufferSchema'; +import { IDateSchemaConfig } from '../lib/DateSchema'; +import { INumberSchemaConfig } from '../lib/NumberSchema'; +import { IStringSchemaConfig } from '../lib/StringSchema'; + +export type IAnySchemaJson = + | IArraySchemaJson + | IObjectSchemaJson + | IBigintSchemaJson + | IBooleanSchemaJson + | IBufferSchemaJson + | IDateSchemaJson + | IStringSchemaJson + | INumberSchemaJson + | IRecordSchemaJson; + +export interface IArraySchemaJson extends IBaseConfig { + typeName: 'array'; + element: IObjectSchemaJson; +} + +export interface IObjectSchemaJson extends IBaseConfig { + typeName: 'object'; + fields: Record; +} + +export interface IBigintSchemaJson extends IBigintSchemaConfig { + typeName: 'bigint'; +} + +export interface IBooleanSchemaJson extends IBooleanSchemaConfig { + typeName: 'boolean'; +} + +export interface IBufferSchemaJson extends IBufferSchemaConfig { + typeName: 'buffer'; +} + +export interface IDateSchemaJson extends IDateSchemaConfig { + typeName: 'date'; +} + +export interface INumberSchemaJson extends INumberSchemaConfig { + typeName: 'number'; +} + +export interface IStringSchemaJson extends IStringSchemaConfig { + typeName: 'string'; +} + +export interface IRecordSchemaJson extends IBaseConfig { + typeName: 'record'; + values: IAnySchemaJson; + keys?: IStringSchemaJson; +} diff --git a/shared/schema/lib/DateSchema.ts b/shared/schema/lib/DateSchema.ts index 6b0daf2e0..0f324d3e7 100644 --- a/shared/schema/lib/DateSchema.ts +++ b/shared/schema/lib/DateSchema.ts @@ -8,7 +8,7 @@ export interface IDateSchemaConfig extends IBaseConfig { } export default class DateSchema extends BaseSchema { - readonly typeName = 'date'; + readonly typeName = 'date'; future?: boolean; past?: boolean; @@ -17,6 +17,7 @@ export default class DateSchema extends BaseSchema { if (isDefined(config.future)) assert(typeof config.future === 'boolean', 'future must be a boolean'); if (isDefined(config.past)) assert(typeof config.past === 'boolean', 'past must be a boolean'); + assert(!(config.past && config.future), "can't be both past and future"); } protected validationLogic(value: any, path, tracker): void { diff --git a/shared/schema/lib/ObjectSchema.ts b/shared/schema/lib/ObjectSchema.ts index d4458b580..d75ef4536 100644 --- a/shared/schema/lib/ObjectSchema.ts +++ b/shared/schema/lib/ObjectSchema.ts @@ -21,7 +21,7 @@ export default class ObjectSchema>> ext 'You must configure one or more fields for this object', ); assert( - Object.values(config.fields).every(x => x instanceof BaseSchema), + Object.values(config.fields).every(x => x && x instanceof BaseSchema), 'Each value of fields must be a type of Schema', ); } @@ -42,12 +42,10 @@ export default class ObjectSchema>> ext const childPath = `${path}.${key}`; if (key in fields) { const schema: BaseSchema = fields[key]; - if (key in value) { - const keyValue = value[key]; - if (schema.optional && (keyValue === undefined || keyValue === null)) { - } else { - schema.validate(keyValue, childPath, tracker); - } + if (!schema || !(schema instanceof BaseSchema)) continue; + const keyValue = value[key]; + if (keyValue !== null && keyValue !== undefined) { + schema.validate(keyValue, childPath, tracker); } else if (!schema.optional) { this.propertyMissing(schema, childPath, tracker); } diff --git a/shared/schema/lib/schemaFromJson.ts b/shared/schema/lib/schemaFromJson.ts new file mode 100644 index 000000000..79f06a32b --- /dev/null +++ b/shared/schema/lib/schemaFromJson.ts @@ -0,0 +1,53 @@ +import { IAnySchemaJson } from '../interfaces/ISchemaJson'; +import NumberSchema from './NumberSchema'; +import BigintSchema from './BigintSchema'; +import BooleanSchema from './BooleanSchema'; +import BufferSchema from './BufferSchema'; +import DateSchema from './DateSchema'; +import StringSchema from './StringSchema'; +import RecordSchema, { IRecordSchemaConfig } from './RecordSchema'; +import ArraySchema from './ArraySchema'; +import ObjectSchema from './ObjectSchema'; +import { ISchemaAny } from '../index'; + +export default function schemaFromJson( + json: Record | IAnySchemaJson, +): ISchemaAny { + if (!json) return undefined; + + if (json?.typeName && typeof json.typeName === 'string') { + return parseField(json as IAnySchemaJson); + } + return parseObjectSchema(json as Record); +} + +function parseField(json: IAnySchemaJson): ISchemaAny { + if (json.typeName === 'number') return new NumberSchema(json); + if (json.typeName === 'bigint') return new BigintSchema(json); + if (json.typeName === 'boolean') return new BooleanSchema(json); + if (json.typeName === 'buffer') return new BufferSchema(json); + if (json.typeName === 'date') return new DateSchema(json); + if (json.typeName === 'string') return new StringSchema(json); + if (json.typeName === 'record') { + const recordConfig: IRecordSchemaConfig = { + values: parseField(json.values), + }; + if (json.keys) recordConfig.keys = new StringSchema(json.keys); + return new RecordSchema(recordConfig); + } + if (json.typeName === 'array') { + const elementConfig = parseField(json.element); + return new ArraySchema({ element: elementConfig }); + } + if (json.typeName === 'object') { + return parseObjectSchema(json.fields); + } +} + +function parseObjectSchema(json: Record): ObjectSchema { + const fields: Record = {}; + for (const [field, schemaJson] of Object.entries(json)) { + fields[field] = parseField(schemaJson); + } + return new ObjectSchema({ fields }); +} diff --git a/shared/schema/lib/schemaToInterface.ts b/shared/schema/lib/schemaToInterface.ts new file mode 100644 index 000000000..a49a3ff29 --- /dev/null +++ b/shared/schema/lib/schemaToInterface.ts @@ -0,0 +1,139 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import * as ts from 'typescript'; +import { ISchemaAny, object } from '../index'; +import BaseSchema from './BaseSchema'; + +const { factory: f } = ts; + +export default function schemaToInterface( + schema: ISchemaAny | Record, +): ts.TypeNode { + if (schema !== null && !(schema instanceof BaseSchema)) { + if (typeof schema === 'object' && Object.values(schema).every(x => x instanceof BaseSchema)) { + schema = object({ fields: schema as Record }); + } + } + + switch (schema.typeName) { + case 'string': { + if (schema.enum) { + const types = schema.enum.map(x => f.createLiteralTypeNode(f.createStringLiteral(x))); + return f.createUnionTypeNode(types); + } + return f.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + } + case 'number': + return f.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); + case 'bigint': + return f.createKeywordTypeNode(ts.SyntaxKind.BigIntKeyword); + case 'boolean': + return f.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); + case 'date': + return f.createTypeReferenceNode(f.createIdentifier('Date')); + case 'buffer': + return f.createTypeReferenceNode(f.createIdentifier('Buffer')); + case 'object': { + const properties = Object.entries(schema.fields) as [string, ISchemaAny][]; + + const members: ts.TypeElement[] = properties.map(([key, childSchema]) => { + const type = schemaToInterface(childSchema); + const optional = childSchema.optional + ? f.createToken(ts.SyntaxKind.QuestionToken) + : undefined; + const propName = getIdentifierOrStringLiteral(key); + + const propertySignature = f.createPropertySignature(undefined, propName, optional, type); + const comments: string[] = []; + + if (childSchema.description) { + comments.push(childSchema.description); + } + const constraints: string[] = []; + if ('decimals' in childSchema) constraints.push(`@decimals ${childSchema.decimals}`); + if ('integer' in childSchema && childSchema.integer) constraints.push(`@integer`); + if ('min' in childSchema) constraints.push(`@min ${childSchema.min}`); + if ('max' in childSchema) constraints.push(`@max ${childSchema.min}`); + if ('encoding' in childSchema) + constraints.push(`@encoding ${String(childSchema.encoding)}`); + if ('format' in childSchema) constraints.push(`@format ${childSchema.format}`); + if ('minLength' in childSchema) constraints.push(`@minLength ${childSchema.minLength}`); + if ('maxLength' in childSchema) constraints.push(`@maxLength ${childSchema.maxLength}`); + if ('length' in childSchema) constraints.push(`@length ${childSchema.length}`); + if ('regexp' in childSchema) constraints.push(`@regex /${childSchema.regexp.source}/`); + if ('future' in childSchema && childSchema.future) constraints.push(`@future`); + if ('past' in childSchema && childSchema.past) constraints.push(`@past`); + + if (constraints.length) comments.push(...constraints); + + if (comments.length) { + ts.addSyntheticLeadingComment( + propertySignature, + ts.SyntaxKind.MultiLineCommentTrivia, + `*\n * ${comments.join('\n * ')}\n `, + true, + ); + } + + return propertySignature; + }); + return f.createTypeLiteralNode(members); + } + + case 'array': { + const type = schemaToInterface(schema.element); + return f.createArrayTypeNode(type); + } + + case 'record': { + const valueType = schemaToInterface(schema.values as ISchemaAny); + + return f.createTypeLiteralNode([ + f.createIndexSignature( + undefined, + [ + f.createParameterDeclaration( + undefined, + undefined, + f.createIdentifier('x'), + undefined, + f.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + undefined, + ), + ], + valueType, + ), + ]); + } + } + + return f.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword); +} + +const identifierRE = /^[A-Za-z_$][A-Za-z0-9_$]*$/; + +export function getIdentifierOrStringLiteral(str: string): ts.PropertyName { + if (identifierRE.test(str)) { + return f.createIdentifier(str); + } + + return f.createStringLiteral(str); +} + +export function printNode(node: ts.Node, printerOptions?: ts.PrinterOptions): string { + const sourceFile = ts.createSourceFile( + 'print.ts', + '', + ts.ScriptTarget.Latest, + false, + ts.ScriptKind.TS, + ); + const printer = ts.createPrinter( + printerOptions ?? { newLine: ts.NewLineKind.LineFeed }, + ); + return ( + printer + .printNode(ts.EmitHint.Unspecified, node, sourceFile) + // change to 2 spaces + .replace(/^(\s{4})+/gm, match => new Array(match.length / 4 + 1).join(' ')) + ); +} diff --git a/shared/schema/package.dist.json b/shared/schema/package.dist.json new file mode 100644 index 000000000..8315a6fff --- /dev/null +++ b/shared/schema/package.dist.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "typescript": "^4.7.4" + } +} diff --git a/shared/schema/package.json b/shared/schema/package.json index de00bdb16..07d21ada6 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -5,5 +5,8 @@ "license": "MIT", "dependencies": { "moment": "^2.29.4" + }, + "devDependencies": { + "typescript": "^4.7.4" } } diff --git a/shared/schema/test/schemaToInterface.test.ts b/shared/schema/test/schemaToInterface.test.ts new file mode 100644 index 000000000..e7577bf56 --- /dev/null +++ b/shared/schema/test/schemaToInterface.test.ts @@ -0,0 +1,25 @@ +import { number, object, string } from '../index'; +import schemaToInterface, { printNode } from '../lib/schemaToInterface'; + +test('should be able to generate a type', () => { + const schema = object({ + field1: string({ description: 'This is a test', format: 'email' }), + field2: string({ length: 4 }), + field3: string({ optional: true }), + 'field-4': number(), + }); + const ts = schemaToInterface(schema); + expect(printNode(ts)).toBe(`{ + /** + * This is a test + * @format email + */ + field1: string; + /** + * @length 4 + */ + field2: string; + field3?: string; + "field-4": number; +}`); +}); diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts index 942957ffb..a4d3dbf0f 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/databox/DataboxApis.ts @@ -59,7 +59,7 @@ export const DataboxApiSchemas = { computePricePerKb: micronoteTokenValidation.describe( 'The current server price per kilobyte. NOTE: if a server is implementing surge pricing, this amount could vary.', ), - schema: z.any().optional().describe('A schema describing how to interact with this databox'), + schemaInterface: z.string().optional().describe('A schema interface describing input and output for this databox'), }), }, 'Databox.exec': { diff --git a/shared/specification/types/IDataboxManifest.ts b/shared/specification/types/IDataboxManifest.ts index c2f969798..727f3afb5 100644 --- a/shared/specification/types/IDataboxManifest.ts +++ b/shared/specification/types/IDataboxManifest.ts @@ -22,6 +22,7 @@ export const DataboxManifestSchema = z.object({ 'This is not a Databox scripthash (Bech32 encoded hash starting with "scr").', ), scriptEntrypoint: z.string().describe('A relative path from a project root'), + schemaInterface: z.string().optional().describe('A raw typescript schema for this Databox'), coreVersion: z.string().describe('Version of the Databox Core Runtime'), corePlugins: z .record(z.string()) diff --git a/shared/yarn.lock b/shared/yarn.lock index a0055f2e2..773d40d53 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -7126,6 +7126,11 @@ typescript@^4.7.2, typescript@~4.7.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== +typescript@^4.7.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + uglify-js@^3.1.4: version "3.16.2" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.2.tgz#0481e1dbeed343ad1c2ddf3c6d42e89b7a6d4def" From 9e1bf080b15e48c9beb72fca83706c1c63bc73ad Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 24 Oct 2022 13:17:37 -0400 Subject: [PATCH 041/147] =?UTF-8?q?fix(commons):=20don=E2=80=99t=20convert?= =?UTF-8?q?=20env=20bools=20if=20null?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/commons/lib/envUtils.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/shared/commons/lib/envUtils.ts b/shared/commons/lib/envUtils.ts index 5db0c6f4b..c395c9288 100644 --- a/shared/commons/lib/envUtils.ts +++ b/shared/commons/lib/envUtils.ts @@ -72,10 +72,13 @@ export function parseEnvPath(envvar: string, relativeTo?: string): string { return Path.resolve(relativeTo ?? process.cwd(), envvar); } -export function parseEnvBool(envvar: string): boolean { +export function parseEnvBool(envvar: string): boolean | undefined { + if (envvar === null || envvar === undefined) return undefined; if (envvar === '1' || envvar?.toLowerCase() === 'true' || envvar?.toLowerCase() === 'yes') return true; - return false; + if (envvar === '0' || envvar?.toLowerCase() === 'false' || envvar?.toLowerCase() === 'no') { + return false; + } } export function parseEnvBigint(envvar: string): bigint | null { From 6f9300a686c9384d13fbde99847b6b898b7b8b64 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 28 Oct 2022 13:33:54 -0400 Subject: [PATCH 042/147] fix: rename server config to hosts --- shared/commons/config/hosts.ts | 98 +++++++++++++++++++++++++++++++ shared/commons/config/index.ts | 8 +-- shared/commons/config/servers.ts | 83 -------------------------- shared/commons/lib/envUtils.ts | 5 +- shared/specification/package.json | 3 +- 5 files changed, 107 insertions(+), 90 deletions(-) create mode 100644 shared/commons/config/hosts.ts delete mode 100644 shared/commons/config/servers.ts diff --git a/shared/commons/config/hosts.ts b/shared/commons/config/hosts.ts new file mode 100644 index 000000000..cc5564e27 --- /dev/null +++ b/shared/commons/config/hosts.ts @@ -0,0 +1,98 @@ +import * as Fs from 'fs'; +import * as Path from 'path'; +import { getCacheDirectory } from '../lib/dirUtils'; +import { isSemverSatisfied } from '../lib/VersionUtils'; +import { isPortInUse } from '../lib/utils'; + +export default class UlixeeHostsConfig { + public static global = new UlixeeHostsConfig(Path.join(getCacheDirectory(), 'ulixee')); + + public hostByVersion: IUlixeeHostsConfig['hostByVersion'] = {}; + + private get configPath(): string { + return Path.join(this.directoryPath, 'hosts'); + } + + constructor(readonly directoryPath: string) { + if (Fs.existsSync(this.configPath)) { + for (const file of Fs.readdirSync(this.configPath)) { + if (file.endsWith('.json')) { + const versionPath = Path.join(this.configPath, file); + const version = file.replace('.json', ''); + this.hostByVersion[version] = JSON.parse(Fs.readFileSync(versionPath, 'utf8')); + } + } + } else { + Fs.mkdirSync(this.configPath, { recursive: true }); + } + } + + public setVersionHost(version: string, host: string): void { + if (!host) { + delete this.hostByVersion[version]; + } else { + let minerModulePath: string; + try { + minerModulePath = require.resolve('@ulixee/miner'); + } catch (err) { + /* no-op */ + } + this.hostByVersion[version] = { + host, + nodePath: process.execPath, + minerModulePath, + }; + } + this.save(version); + } + + public hasHosts(): boolean { + return Object.keys(this.hostByVersion).length > 0; + } + + public getVersionHost(version: string): string { + if (this.hostByVersion[version]) return this.hostByVersion[version].host; + for (const [hostVersion, info] of Object.entries(this.hostByVersion)) { + if (isSemverSatisfied(version, hostVersion)) { + return info.host; + } + } + return null; + } + + public async checkLocalVersionHost(version: string, host: string): Promise { + if (!host?.startsWith('localhost')) return host; + + if (host?.startsWith('localhost')) { + if (!(await isPortInUse(host.split(':').pop()))) { + this.setVersionHost(version, null); + return null; + } + } + return host; + } + + private save(version: string): void { + const versionPath = Path.join(this.configPath, `${version}.json`); + const host = this.hostByVersion[version]; + if (!host) { + try { + Fs.unlinkSync(versionPath); + } catch (err) {} + } else { + Fs.writeFileSync(versionPath, JSON.stringify(host)); + } + } +} + +export interface IUlixeeHostsConfig { + hostByVersion: { + [version: string]: IUlixeeHostConfig; + }; +} + +export interface IUlixeeHostConfig { + host: string; + nodePath: string; + minerModulePath: string; +} diff --git a/shared/commons/config/index.ts b/shared/commons/config/index.ts index 91713b79a..1f79d7ab1 100644 --- a/shared/commons/config/index.ts +++ b/shared/commons/config/index.ts @@ -18,7 +18,7 @@ export default class UlixeeConfig { private static cachedConfigLocations: { [cwd_entrypoint: string]: string } = {}; private static cachedConfigObjects: { [cwd_entrypoint: string]: UlixeeConfig } = {}; - public serverHost?: string; + public defaultMinerHost?: string; public databoxOutDir?: string; private get configPath(): string { @@ -28,7 +28,7 @@ export default class UlixeeConfig { constructor(readonly directoryPath: string) { if (Fs.existsSync(this.configPath)) { const data = JSON.parse(Fs.readFileSync(this.configPath, 'utf8')); - this.serverHost = data.serverHost; + this.defaultMinerHost = data.serverHost; if (data.databoxOutDir) { this.databoxOutDir = Path.isAbsolute(data.databoxOutDir) ? data.databoxOutDir : Path.resolve(this.directoryPath, data.databoxOutDir); } @@ -41,7 +41,7 @@ export default class UlixeeConfig { private getData(): IUlixeeConfig { return { - serverHost: this.serverHost, + defaultMinerHost: this.defaultMinerHost, databoxOutDir: this.databoxOutDir, }; } @@ -118,7 +118,7 @@ export default class UlixeeConfig { } export interface IUlixeeConfig { - serverHost?: string; + defaultMinerHost?: string; databoxOutDir?: string } diff --git a/shared/commons/config/servers.ts b/shared/commons/config/servers.ts deleted file mode 100644 index e802b9e0d..000000000 --- a/shared/commons/config/servers.ts +++ /dev/null @@ -1,83 +0,0 @@ -import * as Fs from 'fs'; -import * as Path from 'path'; -import { getCacheDirectory } from '../lib/dirUtils'; -import { safeOverwriteFile } from '../lib/fileUtils'; -import { isSemverSatisfied } from '../lib/VersionUtils'; -import { isPortInUse } from '../lib/utils'; - -export default class UlixeeServerConfig { - public static global = new UlixeeServerConfig(Path.join(getCacheDirectory(), 'ulixee')); - - public hostByVersion: IUlixeeServerConfig['hostByVersion'] = {}; - - private get configPath(): string { - return Path.join(this.directoryPath, 'servers.json'); - } - - constructor(readonly directoryPath: string) { - if (Fs.existsSync(this.configPath)) { - const data: IUlixeeServerConfig = JSON.parse(Fs.readFileSync(this.configPath, 'utf8')); - this.hostByVersion = data.hostByVersion ?? {}; - } - } - - public async setVersionHost(version: string, host: string): Promise { - if (!host) delete this.hostByVersion[version]; - else { - let serverModulePath: string; - try { - serverModulePath = require.resolve('@ulixee/server'); - } catch (err) { - /* no-op */ - } - this.hostByVersion[version] = { - host, - nodePath: process.execPath, - serverModulePath, - }; - } - await this.save(); - } - - public hasServers(): boolean { - return Object.keys(this.hostByVersion).length > 0; - } - - public getVersionHost(version: string): string { - if (this.hostByVersion[version]) return this.hostByVersion[version].host; - for (const [hostVersion, info] of Object.entries(this.hostByVersion)) { - if (isSemverSatisfied(version, hostVersion)) { - return info.host; - } - } - return null; - } - - public async checkLocalVersionHost(version: string, host: string): Promise { - if (!host?.startsWith('localhost')) return host; - - if (host?.startsWith('localhost')) { - if (!(await isPortInUse(host.split(':').pop()))) { - await UlixeeServerConfig.global.setVersionHost(version, null); - return null; - } - } - return host; - } - - public save(): Promise { - return safeOverwriteFile(this.configPath, JSON.stringify(this.getData(), null, 2)); - } - - private getData(): IUlixeeServerConfig { - return { - hostByVersion: this.hostByVersion, - }; - } -} - -export interface IUlixeeServerConfig { - hostByVersion: { - [version: string]: { host: string; nodePath: string; serverModulePath: string }; - }; -} diff --git a/shared/commons/lib/envUtils.ts b/shared/commons/lib/envUtils.ts index c395c9288..25e919c94 100644 --- a/shared/commons/lib/envUtils.ts +++ b/shared/commons/lib/envUtils.ts @@ -1,6 +1,7 @@ import * as Fs from 'fs'; import * as Path from 'path'; import * as Os from 'os'; +import { getCacheDirectory } from './dirUtils'; /** * Will load env files with this precedence (.env.defaults, .env., .env) @@ -66,8 +67,10 @@ export function parseEnvInt(envvar: string): number | null { } export function parseEnvPath(envvar: string, relativeTo?: string): string { - if (!envvar) return null; + if (!envvar) return undefined; if (envvar?.startsWith('~')) envvar = Path.join(Os.homedir(), envvar.slice(1)); + if (envvar?.startsWith('')) envvar = envvar.replace('', getCacheDirectory()); + if (envvar?.startsWith('')) envvar = envvar.replace('', Os.tmpdir()); if (Path.isAbsolute(envvar)) return envvar; return Path.resolve(relativeTo ?? process.cwd(), envvar); } diff --git a/shared/specification/package.json b/shared/specification/package.json index e0e1bd65c..609a24b3e 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -5,7 +5,6 @@ "main": "./index.js", "license": "MIT", "dependencies": { - "zod": "^3.17.3", - "@ulixee/schema": "2.0.0-alpha.12" + "zod": "^3.17.3" } } From 08d1890d41b231d8263d9ec35341592cbc421bcf Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 31 Oct 2022 10:07:55 -0400 Subject: [PATCH 043/147] v2.0.0-alpha.13 --- shared/CHANGELOG.md | 19 +++++++++++++++++++ shared/commons/CHANGELOG.md | 17 +++++++++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 8 ++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 12 ++++++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 18 ++++++++++++++++++ shared/specification/package.json | 2 +- 12 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 shared/schema/CHANGELOG.md diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 7c73ed6ef..fd9cc645d 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) + + +### Bug Fixes + +* **commons:** don’t convert env bools if null ([c4b4456](https://github.com/ulixee/shared/commit/c4b4456c550513f7620388f1e08af1f8449f4f8b)) +* rename server config to hosts ([70d4e66](https://github.com/ulixee/shared/commit/70d4e661c1c2a964ffe72b79635cfa40bf12b2c6)) + + +### Features + +* ability to generate schema interface strings ([b1be5c5](https://github.com/ulixee/shared/commit/b1be5c585c19a2d8c101812d8ae5d7b08be9dc0e)) +* schemas ([a3efe35](https://github.com/ulixee/shared/commit/a3efe35cc18319557434bef4239eff52978cb4a1)) +* updated Databox specifications to match changes in ulixee ([869bf9b](https://github.com/ulixee/shared/commit/869bf9baa28c6bb6c55afc30390e52dd74a8dfcc)) + + + + + # [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 77b4b86f3..e66c407fe 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,23 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) + + +### Bug Fixes + +* **commons:** don’t convert env bools if null ([c4b4456](https://github.com/ulixee/shared/commit/c4b4456c550513f7620388f1e08af1f8449f4f8b)) +* rename server config to hosts ([70d4e66](https://github.com/ulixee/shared/commit/70d4e661c1c2a964ffe72b79635cfa40bf12b2c6)) + + +### Features + +* ability to generate schema interface strings ([b1be5c5](https://github.com/ulixee/shared/commit/b1be5c585c19a2d8c101812d8ae5d7b08be9dc0e)) + + + + + # [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) diff --git a/shared/commons/package.json b/shared/commons/package.json index 48083f7d6..03963ef07 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.12", + "version": "2.0.0-alpha.13", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 84eb71c76..0e8832a74 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) + +**Note:** Version bump only for package @ulixee/crypto + + + + + # [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) **Note:** Version bump only for package @ulixee/crypto diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 53f435e6d..9345a2233 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.12", + "version": "2.0.0-alpha.13", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.12", - "@ulixee/crypto": "2.0.0-alpha.12", - "@ulixee/specification": "2.0.0-alpha.12", + "@ulixee/commons": "2.0.0-alpha.13", + "@ulixee/crypto": "2.0.0-alpha.13", + "@ulixee/specification": "2.0.0-alpha.13", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index 43afdbc57..605b0b3ef 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.12", + "version": "2.0.0-alpha.13", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index a01f1ab36..8beef1d32 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) diff --git a/shared/net/package.json b/shared/net/package.json index 31cef9733..c253829e2 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.12", + "version": "2.0.0-alpha.13", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.12", + "@ulixee/commons": "2.0.0-alpha.13", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md new file mode 100644 index 000000000..354d35a1b --- /dev/null +++ b/shared/schema/CHANGELOG.md @@ -0,0 +1,12 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) + + +### Features + +* ability to generate schema interface strings ([b1be5c5](https://github.com/ulixee/shared/commit/b1be5c585c19a2d8c101812d8ae5d7b08be9dc0e)) +* schemas ([a3efe35](https://github.com/ulixee/shared/commit/a3efe35cc18319557434bef4239eff52978cb4a1)) diff --git a/shared/schema/package.json b/shared/schema/package.json index 07d21ada6..95dd8fb4e 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.12", + "version": "2.0.0-alpha.13", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 4cfe5f09a..35e2ab699 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) + + +### Bug Fixes + +* rename server config to hosts ([70d4e66](https://github.com/ulixee/shared/commit/70d4e661c1c2a964ffe72b79635cfa40bf12b2c6)) + + +### Features + +* ability to generate schema interface strings ([b1be5c5](https://github.com/ulixee/shared/commit/b1be5c585c19a2d8c101812d8ae5d7b08be9dc0e)) +* schemas ([a3efe35](https://github.com/ulixee/shared/commit/a3efe35cc18319557434bef4239eff52978cb4a1)) +* updated Databox specifications to match changes in ulixee ([869bf9b](https://github.com/ulixee/shared/commit/869bf9baa28c6bb6c55afc30390e52dd74a8dfcc)) + + + + + # [2.0.0-alpha.12](https://github.com/ulixee/shared/compare/v2.0.0-alpha.11...v2.0.0-alpha.12) (2022-10-03) diff --git a/shared/specification/package.json b/shared/specification/package.json index 609a24b3e..3a496fb16 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.12", + "version": "2.0.0-alpha.13", "description": "", "main": "./index.js", "license": "MIT", From 36fed06366501655df64b4d29109ecc3ca145781 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 2 Nov 2022 10:23:20 -0400 Subject: [PATCH 044/147] feat: change logs to support removal of ubk --- shared/commons/lib/Logger.ts | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index c9e3f20a2..c08f419e2 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -312,29 +312,35 @@ function loadNamespaces(namespaces: string): void { } registerNamespaceMapping((ns, active, skip) => { - if (ns.includes('ubk:*') || ns.includes('ubk*')) { - active.push(/agent\/.*/); - } else if (ns === 'ubk:mitm') { - active.push(/agent[/-]mitm.*/); - } else if (ns === 'ubk') { - active.push(/agent\/.*/); - skip.push(/DevtoolsSessionLogger/, /agent[/-]mitm.*/); - } else if (ns.includes('ubk:devtools') || ns === '*') { - active.push(/DevtoolsSessionLogger/); - } -}); - -registerNamespaceMapping((ns, active) => { - if (ns.includes('ulx:*') || ns.includes('ulx*')) { + if (ns.includes('ulx:*') || ns.includes('ulx*') || ns === '*') { active.push( /^apps[/-]chromealive*/, /hero[/-].*/, + /agent\/.*/, + /plugins\/.*/, /net\/.*/, /databox[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, /ramps[/-].*/, + /DevtoolsSessionLogger/, ); + } else if (ns === 'ulx') { + active.push( + /hero[/-].*/, + /agent\/.*/, + /plugins\/.*/, + /net\/.*/, + /databox[/-].*/, + /mainchain[/-].*/, + /sidechain[/-].*/, + /ramps[/-].*/, + ); + skip.push(/^apps[/-]chromealive*/, /DevtoolsSessionLogger/); + } else if (ns === 'ulx:mitm') { + active.push(/agent[/-]mitm.*/); + } else if (ns.includes('ulx:devtools') || ns === '*') { + active.push(/DevtoolsSessionLogger/); } else if (ns.includes('hero')) { active.push(/^hero[/-].*/, /net\/.*/); } else if (ns.includes('databox')) { From bc9eb472547f8123474381b60727a99d93ba12e6 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 2 Nov 2022 10:23:39 -0400 Subject: [PATCH 045/147] v2.0.0-alpha.14 --- shared/CHANGELOG.md | 11 +++++++++++ shared/commons/CHANGELOG.md | 11 +++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 8 ++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 8 ++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 8 ++++++++ shared/specification/package.json | 2 +- 12 files changed, 64 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index fd9cc645d..71fe7ff51 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) + + +### Features + +* change logs to support removal of ubk ([63a9d64](https://github.com/ulixee/shared/commit/63a9d6404ddcd0a042a6bc439ec07de63a2edfde)) + + + + + # [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index e66c407fe..a43542dbd 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) + + +### Features + +* change logs to support removal of ubk ([63a9d64](https://github.com/ulixee/shared/commit/63a9d6404ddcd0a042a6bc439ec07de63a2edfde)) + + + + + # [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) diff --git a/shared/commons/package.json b/shared/commons/package.json index 03963ef07..ed4c91eaf 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.13", + "version": "2.0.0-alpha.14", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 0e8832a74..32c1b6af9 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) + +**Note:** Version bump only for package @ulixee/crypto + + + + + # [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) **Note:** Version bump only for package @ulixee/crypto diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 9345a2233..0f4315889 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.13", + "version": "2.0.0-alpha.14", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.13", - "@ulixee/crypto": "2.0.0-alpha.13", - "@ulixee/specification": "2.0.0-alpha.13", + "@ulixee/commons": "2.0.0-alpha.14", + "@ulixee/crypto": "2.0.0-alpha.14", + "@ulixee/specification": "2.0.0-alpha.14", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index 605b0b3ef..f53ec0b21 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.13", + "version": "2.0.0-alpha.14", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index 8beef1d32..46e04af3d 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index c253829e2..b8c5d05f9 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.13", + "version": "2.0.0-alpha.14", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.13", + "@ulixee/commons": "2.0.0-alpha.14", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index 354d35a1b..be73118fe 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) + +**Note:** Version bump only for package @ulixee/schema + + + + + # [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) diff --git a/shared/schema/package.json b/shared/schema/package.json index 95dd8fb4e..fa34a7300 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.13", + "version": "2.0.0-alpha.14", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 35e2ab699..d105b11fb 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) + +**Note:** Version bump only for package @ulixee/specification + + + + + # [2.0.0-alpha.13](https://github.com/ulixee/shared/compare/v2.0.0-alpha.12...v2.0.0-alpha.13) (2022-10-31) diff --git a/shared/specification/package.json b/shared/specification/package.json index 3a496fb16..9f6cb9054 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.13", + "version": "2.0.0-alpha.14", "description": "", "main": "./index.js", "license": "MIT", From 053f75e6678a39e3447b2534170abe4959fced96 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 17 Nov 2022 08:47:49 -0500 Subject: [PATCH 046/147] feat: gift card api v2 to support redemption key --- shared/commons/lib/Logger.ts | 11 ++- shared/commons/lib/envUtils.ts | 1 + shared/crypto/lib/Ed25519.ts | 67 +++++++++++++++++++ shared/crypto/lib/Identity.ts | 46 ++++--------- shared/crypto/lib/pkiUtils.ts | 17 ----- shared/crypto/test/Ed25519.test.ts | 18 +++++ shared/specification/common.ts | 10 ++- shared/specification/databox/DataboxApis.ts | 11 +-- .../specification/sidechain/GiftCardApis.ts | 44 +++++++++--- .../specification/types/IDataboxManifest.ts | 6 +- shared/specification/types/IPayment.ts | 15 ++++- 11 files changed, 170 insertions(+), 76 deletions(-) create mode 100644 shared/crypto/lib/Ed25519.ts delete mode 100644 shared/crypto/lib/pkiUtils.ts create mode 100644 shared/crypto/test/Ed25519.test.ts diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index c08f419e2..8121381e2 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -165,9 +165,14 @@ export function translateToPrintable( result.error = value; continue; } - if (key === 'error' && value) { - result.error = new Error((value as any).message); - Object.assign(result.error, value); + if (key === 'error') { + if (typeof value === 'object') { + const { message, ...rest } = value as any; + result.error = new Error(message); + Object.assign(result.error, rest); + } else if (typeof value === 'string') { + result.error = new Error(value as string); + } continue; } diff --git a/shared/commons/lib/envUtils.ts b/shared/commons/lib/envUtils.ts index 25e919c94..d0bfb11b5 100644 --- a/shared/commons/lib/envUtils.ts +++ b/shared/commons/lib/envUtils.ts @@ -17,6 +17,7 @@ export function loadEnv(baseDir: string, overwriteSetValues = false): void { // don't overwrite already set variables for (const [key, value] of Object.entries(env)) { if (process.env[key] && !overwriteSetValues) continue; + if (!value) continue; process.env[key] = value; } } diff --git a/shared/crypto/lib/Ed25519.ts b/shared/crypto/lib/Ed25519.ts new file mode 100644 index 000000000..228977df9 --- /dev/null +++ b/shared/crypto/lib/Ed25519.ts @@ -0,0 +1,67 @@ +import { + createPrivateKey, + createPublicKey, + generateKeyPair, + KeyObject, + KeyPairKeyObjectResult, + sign, + verify, +} from 'crypto'; +import { promisify } from 'util'; + +const ed25519DerPrefix = Buffer.from('302a300506032b6570032100', 'hex'); +const ed25519PrivateDerPrefix = Buffer.from('302e020100300506032b657004220420', 'hex'); +const generateKeyPairAsync = promisify(generateKeyPair); + +export default class Ed25519 { + static getPublicKeyBytes(privateKey: KeyObject): Buffer { + return createPublicKey(privateKey) + .export({ type: 'spki', format: 'der' }) + .slice(ed25519DerPrefix.length); + } + + static getPrivateKeyBytes(key: KeyObject): Buffer { + return key.export({ type: 'pkcs8', format: 'der' }).slice(ed25519PrivateDerPrefix.length); + } + + static createPublicKeyFromBytes(bytes: Buffer): KeyObject { + if (bytes.length !== 32) { + throw new Error( + `Wrong key length (${bytes.length}) provided to createPublicKeyFromBytes. Must be 32 bytes (20 hex chars)`, + ); + } + const keyDer = Buffer.concat([ed25519DerPrefix, bytes]); + + return createPublicKey({ key: keyDer, format: 'der', type: 'spki' }); + } + + static createPrivateKeyFromBytes(bytes: Buffer): KeyObject { + if (bytes.length !== 32) { + throw new Error( + `Wrong key length (${bytes.length}) provided to importPublicKey. Must be 32 bytes (20 hex chars)`, + ); + } + const keyDer = Buffer.concat([ed25519PrivateDerPrefix, bytes]); + + return createPrivateKey({ key: keyDer, format: 'der', type: 'pkcs8' }); + } + + static async create(): Promise { + return await generateKeyPairAsync('ed25519'); + } + + static verify(publicKey: KeyObject, hashedMessage: Buffer, signature: Buffer): Error | boolean { + if (!signature || !signature.length || !hashedMessage || !hashedMessage.length || !publicKey) + return false; + + try { + return verify(null, hashedMessage, publicKey, signature); + } catch (e) { + return e; + } + } + + static sign(keyObject: KeyObject, hashedMessage: Buffer): Buffer { + return sign(null, hashedMessage, keyObject); + } +} diff --git a/shared/crypto/lib/Identity.ts b/shared/crypto/lib/Identity.ts index db6a08caf..69444c21c 100644 --- a/shared/crypto/lib/Identity.ts +++ b/shared/crypto/lib/Identity.ts @@ -1,26 +1,15 @@ import { promises as fs, readFileSync } from 'fs'; import * as path from 'path'; -import { promisify } from 'util'; -import { - createPrivateKey, - generateKeyPair, - generateKeyPairSync, - KeyExportOptions, - KeyObject, - sign, - verify, -} from 'crypto'; +import { createPrivateKey, generateKeyPairSync, KeyExportOptions, KeyObject } from 'crypto'; import { sha3 } from '@ulixee/commons/lib/hashUtils'; import { existsAsync } from '@ulixee/commons/lib/fileUtils'; import Log from '@ulixee/commons/lib/Logger'; import { decodeBuffer, encodeBuffer } from '@ulixee/commons/lib/bufferUtils'; -import { createPublicKeyFromBytes, getPublicKeyBytes } from './pkiUtils'; +import Ed25519 from './Ed25519'; import { UnreadableIdentityError } from './errors'; const { log } = Log(module); -const generateKeyPairAsync = promisify(generateKeyPair); - export default class Identity { public static defaultPkcsCipher = 'aes-256-cbc'; public static encodingPrefix = 'id' as const; @@ -32,7 +21,7 @@ export default class Identity { } public get publicKey(): Buffer { - this.#publicKeyBytes ??= getPublicKeyBytes(this.privateKey); + this.#publicKeyBytes ??= Ed25519.getPublicKeyBytes(this.privateKey); return this.#publicKeyBytes; } @@ -47,7 +36,7 @@ export default class Identity { } public sign(hashedMessage: Buffer): Buffer { - return sign(null, hashedMessage, this.privateKey); + return Ed25519.sign(this.privateKey, hashedMessage); } public equals(identityBech32: string): boolean { @@ -136,30 +125,23 @@ export default class Identity { } public static async create(): Promise { - const key = await generateKeyPairAsync('ed25519'); + const key = await Ed25519.create(); const pair = new Identity(key.privateKey); pair.verifyKeys(); return pair; } public static verify(identityBech32: string, hashedMessage: Buffer, signature: Buffer): boolean { - if ( - !signature || - !signature.length || - !hashedMessage || - !hashedMessage.length || - !identityBech32 - ) - return false; - + if (!identityBech32) return false; const publicKeyBytes = decodeBuffer(identityBech32, this.encodingPrefix); - const publicKey = createPublicKeyFromBytes(publicKeyBytes); - try { - return verify(null, hashedMessage, publicKey, signature); - } catch (err) { - log.error('Error validating signature', err); - return false; - } + const publicKey = Ed25519.createPublicKeyFromBytes(publicKeyBytes); + const isValid = Ed25519.verify(publicKey, hashedMessage, signature); + if (isValid === true) return true; + + log.error('Error validating signature', { + error: (isValid as Error) ?? new Error('Invalid parameters'), + }); + return false; } } diff --git a/shared/crypto/lib/pkiUtils.ts b/shared/crypto/lib/pkiUtils.ts deleted file mode 100644 index 818eeb323..000000000 --- a/shared/crypto/lib/pkiUtils.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { createPublicKey, KeyObject } from 'crypto'; - -const ed25519DerPrefix = Buffer.from('302a300506032b6570032100', 'hex'); -export function getPublicKeyBytes(key: KeyObject): Buffer { - return createPublicKey(key).export({ type: 'spki', format: 'der' }).slice(ed25519DerPrefix.length); -} - -export function createPublicKeyFromBytes(bytes: Buffer): KeyObject { - if (bytes.length !== 32) { - throw new Error( - `Wrong key length (${bytes.length}) provided to importPublicKey. Must be 32 bytes (20 hex chars)`, - ); - } - const keyDer = Buffer.concat([ed25519DerPrefix, bytes]); - - return createPublicKey({ key: keyDer, format: 'der', type: 'spki' }); -} diff --git a/shared/crypto/test/Ed25519.test.ts b/shared/crypto/test/Ed25519.test.ts new file mode 100644 index 000000000..aad90c666 --- /dev/null +++ b/shared/crypto/test/Ed25519.test.ts @@ -0,0 +1,18 @@ +import Ed25519 from '../lib/Ed25519'; + +test('can create and restore public ed25519 key bytes', async () => { + const keys = await Ed25519.create(); + const publicKeyBytes = Ed25519.getPublicKeyBytes(keys.privateKey); + expect(keys.publicKey).toEqual(Ed25519.createPublicKeyFromBytes(publicKeyBytes)); +}); + +test('can create and restore private ed25519 key bytes', async () => { + const keys = await Ed25519.create(); + const privateKeyBytes = Ed25519.getPrivateKeyBytes(keys.privateKey); + const privateKeyString = keys.privateKey.export({ format: 'der', type: 'pkcs8' }).toString('hex'); + const recreatedPk = Ed25519.createPrivateKeyFromBytes(privateKeyBytes); + expect(recreatedPk.export({ format: 'der', type: 'pkcs8' }).toString('hex')).toBe( + privateKeyString, + ); + expect(Ed25519.getPrivateKeyBytes(recreatedPk)).toEqual(privateKeyBytes); +}); diff --git a/shared/specification/common.ts b/shared/specification/common.ts index 8402b7fc4..4dedb5e5a 100644 --- a/shared/specification/common.ts +++ b/shared/specification/common.ts @@ -16,7 +16,15 @@ export const identityValidation = z 'This is not a Ulixee identity (Bech32 encoded hash starting with "id1").', ); -export const giftCardIdValidation = z.string().length(32); +export const giftCardIdValidation = z.string().length(12); + +export const giftCardRemptionKeyValidation = z + .string() + .length(62) + .regex( + /^gft1[ac-hj-np-z02-9]{58}/, + 'This is not a Ulixee gift card redemption key (Bech32 encoded hash starting with "gft1").', + ); export const hashValidation = z .instanceof(Buffer) diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts index a4d3dbf0f..68960f4a6 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/databox/DataboxApis.ts @@ -1,11 +1,6 @@ import { z } from 'zod'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; -import { - addressValidation, - identityValidation, - micronoteTokenValidation, - signatureValidation, -} from '../common'; +import { identityValidation, micronoteTokenValidation, signatureValidation } from '../common'; import { PaymentSchema } from '../types/IPayment'; export const databoxVersionHashValidation = z @@ -52,9 +47,9 @@ export const DataboxApiSchemas = { maxMilliseconds: positiveInt.describe('Max milliseconds spent before response.'), averageTotalPricePerQuery: positiveInt.describe('Average total microgons paid for a query.'), maxPricePerQuery: positiveInt.describe('The largest total microgon price seen.'), - giftCardPaymentAddresses: addressValidation + giftCardIssuerIdentities: identityValidation .array() - .describe('The addresses this databox allows gift card payments for (if any).'), + .describe('The identities this databox allows gift card payments for (if any).'), basePricePerQuery: micronoteTokenValidation.describe('The databox base price per query'), computePricePerKb: micronoteTokenValidation.describe( 'The current server price per kilobyte. NOTE: if a server is implementing surge pricing, this amount could vary.', diff --git a/shared/specification/sidechain/GiftCardApis.ts b/shared/specification/sidechain/GiftCardApis.ts index e4c2be358..8168d3135 100644 --- a/shared/specification/sidechain/GiftCardApis.ts +++ b/shared/specification/sidechain/GiftCardApis.ts @@ -1,13 +1,12 @@ import { z } from 'zod'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; import { - addressValidation, giftCardIdValidation, + giftCardRemptionKeyValidation, identityValidation, micronoteTokenValidation, signatureValidation, } from '../common'; -import { AddressSignatureSchema } from '../types/IAddressSignature'; import { MicronoteBatchSchema } from '../types/IMicronoteBatch'; export const GiftCardApiSchemas = { @@ -15,25 +14,50 @@ export const GiftCardApiSchemas = { args: z.object({ batchSlug: MicronoteBatchSchema.shape.batchSlug, microgons: micronoteTokenValidation, - redeemableWithAddresses: z.array(addressValidation), - redeemableAddressSignatures: z.array(AddressSignatureSchema), + issuerIdentities: z.array(identityValidation), + issuerSignatures: z.array(signatureValidation), }), result: z.object({ giftCardId: giftCardIdValidation, - sidechainIdentity: identityValidation, - sidechainValidationSignature: signatureValidation, + redemptionKey: giftCardRemptionKeyValidation, }), }, - 'GiftCard.claim': { + 'GiftCard.get': { args: z.object({ batchSlug: MicronoteBatchSchema.shape.batchSlug, giftCardId: giftCardIdValidation, - address: addressValidation, }), result: z.object({ - fundsId: z.number().int().positive(), + id: giftCardIdValidation, + balance: micronoteTokenValidation, + issuerIdentities: z.array(identityValidation), + }), + }, + 'GiftCard.createHold': { + args: z.object({ + batchSlug: MicronoteBatchSchema.shape.batchSlug, + giftCardId: giftCardIdValidation, microgons: micronoteTokenValidation, - redeemableWithAddresses: z.array(addressValidation), + signature: signatureValidation.describe('Signature using the redemption key of the GiftCard'), + }), + result: z.object({ + holdId: z.string().length(32), + giftCardBalance: micronoteTokenValidation, + }), + }, + 'GiftCard.settleHold': { + args: z.object({ + batchSlug: MicronoteBatchSchema.shape.batchSlug, + giftCardId: giftCardIdValidation, + holdId: z.string().length(32), + microgons: micronoteTokenValidation.describe( + 'Final microgon total to settle with. NOTE: if this exceeds the available balance, the balance will take available funds.', + ), + }), + result: z.object({ + success: z.boolean(), + microgonsAllowed: micronoteTokenValidation.describe('The microgons settled.'), + giftCardBalance: micronoteTokenValidation, }), }, }; diff --git a/shared/specification/types/IDataboxManifest.ts b/shared/specification/types/IDataboxManifest.ts index 727f3afb5..aa0cc14e0 100644 --- a/shared/specification/types/IDataboxManifest.ts +++ b/shared/specification/types/IDataboxManifest.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { addressValidation, micronoteTokenValidation } from '../common'; +import { addressValidation, identityValidation, micronoteTokenValidation } from '../common'; import { databoxVersionHashValidation } from '../databox/DataboxApis'; const minDate = new Date('2022-01-01').getTime(); @@ -32,9 +32,9 @@ export const DataboxManifestSchema = z.object({ .optional() .describe('Price per query if requiring payment'), paymentAddress: addressValidation.optional(), - giftCardAddress: addressValidation + giftCardIssuerIdentity: identityValidation .optional() - .describe('An address this Databox is accepting gift cards'), + .describe('A gift card issuer identity for this Databox.'), }); export type IVersionHistoryEntry = z.infer< diff --git a/shared/specification/types/IPayment.ts b/shared/specification/types/IPayment.ts index 7d5409bdb..28293b687 100644 --- a/shared/specification/types/IPayment.ts +++ b/shared/specification/types/IPayment.ts @@ -1,6 +1,8 @@ import { z } from 'zod'; import { blockHeightValidation, + giftCardIdValidation, + giftCardRemptionKeyValidation, identityValidation, micronoteIdValidation, micronoteTokenValidation, @@ -8,12 +10,11 @@ import { } from '../common'; import { MicronoteBatchSchema } from './IMicronoteBatch'; -export const PaymentSchema = z.object({ +export const MicronoteSchema = z.object({ microgons: micronoteTokenValidation, micronoteId: micronoteIdValidation, blockHeight: blockHeightValidation, batchSlug: MicronoteBatchSchema.shape.batchSlug, - isGiftCardBatch: z.boolean(), micronoteBatchUrl: z.string().url(), micronoteBatchIdentity: identityValidation, micronoteSignature: signatureValidation, @@ -23,6 +24,16 @@ export const PaymentSchema = z.object({ guaranteeBlockHeight: blockHeightValidation, }); +export const PaymentSchema = z.object({ + micronote: MicronoteSchema.optional(), + giftCard: z + .object({ + id: giftCardIdValidation, + redemptionKey: giftCardRemptionKeyValidation, + }) + .optional(), +}); + type IPayment = z.infer; export default IPayment; From 4da61eb7a110711fee4e6e1a822b6210a5e14631 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 17 Nov 2022 11:11:08 -0500 Subject: [PATCH 047/147] v2.0.0-alpha.15 --- shared/CHANGELOG.md | 11 +++++++++++ shared/commons/CHANGELOG.md | 11 +++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 11 +++++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 8 ++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 11 +++++++++++ shared/specification/package.json | 2 +- 12 files changed, 70 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 71fe7ff51..931d6182b 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) + + +### Features + +* gift card api v2 to support redemption key ([b2f11f4](https://github.com/ulixee/shared/commit/b2f11f44a784adf8dd208db9683c99369f33f98c)) + + + + + # [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index a43542dbd..2bf27f49c 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) + + +### Features + +* gift card api v2 to support redemption key ([b2f11f4](https://github.com/ulixee/shared/commit/b2f11f44a784adf8dd208db9683c99369f33f98c)) + + + + + # [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) diff --git a/shared/commons/package.json b/shared/commons/package.json index ed4c91eaf..9b96283e4 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.14", + "version": "2.0.0-alpha.15", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 32c1b6af9..5251602d6 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) + + +### Features + +* gift card api v2 to support redemption key ([b2f11f4](https://github.com/ulixee/shared/commit/b2f11f44a784adf8dd208db9683c99369f33f98c)) + + + + + # [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) **Note:** Version bump only for package @ulixee/crypto diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 0f4315889..b6fd41374 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.14", + "version": "2.0.0-alpha.15", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.14", - "@ulixee/crypto": "2.0.0-alpha.14", - "@ulixee/specification": "2.0.0-alpha.14", + "@ulixee/commons": "2.0.0-alpha.15", + "@ulixee/crypto": "2.0.0-alpha.15", + "@ulixee/specification": "2.0.0-alpha.15", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index f53ec0b21..a38840e2e 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.14", + "version": "2.0.0-alpha.15", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index 46e04af3d..0634aeb77 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index b8c5d05f9..8819fa224 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.14", + "version": "2.0.0-alpha.15", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.14", + "@ulixee/commons": "2.0.0-alpha.15", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index be73118fe..f4ac81a21 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) + +**Note:** Version bump only for package @ulixee/schema + + + + + # [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) **Note:** Version bump only for package @ulixee/schema diff --git a/shared/schema/package.json b/shared/schema/package.json index fa34a7300..576bf8f6c 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.14", + "version": "2.0.0-alpha.15", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index d105b11fb..18c5e35de 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) + + +### Features + +* gift card api v2 to support redemption key ([b2f11f4](https://github.com/ulixee/shared/commit/b2f11f44a784adf8dd208db9683c99369f33f98c)) + + + + + # [2.0.0-alpha.14](https://github.com/ulixee/shared/compare/v2.0.0-alpha.13...v2.0.0-alpha.14) (2022-11-02) **Note:** Version bump only for package @ulixee/specification diff --git a/shared/specification/package.json b/shared/specification/package.json index 9f6cb9054..1c51bdafc 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.14", + "version": "2.0.0-alpha.15", "description": "", "main": "./index.js", "license": "MIT", From d610a54fb3eb6b2de79afbe9da21a61a307f1443 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 17 Nov 2022 11:11:41 -0500 Subject: [PATCH 048/147] chore: update repo-tools --- shared/package.json | 2 +- shared/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/shared/package.json b/shared/package.json index 9eac6c28a..c1a871932 100644 --- a/shared/package.json +++ b/shared/package.json @@ -23,7 +23,7 @@ "@commitlint/cli": "^12.0.1", "@commitlint/config-conventional": "^12.0.1", "@types/node": "^14.18.18", - "@ulixee/repo-tools": "1.0.11", + "@ulixee/repo-tools": "^1.0.22", "cross-env": "^7.0.3", "@types/jest": "^28.1.0", "jest": "^28.1.0", diff --git a/shared/yarn.lock b/shared/yarn.lock index 773d40d53..40605c06e 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -1914,10 +1914,10 @@ "@typescript-eslint/types" "5.27.1" eslint-visitor-keys "^3.3.0" -"@ulixee/repo-tools@1.0.11": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.11.tgz#57325e26adba2446a50c80c2cc7eddc7513b5c94" - integrity sha512-dphJpK2cX2+stYyx7kYk+gzNQgJr38R4SaU0ztZNpOQoj/1LmMyJrzni6wE5zgv2a1Qeh5ZzXxYvz3hnkspyfQ== +"@ulixee/repo-tools@^1.0.22": + version "1.0.22" + resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.22.tgz#b906737cf464b5fc3ea0be5b2c958e0fedb76921" + integrity sha512-Qgocpy/bOCFfr5rIjAY+AHOonif/FgGcOuXUWpe8ucB402ujnIs/woyVzmj3INbu0K0fAop+sJcNvNkx4QhZew== dependencies: "@typescript-eslint/eslint-plugin" "^5.27.1" "@typescript-eslint/parser" "^5.27.1" From 94994bd6707fa06876b8d8062dde2c69e8b3e358 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 23 Nov 2022 13:52:54 -0500 Subject: [PATCH 049/147] feat: allow manual shutdown --- shared/commons/lib/ShutdownHandler.ts | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/shared/commons/lib/ShutdownHandler.ts b/shared/commons/lib/ShutdownHandler.ts index 12cf90de3..324b8c4dc 100644 --- a/shared/commons/lib/ShutdownHandler.ts +++ b/shared/commons/lib/ShutdownHandler.ts @@ -7,20 +7,30 @@ const { log } = logger(module); export default class ShutdownHandler { public static exitOnSignal = false; + public static disableSignals = false; private static isRegistered = false; private static hasRunHandlers = false; private static readonly onShutdownFns: { - fn: (signal?: ShutdownSignal) => Promise | void; + fn: (signal?: ShutdownSignal) => Promise | any; callsite: string; }[] = []; - public static register(onShutdownFn: (signal?: ShutdownSignal) => Promise | void): void { + public static register(onShutdownFn: (signal?: ShutdownSignal) => Promise | any): void { this.registerSignals(); const callsite = new Error().stack.split(/\r?\n/).slice(2, 3).shift().trim(); this.onShutdownFns.push({ fn: onShutdownFn, callsite }); } + public static unregister(onShutdownFn: (signal?: ShutdownSignal) => Promise | any): void { + const match = this.onShutdownFns.findIndex(x => x.fn === onShutdownFn); + if (match >= 0) this.onShutdownFns.splice(match, 1); + } + + public static run(): Promise { + return this.onSignal('exit', null, true); + } + private static registerSignals(): void { if (!this.isRegistered) { this.isRegistered = true; @@ -32,9 +42,15 @@ export default class ShutdownHandler { } } - private static async onSignal(signal: ShutdownSignal, code?: number): Promise { + private static async onSignal( + signal: ShutdownSignal, + code?: number, + isManual = false, + ): Promise { + if (this.disableSignals && !isManual) return; if (this.hasRunHandlers) return; this.hasRunHandlers = true; + const parentLogId = log.stats('ShutdownHandler.onSignal', { signal, sessionId: null, From fea25820f6ed4f5f688fb517779aed520646f7d6 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 22 Nov 2022 15:54:29 -0500 Subject: [PATCH 050/147] feat: add databox functions --- shared/specification/databox/DataboxApis.ts | 38 +++++++++++++------ .../specification/types/IDataboxManifest.ts | 24 +++++++----- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts index 68960f4a6..6da24f738 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/databox/DataboxApis.ts @@ -41,26 +41,39 @@ export const DataboxApiSchemas = { latestVersionHash: databoxVersionHashValidation.describe( 'The latest version hash of this databox', ), - averageBytesPerQuery: positiveInt.describe('Average bytes of output returned per query.'), - maxBytesPerQuery: positiveInt.describe('The largest byte count seen.'), - averageMilliseconds: positiveInt.describe('Average milliseconds spent before response.'), - maxMilliseconds: positiveInt.describe('Max milliseconds spent before response.'), - averageTotalPricePerQuery: positiveInt.describe('Average total microgons paid for a query.'), - maxPricePerQuery: positiveInt.describe('The largest total microgon price seen.'), - giftCardIssuerIdentities: identityValidation - .array() - .describe('The identities this databox allows gift card payments for (if any).'), - basePricePerQuery: micronoteTokenValidation.describe('The databox base price per query'), + functionsByName: z.record( + z.string().describe('The name of a function'), + z.object({ + averageBytesPerQuery: positiveInt.describe('Average bytes of output returned per query.'), + maxBytesPerQuery: positiveInt.describe('The largest byte count seen.'), + averageMilliseconds: positiveInt.describe('Average milliseconds spent before response.'), + maxMilliseconds: positiveInt.describe('Max milliseconds spent before response.'), + averageTotalPricePerQuery: positiveInt.describe( + 'Average total microgons paid for a query.', + ), + maxPricePerQuery: positiveInt.describe('The largest total microgon price seen.'), + basePricePerQuery: micronoteTokenValidation.describe( + 'The function base price per query.', + ), + }), + ), computePricePerKb: micronoteTokenValidation.describe( 'The current server price per kilobyte. NOTE: if a server is implementing surge pricing, this amount could vary.', ), - schemaInterface: z.string().optional().describe('A schema interface describing input and output for this databox'), + schemaInterface: z + .string() + .optional() + .describe('A Typescript interface describing Function inputs and outputs this Databox.'), + giftCardIssuerIdentities: identityValidation + .array() + .describe('The identities this databox allows gift card payments for (if any).'), }), }, 'Databox.exec': { args: z.object({ + functionName: z.string().default('default').describe('The function to execute'), versionHash: databoxVersionHashValidation.describe('The hash of this unique databox version'), - input: z.any().optional().describe('Optional input parameters for your databox'), + input: z.any().optional().describe('Optional input parameters for this function call'), payment: PaymentSchema.optional().describe( 'Payment for this request created with an approved Ulixee Sidechain.', ), @@ -87,6 +100,7 @@ export const DataboxApiSchemas = { }, 'Databox.execLocalScript': { args: z.object({ + functionName: z.string().describe('The function to execute').default('default'), scriptPath: z .string() .describe('A path to a local script to run. NOTE: API only enabled in development.'), diff --git a/shared/specification/types/IDataboxManifest.ts b/shared/specification/types/IDataboxManifest.ts index aa0cc14e0..c98b17f3f 100644 --- a/shared/specification/types/IDataboxManifest.ts +++ b/shared/specification/types/IDataboxManifest.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { addressValidation, identityValidation, micronoteTokenValidation } from '../common'; +import { addressValidation, identityValidation } from '../common'; import { databoxVersionHashValidation } from '../databox/DataboxApis'; const minDate = new Date('2022-01-01').getTime(); @@ -22,15 +22,21 @@ export const DataboxManifestSchema = z.object({ 'This is not a Databox scripthash (Bech32 encoded hash starting with "scr").', ), scriptEntrypoint: z.string().describe('A relative path from a project root'), - schemaInterface: z.string().optional().describe('A raw typescript schema for this Databox'), coreVersion: z.string().describe('Version of the Databox Core Runtime'), - corePlugins: z - .record(z.string()) - .optional() - .describe('plugin dependencies required for execution'), - pricePerQuery: micronoteTokenValidation - .optional() - .describe('Price per query if requiring payment'), + schemaInterface: z.string().optional().describe('The raw typescript schema for this Databox'), + functionsByName: z.record( + z.string().describe('The Function name'), + z.object({ + corePlugins: z + .record(z.string()) + .optional() + .describe('plugin dependencies required for execution'), + pricePerQuery: z.number().int() + .nonnegative() + .optional() + .describe('Price per query if requiring payment'), + }), + ), paymentAddress: addressValidation.optional(), giftCardIssuerIdentity: identityValidation .optional() From 8b45e5bdd3ecbe9f70fb6cf3c97aea6cabb29eab Mon Sep 17 00:00:00 2001 From: Caleb Clark Date: Fri, 18 Nov 2022 16:48:11 -0600 Subject: [PATCH 051/147] feat: added table endpoints --- shared/net/lib/ConnectionToCore.ts | 22 +++---- shared/specification/databox/DataboxApis.ts | 67 +++++++++++++++++++++ 2 files changed, 78 insertions(+), 11 deletions(-) diff --git a/shared/net/lib/ConnectionToCore.ts b/shared/net/lib/ConnectionToCore.ts index 2f43f0cea..310184f4b 100644 --- a/shared/net/lib/ConnectionToCore.ts +++ b/shared/net/lib/ConnectionToCore.ts @@ -23,9 +23,9 @@ export interface IConnectionToCoreEvents { event: ICoreEventPayload; } export default class ConnectionToCore< - ICoreApiHandlers extends IApiHandlers, - IEventSpec, -> extends TypedEventEmitter> { + TCoreApiHandlers extends IApiHandlers, + TEventSpec, +> extends TypedEventEmitter> { public connectPromise: IResolvablePromise; public disconnectPromise: Promise; @@ -47,7 +47,7 @@ export default class ConnectionToCore< protected disconnectMessageId: string; protected pendingMessages = new PendingMessages< - ICoreResponsePayload['data'] + ICoreResponsePayload['data'] >(); protected isConnectionTerminated: boolean; @@ -56,7 +56,7 @@ export default class ConnectionToCore< private isSendingConnect = false; private isSendingDisconnect = false; - constructor(public transport: ITransportToCore) { + constructor(public transport: ITransportToCore) { super(); bindFunctions(this); this.events.once(transport, 'disconnected', this.onConnectionTerminated.bind(this)); @@ -134,15 +134,15 @@ export default class ConnectionToCore< return this.disconnectPromise; } - public async sendRequest( + public async sendRequest( payload: { command: T; - args: IApiSpec[T]['args']; + args: IApiSpec[T]['args']; commandId?: number; startTime?: IUnixTime; }, timeoutMs?: number, - ): Promise['data']> { + ): Promise['data']> { const isConnect = this.isSendingConnect; const isDisconnect = this.isSendingDisconnect; if (!isConnect && !isDisconnect) { @@ -161,7 +161,7 @@ export default class ConnectionToCore< ...payload, messageId: id, sendTime: Date.now(), - } as ICoreRequestPayload), + } as ICoreRequestPayload), ]); return result; } catch (error) { @@ -184,7 +184,7 @@ export default class ConnectionToCore< } protected onMessage( - payload: ICoreResponsePayload | ICoreEventPayload, + payload: ICoreResponsePayload | ICoreEventPayload, ): void { if ('responseId' in payload) { this.onResponse(payload); @@ -214,7 +214,7 @@ export default class ConnectionToCore< } } - protected onEvent(event: ICoreEventPayload): void { + protected onEvent(event: ICoreEventPayload): void { this.emit('event', event); } diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts index 6da24f738..f11217775 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/databox/DataboxApis.ts @@ -112,6 +112,73 @@ export const DataboxApiSchemas = { error: z.any().optional(), }), }, + 'Databox.createInMemoryTable': { + args: z.object({ + name: z.string(), + schema: z.any({}), + seedlings: z.any({}).optional(), + databoxInstanceId: z.string(), + }), + result: z.object({}), + }, + 'Databox.createInMemoryFunction': { + args: z.object({ + name: z.string(), + schema: z.any({}), + databoxInstanceId: z.string(), + }), + result: z.object({}), + }, + 'Databox.queryInternalTable': { + args: z.object({ + name: z.string(), + sql: z.string(), + boundValues: z.any({}).optional(), + databoxVersionHash: z.string().optional(), + databoxInstanceId: z.string().optional(), + }), + result: z.any({}), + }, + 'Databox.queryInternalFunctionSetup': { + args: z.object({ + name: z.string(), + sql: z.string(), + boundValues: z.any({}).optional(), + databoxVersionHash: z.string().optional(), + databoxInstanceId: z.string().optional(), + }), + result: z.any({}), + }, + 'Databox.queryInternalFunction': { + args: z.object({ + name: z.string(), + sql: z.string(), + boundValues: z.any({}).optional(), + functionRecords: z.array(z.any({})), + databoxVersionHash: z.string().optional(), + databoxInstanceId: z.string().optional(), + }), + result: z.any({}), + }, + 'Databox.queryInternalSetup': { + args: z.object({ + sql: z.string(), + boundValues: z.any({}).optional(), + databoxVersionHash: z.string().optional(), + databoxInstanceId: z.string().optional(), + }), + result: z.any({}), + }, + 'Databox.queryInternal': { + args: z.object({ + sql: z.string(), + boundValues: z.any({}).optional(), + functionRecordsByName: z.record(z.array(z.any({}))), + databoxVersionHash: z.string().optional(), + databoxInstanceId: z.string().optional(), + }), + result: z.any({}), + }, }; type IDataboxApiTypes = IZodSchemaToApiTypes; From e350a0bced3965876e2c272b280938ad03445689 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 5 Dec 2022 13:41:56 -0500 Subject: [PATCH 052/147] v2.0.0-alpha.16 --- shared/CHANGELOG.md | 12 ++++++++++++ shared/commons/CHANGELOG.md | 11 +++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 8 ++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 8 ++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 11 +++++++++++ shared/specification/package.json | 2 +- 12 files changed, 68 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 931d6182b..5a47ea36c 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) + + +### Features + +* add databox functions ([4577be8](https://github.com/ulixee/shared/commit/4577be8ca3d1adf887659bf57cbf8a48c5d39b14)) +* allow manual shutdown ([41c9ebb](https://github.com/ulixee/shared/commit/41c9ebbd8b4b255502ed957927f0db2c9ca5c366)) + + + + + # [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 2bf27f49c..02e1e6e68 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) + + +### Features + +* allow manual shutdown ([41c9ebb](https://github.com/ulixee/shared/commit/41c9ebbd8b4b255502ed957927f0db2c9ca5c366)) + + + + + # [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) diff --git a/shared/commons/package.json b/shared/commons/package.json index 9b96283e4..93d8b2edf 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.15", + "version": "2.0.0-alpha.16", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 5251602d6..6812c7b12 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) + +**Note:** Version bump only for package @ulixee/crypto + + + + + # [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) diff --git a/shared/crypto/package.json b/shared/crypto/package.json index b6fd41374..1f190254b 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.15", + "version": "2.0.0-alpha.16", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.15", - "@ulixee/crypto": "2.0.0-alpha.15", - "@ulixee/specification": "2.0.0-alpha.15", + "@ulixee/commons": "2.0.0-alpha.16", + "@ulixee/crypto": "2.0.0-alpha.16", + "@ulixee/specification": "2.0.0-alpha.16", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index a38840e2e..e6a9d483a 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.15", + "version": "2.0.0-alpha.16", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index 0634aeb77..53c992b9a 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index 8819fa224..30e7df78d 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.15", + "version": "2.0.0-alpha.16", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.15", + "@ulixee/commons": "2.0.0-alpha.16", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index f4ac81a21..1c8eddf10 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) + +**Note:** Version bump only for package @ulixee/schema + + + + + # [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) **Note:** Version bump only for package @ulixee/schema diff --git a/shared/schema/package.json b/shared/schema/package.json index 576bf8f6c..d9990d54e 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.15", + "version": "2.0.0-alpha.16", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 18c5e35de..7f133070e 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) + + +### Features + +* add databox functions ([4577be8](https://github.com/ulixee/shared/commit/4577be8ca3d1adf887659bf57cbf8a48c5d39b14)) + + + + + # [2.0.0-alpha.15](https://github.com/ulixee/shared/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2022-11-17) diff --git a/shared/specification/package.json b/shared/specification/package.json index 1c51bdafc..ac3890750 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.15", + "version": "2.0.0-alpha.16", "description": "", "main": "./index.js", "license": "MIT", From 8c48ee8bef7dd42930a4b423d0781e6d40d7a64b Mon Sep 17 00:00:00 2001 From: Caleb Clark Date: Tue, 13 Dec 2022 07:30:35 -0600 Subject: [PATCH 053/147] feat: converted Databox.exec into Databox.query + cleaned up other Databox endpoints --- shared/specification/databox/DataboxApis.ts | 37 ++++++--------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts index f11217775..771f0804e 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/databox/DataboxApis.ts @@ -69,11 +69,11 @@ export const DataboxApiSchemas = { .describe('The identities this databox allows gift card payments for (if any).'), }), }, - 'Databox.exec': { + 'Databox.query': { args: z.object({ - functionName: z.string().default('default').describe('The function to execute'), + sql: z.string().describe('The SQL command(s) you want to run'), + boundValues: z.array(z.any()).optional().describe('An array of values you want to use as bound parameters'), versionHash: databoxVersionHashValidation.describe('The hash of this unique databox version'), - input: z.any().optional().describe('Optional input parameters for this function call'), payment: PaymentSchema.optional().describe( 'Payment for this request created with an approved Ulixee Sidechain.', ), @@ -98,13 +98,13 @@ export const DataboxApiSchemas = { .optional(), }), }, - 'Databox.execLocalScript': { + 'Databox.queryLocalScript': { args: z.object({ - functionName: z.string().describe('The function to execute').default('default'), + sql: z.string().describe('The SQL command(s) you want to run'), + boundValues: z.array(z.any()).optional().describe('An array of values you want to use as bound parameters'), scriptPath: z .string() .describe('A path to a local script to run. NOTE: API only enabled in development.'), - input: z.any().optional().describe('Optional input parameters for your databox'), }), result: z.object({ latestVersionHash: databoxVersionHashValidation, @@ -139,31 +139,13 @@ export const DataboxApiSchemas = { }), result: z.any({}), }, - 'Databox.queryInternalFunctionSetup': { - args: z.object({ - name: z.string(), - sql: z.string(), - boundValues: z.any({}).optional(), - databoxVersionHash: z.string().optional(), - databoxInstanceId: z.string().optional(), - }), - result: z.any({}), - }, 'Databox.queryInternalFunction': { args: z.object({ name: z.string(), sql: z.string(), boundValues: z.any({}).optional(), - functionRecords: z.array(z.any({})), - databoxVersionHash: z.string().optional(), - databoxInstanceId: z.string().optional(), - }), - result: z.any({}), - }, - 'Databox.queryInternalSetup': { - args: z.object({ - sql: z.string(), - boundValues: z.any({}).optional(), + input: z.any({}).optional(), + output: z.array(z.any({})), databoxVersionHash: z.string().optional(), databoxInstanceId: z.string().optional(), }), @@ -173,7 +155,8 @@ export const DataboxApiSchemas = { args: z.object({ sql: z.string(), boundValues: z.any({}).optional(), - functionRecordsByName: z.record(z.array(z.any({}))), + inputByFunctionName: z.record(z.any()), + outputByFunctionName: z.record(z.array(z.any({}))), databoxVersionHash: z.string().optional(), databoxInstanceId: z.string().optional(), }), From 1dbbc17c426ca5ff994475725decd0fe5efcd722 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 8 Dec 2022 11:42:05 -0500 Subject: [PATCH 054/147] feat: micronote apis conversion to hold/settle --- shared/commons/config/index.ts | 4 -- shared/commons/lib/TypeSerializer.ts | 5 +- shared/commons/lib/errors.ts | 4 +- shared/crypto/lib/Identity.ts | 8 ++- shared/specification/common.ts | 8 +++ shared/specification/databox/DataboxApis.ts | 70 +++++++++++-------- .../specification/sidechain/GiftCardApis.ts | 4 +- .../specification/sidechain/MicronoteApis.ts | 39 ++++++++--- .../sidechain/MicronoteBatchApis.ts | 4 +- .../types/IDataboxFunctionPricing.ts | 27 +++++++ .../specification/types/IDataboxManifest.ts | 18 +++-- shared/specification/types/IPayment.ts | 9 ++- 12 files changed, 142 insertions(+), 58 deletions(-) create mode 100644 shared/specification/types/IDataboxFunctionPricing.ts diff --git a/shared/commons/config/index.ts b/shared/commons/config/index.ts index 1f79d7ab1..0b6275d68 100644 --- a/shared/commons/config/index.ts +++ b/shared/commons/config/index.ts @@ -18,7 +18,6 @@ export default class UlixeeConfig { private static cachedConfigLocations: { [cwd_entrypoint: string]: string } = {}; private static cachedConfigObjects: { [cwd_entrypoint: string]: UlixeeConfig } = {}; - public defaultMinerHost?: string; public databoxOutDir?: string; private get configPath(): string { @@ -28,7 +27,6 @@ export default class UlixeeConfig { constructor(readonly directoryPath: string) { if (Fs.existsSync(this.configPath)) { const data = JSON.parse(Fs.readFileSync(this.configPath, 'utf8')); - this.defaultMinerHost = data.serverHost; if (data.databoxOutDir) { this.databoxOutDir = Path.isAbsolute(data.databoxOutDir) ? data.databoxOutDir : Path.resolve(this.directoryPath, data.databoxOutDir); } @@ -41,7 +39,6 @@ export default class UlixeeConfig { private getData(): IUlixeeConfig { return { - defaultMinerHost: this.defaultMinerHost, databoxOutDir: this.databoxOutDir, }; } @@ -118,7 +115,6 @@ export default class UlixeeConfig { } export interface IUlixeeConfig { - defaultMinerHost?: string; databoxOutDir?: string } diff --git a/shared/commons/lib/TypeSerializer.ts b/shared/commons/lib/TypeSerializer.ts index 12eb5ac0b..4d1c4234d 100644 --- a/shared/commons/lib/TypeSerializer.ts +++ b/shared/commons/lib/TypeSerializer.ts @@ -241,7 +241,8 @@ export default class TypeSerializer { const startStack = new Error('').stack.slice(8); // "Error: \n" is 8 chars - const e = new Constructor(message); + const e = new Constructor(); + e.message = message; e.name = name; Object.assign(e, extras); if (stack) { @@ -255,7 +256,7 @@ export default class TypeSerializer { } export function registerSerializableErrorType(errorConstructor: { - new (message?: string): Error; + new (...args: any[]): Error; }): void { TypeSerializer.errorTypes.set(errorConstructor.name, errorConstructor); } diff --git a/shared/commons/lib/errors.ts b/shared/commons/lib/errors.ts index a80457f07..013e1b5dd 100644 --- a/shared/commons/lib/errors.ts +++ b/shared/commons/lib/errors.ts @@ -1,6 +1,6 @@ // eslint-disable-next-line max-classes-per-file class UlixeeError extends Error { - constructor(override readonly message, readonly code, protected data?: object) { + constructor(override message, public code, public data?: object) { // Calling parent constructor of base Error class. super(message); @@ -24,7 +24,7 @@ class UlixeeError extends Error { } class APIError extends UlixeeError { - constructor(readonly status, json) { + constructor(public status, json) { super(json.message || 'Unexpected error', json.code, json); } } diff --git a/shared/crypto/lib/Identity.ts b/shared/crypto/lib/Identity.ts index 69444c21c..995c12093 100644 --- a/shared/crypto/lib/Identity.ts +++ b/shared/crypto/lib/Identity.ts @@ -139,9 +139,11 @@ export default class Identity { const isValid = Ed25519.verify(publicKey, hashedMessage, signature); if (isValid === true) return true; - log.error('Error validating signature', { - error: (isValid as Error) ?? new Error('Invalid parameters'), - }); + if (isValid instanceof Error) { + log.error('Error validating signature', { + error: isValid, + }); + } return false; } } diff --git a/shared/specification/common.ts b/shared/specification/common.ts index 4dedb5e5a..a5338201c 100644 --- a/shared/specification/common.ts +++ b/shared/specification/common.ts @@ -49,3 +49,11 @@ export const micronoteIdValidation = z export const centagonTokenValidation = z.bigint().refine(x => x > 0n); export const micronoteTokenValidation = z.number().int().positive(); + +export const databoxVersionHashValidation = z + .string() + .length(62) + .regex( + /^dbx1[ac-hj-np-z02-9]{58}/, + 'This is not a Databox versionHash (Bech32 encoded hash starting with "dbx1").', + ); diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts index 771f0804e..d9d53030b 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/databox/DataboxApis.ts @@ -1,15 +1,13 @@ import { z } from 'zod'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; -import { identityValidation, micronoteTokenValidation, signatureValidation } from '../common'; +import { + databoxVersionHashValidation, + identityValidation, + micronoteTokenValidation, + signatureValidation, +} from '../common'; import { PaymentSchema } from '../types/IPayment'; - -export const databoxVersionHashValidation = z - .string() - .length(62) - .regex( - /^dbx1[ac-hj-np-z02-9]{58}/, - 'This is not a Databox versionHash (Bech32 encoded hash starting with "dbx1").', - ); +import { DataboxFunctionPricing } from '../types/IDataboxFunctionPricing'; const positiveInt = z.number().int().positive(); @@ -44,21 +42,30 @@ export const DataboxApiSchemas = { functionsByName: z.record( z.string().describe('The name of a function'), z.object({ - averageBytesPerQuery: positiveInt.describe('Average bytes of output returned per query.'), - maxBytesPerQuery: positiveInt.describe('The largest byte count seen.'), - averageMilliseconds: positiveInt.describe('Average milliseconds spent before response.'), - maxMilliseconds: positiveInt.describe('Max milliseconds spent before response.'), - averageTotalPricePerQuery: positiveInt.describe( - 'Average total microgons paid for a query.', - ), - maxPricePerQuery: positiveInt.describe('The largest total microgon price seen.'), - basePricePerQuery: micronoteTokenValidation.describe( - 'The function base price per query.', + stats: z.object({ + averageBytesPerQuery: positiveInt.describe( + 'Average bytes of output returned per query.', + ), + maxBytesPerQuery: positiveInt.describe('The largest byte count seen.'), + averageMilliseconds: positiveInt.describe( + 'Average milliseconds spent before response.', + ), + maxMilliseconds: positiveInt.describe('Max milliseconds spent before response.'), + averageTotalPricePerQuery: positiveInt.describe( + 'Average total microgons paid for a query.', + ), + maxPricePerQuery: positiveInt.describe('The largest total microgon price seen.'), + }), + + pricePerQuery: micronoteTokenValidation.describe('The function base price per query.'), + minimumPrice: micronoteTokenValidation.describe( + 'Minimum microgons that must be allocated for a query to be accepted.', ), + priceBreakdown: DataboxFunctionPricing.array(), }), ), - computePricePerKb: micronoteTokenValidation.describe( - 'The current server price per kilobyte. NOTE: if a server is implementing surge pricing, this amount could vary.', + computePricePerQuery: micronoteTokenValidation.describe( + 'The current server price per query. NOTE: if a server is implementing surge pricing, this amount could vary.', ), schemaInterface: z .string() @@ -77,10 +84,17 @@ export const DataboxApiSchemas = { payment: PaymentSchema.optional().describe( 'Payment for this request created with an approved Ulixee Sidechain.', ), + authentication: z + .object({ + identity: identityValidation, + signature: signatureValidation, + nonce: z.string().length(10).describe('A random nonce adding signature noise.'), + }) + .optional(), pricingPreferences: z .object({ - maxComputePricePerKb: micronoteTokenValidation.describe( - 'Maximum price to pay for compute costs per kilobyte (NOTE: This only applies to Servers implementing surge pricing).', + maxComputePricePerQuery: micronoteTokenValidation.describe( + 'Maximum price to pay for compute costs per query (NOTE: This only applies to Servers implementing surge pricing).', ), }) .optional(), @@ -118,7 +132,7 @@ export const DataboxApiSchemas = { schema: z.any({}), seedlings: z.any({}).optional(), databoxInstanceId: z.string(), - }), + }), result: z.object({}), }, 'Databox.createInMemoryFunction': { @@ -126,7 +140,7 @@ export const DataboxApiSchemas = { name: z.string(), schema: z.any({}), databoxInstanceId: z.string(), - }), + }), result: z.object({}), }, 'Databox.queryInternalTable': { @@ -136,7 +150,7 @@ export const DataboxApiSchemas = { boundValues: z.any({}).optional(), databoxVersionHash: z.string().optional(), databoxInstanceId: z.string().optional(), - }), + }), result: z.any({}), }, 'Databox.queryInternalFunction': { @@ -148,7 +162,7 @@ export const DataboxApiSchemas = { output: z.array(z.any({})), databoxVersionHash: z.string().optional(), databoxInstanceId: z.string().optional(), - }), + }), result: z.any({}), }, 'Databox.queryInternal': { @@ -159,7 +173,7 @@ export const DataboxApiSchemas = { outputByFunctionName: z.record(z.array(z.any({}))), databoxVersionHash: z.string().optional(), databoxInstanceId: z.string().optional(), - }), + }), result: z.any({}), }, }; diff --git a/shared/specification/sidechain/GiftCardApis.ts b/shared/specification/sidechain/GiftCardApis.ts index 8168d3135..303c439ae 100644 --- a/shared/specification/sidechain/GiftCardApis.ts +++ b/shared/specification/sidechain/GiftCardApis.ts @@ -42,7 +42,7 @@ export const GiftCardApiSchemas = { }), result: z.object({ holdId: z.string().length(32), - giftCardBalance: micronoteTokenValidation, + remainingBalance: micronoteTokenValidation, }), }, 'GiftCard.settleHold': { @@ -57,7 +57,7 @@ export const GiftCardApiSchemas = { result: z.object({ success: z.boolean(), microgonsAllowed: micronoteTokenValidation.describe('The microgons settled.'), - giftCardBalance: micronoteTokenValidation, + remainingBalance: micronoteTokenValidation, }), }, }; diff --git a/shared/specification/sidechain/MicronoteApis.ts b/shared/specification/sidechain/MicronoteApis.ts index 086f80451..cb240758d 100644 --- a/shared/specification/sidechain/MicronoteApis.ts +++ b/shared/specification/sidechain/MicronoteApis.ts @@ -18,7 +18,7 @@ export const MicronoteApiSchemas = { batchSlug: MicronoteBatchSchema.shape.batchSlug, address: addressValidation, microgons: micronoteTokenValidation.lte(1000e6), // $1000 max = 1000*1M microgon max - fundsId: z.number().int().positive().optional(), + fundsId: z.string().length(30).optional(), signature: AddressSignatureSchema, isAuditable: z.boolean().optional(), }), @@ -26,38 +26,61 @@ export const MicronoteApiSchemas = { id: micronoteIdValidation, micronoteSignature: signatureValidation, blockHeight: blockHeightValidation, - fundsId: z.number().int().positive(), + fundsId: z.string().length(30), guaranteeBlockHeight: blockHeightValidation, fundMicrogonsRemaining: micronoteTokenValidation, }), }, - 'Micronote.lock': { + 'Micronote.hold': { args: z.object({ batchSlug: MicronoteBatchSchema.shape.batchSlug, id: micronoteIdValidation, identity: identityValidation, signature: signatureValidation, - addresses: addressValidation - .array() + microgons: micronoteTokenValidation.describe('Number of microgons to put on hold.'), + holdAuthorizationCode: z + .string() + .length(16) .optional() - .describe('Optional list of addresses to ensure can be paid with this Micronote'), + .describe('Authorization code provided to hold funds.'), }), result: z.object({ + holdAuthorizationCode: z + .string() + .length(16) + .optional() + .describe( + 'An authorization code that can be used to claim funds against a Micronote. Only returned to the first claimer.', + ), + holdId: z + .string() + .length(30) + .optional() + .describe('A holdId to settle. If insufficient funds, this value will not be returned.'), accepted: z.boolean(), + remainingBalance: micronoteTokenValidation.describe( + 'Number of microgons remaining on this miconote.', + ), currentBlockHeight: blockHeightValidation, currentBlockHash: hashValidation, }), }, - 'Micronote.claim': { + 'Micronote.settle': { args: z.object({ batchSlug: MicronoteBatchSchema.shape.batchSlug, id: micronoteIdValidation, identity: identityValidation, tokenAllocation: z.record(addressValidation, micronoteTokenValidation), signature: signatureValidation, + holdId: z + .string() + .length(30) + .optional() + .describe('A hold id that will settle funds allocated in a hold.'), + isFinal: z.boolean().describe('Should this call finalize the Micronote and return change.'), }), result: z.object({ - finalCost: z.number().nonnegative().int(), + finalCost: z.number().nonnegative().int().optional(), }), }, }; diff --git a/shared/specification/sidechain/MicronoteBatchApis.ts b/shared/specification/sidechain/MicronoteBatchApis.ts index bb1f1b8b5..6602790c5 100644 --- a/shared/specification/sidechain/MicronoteBatchApis.ts +++ b/shared/specification/sidechain/MicronoteBatchApis.ts @@ -4,7 +4,7 @@ import { NoteSchema } from '../types/INote'; import { addressValidation, micronoteTokenValidation } from '../common'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; -const fundsIdValidation = z.number().int().positive(); +const fundsIdValidation = z.string().length(30); export const MicronoteBatchApiSchemas = { 'MicronoteBatch.fund': { @@ -36,7 +36,7 @@ export const MicronoteBatchApiSchemas = { address: addressValidation, }), result: z.object({ - fundsId: z.number().int().positive(), + fundsId: fundsIdValidation, microgonsRemaining: micronoteTokenValidation, allowedRecipientAddresses: addressValidation.array().optional(), }), diff --git a/shared/specification/types/IDataboxFunctionPricing.ts b/shared/specification/types/IDataboxFunctionPricing.ts new file mode 100644 index 000000000..3acd322df --- /dev/null +++ b/shared/specification/types/IDataboxFunctionPricing.ts @@ -0,0 +1,27 @@ +import { z } from 'zod'; +import { databoxVersionHashValidation } from '../common'; + +export const DataboxFunctionPricing = z.object({ + minimum: z.number().int().nonnegative().optional().describe('Minimum price for this step.'), + perQuery: z.number().int().nonnegative().describe('Base price per query.'), + addOns: z + .object({ + perKb: z + .number() + .int() + .nonnegative() + .optional() + .describe('Optional add-on price per kilobyte of output data.'), + }) + .optional(), + remoteMeta: z + .object({ + host: z.string().describe('The remote host'), + databoxVersionHash: databoxVersionHashValidation, + functionName: z.string().describe('The remote function name'), + }) + .optional(), +}); +type IDataboxFunctionPricing = z.infer; + +export default IDataboxFunctionPricing; diff --git a/shared/specification/types/IDataboxManifest.ts b/shared/specification/types/IDataboxManifest.ts index c98b17f3f..1a3e1ae92 100644 --- a/shared/specification/types/IDataboxManifest.ts +++ b/shared/specification/types/IDataboxManifest.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { addressValidation, identityValidation } from '../common'; -import { databoxVersionHashValidation } from '../databox/DataboxApis'; +import { addressValidation, identityValidation , databoxVersionHashValidation } from '../common'; +import { DataboxFunctionPricing } from './IDataboxFunctionPricing'; const minDate = new Date('2022-01-01').getTime(); @@ -25,16 +25,22 @@ export const DataboxManifestSchema = z.object({ coreVersion: z.string().describe('Version of the Databox Core Runtime'), schemaInterface: z.string().optional().describe('The raw typescript schema for this Databox'), functionsByName: z.record( - z.string().describe('The Function name'), + z + .string() + .regex(/[a-z][A-Za-z0-9]+/) + .describe('The Function name'), z.object({ corePlugins: z .record(z.string()) .optional() .describe('plugin dependencies required for execution'), - pricePerQuery: z.number().int() - .nonnegative() + prices: DataboxFunctionPricing.array() + .min(1) .optional() - .describe('Price per query if requiring payment'), + .describe( + 'Price details for a function call. This array will have an entry for each function called in this process. ' + + 'The first entry is the cost of the function packaged in this Databox.', + ), }), ), paymentAddress: addressValidation.optional(), diff --git a/shared/specification/types/IPayment.ts b/shared/specification/types/IPayment.ts index 28293b687..cdb0ede6f 100644 --- a/shared/specification/types/IPayment.ts +++ b/shared/specification/types/IPayment.ts @@ -25,10 +25,17 @@ export const MicronoteSchema = z.object({ }); export const PaymentSchema = z.object({ - micronote: MicronoteSchema.optional(), + micronote: MicronoteSchema.extend({ + holdAuthorizationCode: z + .string() + .length(16) + .optional() + .describe('A hold authorization code granting sub-holds on a micronote.'), + }).optional(), giftCard: z .object({ id: giftCardIdValidation, + sidechainIdentity: identityValidation, redemptionKey: giftCardRemptionKeyValidation, }) .optional(), From 3cd5127eef317d8a43086627b597cdbb38f8fec7 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 15 Dec 2022 16:42:04 -0500 Subject: [PATCH 055/147] v2.0.0-alpha.17 --- shared/CHANGELOG.md | 13 +++++++++++++ shared/commons/CHANGELOG.md | 11 +++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 11 +++++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 11 +++++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 8 ++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 13 +++++++++++++ shared/specification/package.json | 2 +- 12 files changed, 77 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 5a47ea36c..885a461cd 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) + + +### Features + +* added table endpoints ([62fe366](https://github.com/ulixee/shared/commit/62fe366a967d2ff8f1ae0f100cf8d8adb52d2e98)) +* converted Databox.exec into Databox.query + cleaned up other Databox endpoints ([a483c3d](https://github.com/ulixee/shared/commit/a483c3d061ad2a7a94fc3effb3ab3fb99ad2f26c)) +* micronote apis conversion to hold/settle ([c03c6fd](https://github.com/ulixee/shared/commit/c03c6fd8c7d17c29a8347aaba7413920e859c556)) + + + + + # [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 02e1e6e68..db9008a77 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) + + +### Features + +* micronote apis conversion to hold/settle ([c03c6fd](https://github.com/ulixee/shared/commit/c03c6fd8c7d17c29a8347aaba7413920e859c556)) + + + + + # [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) diff --git a/shared/commons/package.json b/shared/commons/package.json index 93d8b2edf..93886172d 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.16", + "version": "2.0.0-alpha.17", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 6812c7b12..7791f1101 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) + + +### Features + +* micronote apis conversion to hold/settle ([c03c6fd](https://github.com/ulixee/shared/commit/c03c6fd8c7d17c29a8347aaba7413920e859c556)) + + + + + # [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) **Note:** Version bump only for package @ulixee/crypto diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 1f190254b..475a6cd9d 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.16", + "version": "2.0.0-alpha.17", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.16", - "@ulixee/crypto": "2.0.0-alpha.16", - "@ulixee/specification": "2.0.0-alpha.16", + "@ulixee/commons": "2.0.0-alpha.17", + "@ulixee/crypto": "2.0.0-alpha.17", + "@ulixee/specification": "2.0.0-alpha.17", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index e6a9d483a..aefd7fa61 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.16", + "version": "2.0.0-alpha.17", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index 53c992b9a..fe2661364 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) + + +### Features + +* added table endpoints ([62fe366](https://github.com/ulixee/shared/commit/62fe366a967d2ff8f1ae0f100cf8d8adb52d2e98)) + + + + + # [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index 30e7df78d..56a7a69a4 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.16", + "version": "2.0.0-alpha.17", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.16", + "@ulixee/commons": "2.0.0-alpha.17", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index 1c8eddf10..2f84a5373 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) + +**Note:** Version bump only for package @ulixee/schema + + + + + # [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) **Note:** Version bump only for package @ulixee/schema diff --git a/shared/schema/package.json b/shared/schema/package.json index d9990d54e..d817563a7 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.16", + "version": "2.0.0-alpha.17", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 7f133070e..9e088db20 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) + + +### Features + +* added table endpoints ([62fe366](https://github.com/ulixee/shared/commit/62fe366a967d2ff8f1ae0f100cf8d8adb52d2e98)) +* converted Databox.exec into Databox.query + cleaned up other Databox endpoints ([a483c3d](https://github.com/ulixee/shared/commit/a483c3d061ad2a7a94fc3effb3ab3fb99ad2f26c)) +* micronote apis conversion to hold/settle ([c03c6fd](https://github.com/ulixee/shared/commit/c03c6fd8c7d17c29a8347aaba7413920e859c556)) + + + + + # [2.0.0-alpha.16](https://github.com/ulixee/shared/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2022-12-05) diff --git a/shared/specification/package.json b/shared/specification/package.json index ac3890750..22f7435e4 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.16", + "version": "2.0.0-alpha.17", "description": "", "main": "./index.js", "license": "MIT", From 820ae3992dd23bd9e7bffd6732fd0656d6894da3 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 23 Dec 2022 10:44:21 -0500 Subject: [PATCH 056/147] feat: catch unhandled rejections for closes --- .../commons/interfaces/IResolvablePromise.ts | 2 +- shared/commons/lib/Queue.ts | 3 +++ shared/commons/lib/Resolvable.ts | 26 ++++++++++++------- shared/commons/lib/Timer.ts | 4 +-- shared/commons/lib/TypedEventEmitter.ts | 2 ++ 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/shared/commons/interfaces/IResolvablePromise.ts b/shared/commons/interfaces/IResolvablePromise.ts index d649ad1fa..6d664a517 100644 --- a/shared/commons/interfaces/IResolvablePromise.ts +++ b/shared/commons/interfaces/IResolvablePromise.ts @@ -4,6 +4,6 @@ export default interface IResolvablePromise extends PromiseLike { stack?: string; promise?: Promise; resolve?: (value?: T | PromiseLike) => void; - reject?: (reason?: any) => void; + reject?: (reason?: any, noUnhandledRejections?: boolean) => void; timeout?: NodeJS.Timeout; } diff --git a/shared/commons/lib/Queue.ts b/shared/commons/lib/Queue.ts index ccb30b8b5..e7f6af36a 100644 --- a/shared/commons/lib/Queue.ts +++ b/shared/commons/lib/Queue.ts @@ -61,6 +61,9 @@ export default class Queue { const next = this.queue.shift(); if (!next) continue; + // catch unhandled rejections here + // eslint-disable-next-line promise/no-promise-in-callback + next.promise.promise.catch(() => null); this.reject(next, canceledError); } } diff --git a/shared/commons/lib/Resolvable.ts b/shared/commons/lib/Resolvable.ts index 94ffc912b..49eb6e15d 100644 --- a/shared/commons/lib/Resolvable.ts +++ b/shared/commons/lib/Resolvable.ts @@ -32,19 +32,27 @@ export default class Resolvable implements IResolvablePromise, Promi if (this.isResolved) return; clearTimeout(this.timeout); this.resolveFn(value); - Promise.resolve(value) - // eslint-disable-next-line promise/always-return,@typescript-eslint/no-floating-promises - .then(x => { - this.isResolved = true; - this.resolved = x; - this.clean(); - }) - .catch(this.reject); + this.isResolved = true; + this.clean(); + if (value && typeof value === 'object' && 'then' in value && typeof value.then === 'function') { + void Promise.resolve(value) + // eslint-disable-next-line promise/always-return + .then(x => { + this.resolved = x; + }) + .catch(this.reject); + } else { + this.resolved = value as T; + } } - public reject(error: Error): void { + public reject(error: Error, noUnhandledRejections = false): void { if (this.isResolved) return; this.isResolved = true; + if (noUnhandledRejections) { + // eslint-disable-next-line promise/no-promise-in-callback + this.promise.catch(() => null); + } this.rejectFn(error); this.clean(); } diff --git a/shared/commons/lib/Timer.ts b/shared/commons/lib/Timer.ts index 39ffa4a6c..9326ef8fa 100644 --- a/shared/commons/lib/Timer.ts +++ b/shared/commons/lib/Timer.ts @@ -75,7 +75,7 @@ export default class Timer { if (next) { const { timeout, reject } = next; clearTimeout(timeout); - reject(error); + reject(error, true); } } } @@ -83,5 +83,5 @@ export default class Timer { interface IRegistry { timeout: NodeJS.Timer; - reject: (err: Error) => any; + reject: (err: Error, noUnhandledRejections?: boolean) => any; } diff --git a/shared/commons/lib/TypedEventEmitter.ts b/shared/commons/lib/TypedEventEmitter.ts index c0b0087f4..31e6610b4 100644 --- a/shared/commons/lib/TypedEventEmitter.ts +++ b/shared/commons/lib/TypedEventEmitter.ts @@ -29,6 +29,8 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped continue; } if (message) event.error.message = message; + // catch unhandled rejections here: eslint-disable-next-line promise/no-promise-in-callback + event.resolvable.promise.catch(() => null); event.resolvable.reject(event.error); } } From 3081bd88c153ad7c4f13569fb78a4c28fd4ff6ac Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Sat, 24 Dec 2022 11:19:20 -0500 Subject: [PATCH 057/147] =?UTF-8?q?fix:=20don=E2=80=99t=20bindFunction=20f?= =?UTF-8?q?or=20classes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/commons/lib/utils.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/shared/commons/lib/utils.ts b/shared/commons/lib/utils.ts index 0710525bb..490677dde 100644 --- a/shared/commons/lib/utils.ts +++ b/shared/commons/lib/utils.ts @@ -96,6 +96,17 @@ export function escapeUnescapedChar(str: string, char: string): string { return str; } +function isClass(func: any): boolean { + // Class constructor is also a function + if (!(func && func.constructor === Function) || func.prototype === undefined) return false; + + // This is a class that extends other class + if (Function.prototype !== Object.getPrototypeOf(func)) return true; + + // Usually a function will only have 'constructor' in the prototype + return Object.getOwnPropertyNames(func.prototype).length > 1; +} + export function pickRandom(array: T[]): T { if (array.length === 1) return array[0]; if (!array.length) throw new Error('Empty array provided to "pickRandom"'); @@ -117,7 +128,10 @@ export function getObjectFunctionProperties(object: any): Set { typeof descriptor.value === 'function' && !descriptor.get && !descriptor.set && - descriptor.writable + descriptor.writable && + !Object.prototype[key] && + !Object[key] && + !isClass(descriptor.value) ) { functionKeys.add(key); } From a7c561b3c07fc5a90aad2988a999280a44955ef3 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Sat, 24 Dec 2022 11:19:52 -0500 Subject: [PATCH 058/147] feat: allow optional schema types at compile time --- shared/schema/index.ts | 101 ++++++++++++++++++----------- shared/schema/lib/ArraySchema.ts | 12 ++-- shared/schema/lib/BaseSchema.ts | 16 +++-- shared/schema/lib/BigintSchema.ts | 13 ++-- shared/schema/lib/BooleanSchema.ts | 9 ++- shared/schema/lib/BufferSchema.ts | 11 +++- shared/schema/lib/DateSchema.ts | 11 +++- shared/schema/lib/NumberSchema.ts | 11 +++- shared/schema/lib/ObjectSchema.ts | 28 +++++--- shared/schema/lib/RecordSchema.ts | 18 +++-- shared/schema/lib/StringSchema.ts | 13 ++-- shared/schema/test/Object.test.ts | 42 +++++++++++- 12 files changed, 203 insertions(+), 82 deletions(-) diff --git a/shared/schema/index.ts b/shared/schema/index.ts index c065027ef..c38c2a095 100644 --- a/shared/schema/index.ts +++ b/shared/schema/index.ts @@ -11,49 +11,73 @@ import RecordSchema, { IRecordSchemaConfig } from './lib/RecordSchema'; import { DateUtilities, IUnits } from './lib/DateUtilities'; type ISchemaAny = - | StringSchema - | BooleanSchema - | NumberSchema - | BigintSchema - | BufferSchema - | DateSchema - | RecordSchema - | ObjectSchema - | ArraySchema; + | StringSchema + | BooleanSchema + | NumberSchema + | BigintSchema + | BufferSchema + | DateSchema + | RecordSchema + | ObjectSchema + | ArraySchema; export { ArraySchema, ObjectSchema, ISchemaAny, DateUtilities }; -type IRecordSchemaType> = { - [P in keyof T]: T[P]['type']; -}; +export type FilterOptionalKeys = { + [K in keyof T]: T[K] extends { optional: true } ? K : never; +}[keyof T]; -export type ExtractSchemaType = T extends BaseSchema - ? T['type'] - : T extends Record +export type FilterRequiredKeys = { + [K in keyof T]: T[K] extends { optional: true } ? never : K; +}[keyof T]; + +export type IRecordSchemaType>> = { + [K in FilterRequiredKeys]: T[K]['$type']; +} & { + [K in FilterOptionalKeys]?: T[K]['$type']; +} extends infer P + ? { [K in keyof P]: P[K] } + : never; + +export type ExtractSchemaType = T extends BaseSchema + ? T['$type'] + : T extends Record> ? IRecordSchemaType : any; -export function boolean(config: IBooleanSchemaConfig = {}): BooleanSchema { +export function boolean( + config: IBooleanSchemaConfig = {}, +): BooleanSchema { return new BooleanSchema(config); } -export function number(config: INumberSchemaConfig = {}): NumberSchema { +export function number( + config: INumberSchemaConfig = {}, +): NumberSchema { return new NumberSchema(config); } -export function string(config: IStringSchemaConfig = {}): StringSchema { +export function string( + config: IStringSchemaConfig = {}, +): StringSchema { return new StringSchema(config); } -export function bigint(config: IBigintSchemaConfig = {}): BigintSchema { +export function bigint( + config: IBigintSchemaConfig = {}, +): BigintSchema { return new BigintSchema(config); } -export function buffer(config: IBufferSchemaConfig = {}): BufferSchema { +export function buffer( + config: IBufferSchemaConfig = {}, +): BufferSchema { return new BufferSchema(config); } -export function date(config: IDateSchemaConfig = {}): DateSchema { +export function date( + config: IDateSchemaConfig = {}, +): DateSchema { return new DateSchema(config); } @@ -65,34 +89,37 @@ export function dateSubtract(quantity: number, units: IUnits): DateUtilities { return new DateUtilities({ func: 'subtract', units, quantity }); } -export function record>( - config: IRecordSchemaConfig, -): RecordSchema { +export function record, TOptional extends boolean = false>( + config: IRecordSchemaConfig, +): RecordSchema { return new RecordSchema(config); } -export function object>>( - config: IObjectSchemaConfig, -): ObjectSchema; -export function object>>(fields: O): ObjectSchema; -export function object>>( - fieldsOrConfig: IObjectSchemaConfig | O, -): ObjectSchema { +export function object< + O extends Record>, + TOptional extends boolean = false, +>(config: IObjectSchemaConfig): ObjectSchema; +export function object>>( + fields: O, +): ObjectSchema; +export function object(fieldsOrConfig): ObjectSchema { if ( !fieldsOrConfig.fields || typeof fieldsOrConfig.fields !== 'object' || !(Object.values(fieldsOrConfig.fields)[0] instanceof BaseSchema) ) { - fieldsOrConfig = { fields: fieldsOrConfig } as IObjectSchemaConfig; + fieldsOrConfig = { fields: fieldsOrConfig } as IObjectSchemaConfig; } - return new ObjectSchema(fieldsOrConfig as IObjectSchemaConfig); + return new ObjectSchema(fieldsOrConfig as any); } export function array>(element: E): ArraySchema; -export function array>(config: IArraySchemaConfig): ArraySchema; -export function array>( - elementOrConfig: IArraySchemaConfig | E, -): ArraySchema { +export function array, TOptional extends boolean = false>( + config: IArraySchemaConfig, +): ArraySchema; +export function array, TOptional extends boolean = false>( + elementOrConfig: IArraySchemaConfig | E, +): ArraySchema { if (elementOrConfig instanceof BaseSchema) { elementOrConfig = { element: elementOrConfig }; } diff --git a/shared/schema/lib/ArraySchema.ts b/shared/schema/lib/ArraySchema.ts index 9f359ef89..55248a5b9 100644 --- a/shared/schema/lib/ArraySchema.ts +++ b/shared/schema/lib/ArraySchema.ts @@ -1,18 +1,20 @@ import * as assert from 'assert'; import BaseSchema, { IBaseConfig } from './BaseSchema'; -export interface IArraySchemaConfig> extends IBaseConfig { +export interface IArraySchemaConfig, TOptional extends boolean = boolean> + extends IBaseConfig { element: E; } -export default class ArraySchema> extends BaseSchema< - Array, - IArraySchemaConfig +export default class ArraySchema, TOptional extends boolean = boolean> extends BaseSchema< + Array, + TOptional, + IArraySchemaConfig > { readonly typeName = 'array'; element: E; - constructor(config: IArraySchemaConfig) { + constructor(config: IArraySchemaConfig) { super(config); assert( !!config.element, diff --git a/shared/schema/lib/BaseSchema.ts b/shared/schema/lib/BaseSchema.ts index 225b58fb8..38d61b0cd 100644 --- a/shared/schema/lib/BaseSchema.ts +++ b/shared/schema/lib/BaseSchema.ts @@ -1,14 +1,18 @@ import * as assert from 'assert'; import IValidationResult, { IValidationError } from '../interfaces/IValidationResult'; -export interface IBaseConfig { - optional?: boolean; +export interface IBaseConfig { + optional?: TOptional; description?: string; } -export default abstract class BaseSchema { - readonly type: Type; - optional?: boolean; +export default abstract class BaseSchema< + Type, + TOptional extends boolean = boolean, + Config extends IBaseConfig = IBaseConfig, +> { + readonly $type: Type; + readonly optional: TOptional; description?: string; abstract readonly typeName: string; @@ -129,7 +133,7 @@ export function isDefined(value: any): boolean { export type IValidationTracker = { errors: IValidationError[]; - has(candidate: object, type: BaseSchema): boolean; + has(candidate: object, type: BaseSchema): boolean; }; function ValidationTracker(): IValidationTracker { diff --git a/shared/schema/lib/BigintSchema.ts b/shared/schema/lib/BigintSchema.ts index af465a238..ea37d54d1 100644 --- a/shared/schema/lib/BigintSchema.ts +++ b/shared/schema/lib/BigintSchema.ts @@ -1,17 +1,22 @@ import * as assert from 'assert'; import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; -export interface IBigintSchemaConfig extends IBaseConfig { +export interface IBigintSchemaConfig + extends IBaseConfig { min?: bigint; max?: bigint; } -export default class BigintSchema extends BaseSchema { +export default class BigintSchema extends BaseSchema< + bigint, + TOptional, + IBigintSchemaConfig +> { readonly typeName = 'bigint'; min?: bigint; max?: bigint; - constructor(config: IBigintSchemaConfig = {}) { + constructor(config: IBigintSchemaConfig = {}) { super(config); if (isDefined(config.min)) assert(typeof config.min === 'bigint', 'Min value must be a bigint'); if (isDefined(config.max)) assert(typeof config.max === 'bigint', 'Max value must be a bigint'); @@ -22,7 +27,7 @@ export default class BigintSchema extends BaseSchema; if (config.max !== undefined && config.min !== null && value < config.min) { return this.failedConstraint(value, ' This value is smaller than the min.', path, tracker); } diff --git a/shared/schema/lib/BooleanSchema.ts b/shared/schema/lib/BooleanSchema.ts index 55b133a0f..ebb50d13d 100644 --- a/shared/schema/lib/BooleanSchema.ts +++ b/shared/schema/lib/BooleanSchema.ts @@ -1,8 +1,13 @@ import BaseSchema, { IBaseConfig } from './BaseSchema'; -export interface IBooleanSchemaConfig extends IBaseConfig {} +export interface IBooleanSchemaConfig + extends IBaseConfig {} -export default class BooleanSchema extends BaseSchema { +export default class BooleanSchema extends BaseSchema< + boolean, + TOptional, + IBooleanSchemaConfig +> { readonly typeName = 'boolean'; protected validationLogic(value: any, path, tracker): void { diff --git a/shared/schema/lib/BufferSchema.ts b/shared/schema/lib/BufferSchema.ts index aedf2b100..06fc38449 100644 --- a/shared/schema/lib/BufferSchema.ts +++ b/shared/schema/lib/BufferSchema.ts @@ -12,15 +12,20 @@ const IBufferEncodingTypes = [ 'hex', ] as const; -export interface IBufferSchemaConfig extends IBaseConfig { +export interface IBufferSchemaConfig + extends IBaseConfig { encoding?: keyof typeof IBufferEncodingTypes; } -export default class BufferSchema extends BaseSchema { +export default class BufferSchema extends BaseSchema< + Buffer, + TOptional, + IBufferSchemaConfig +> { readonly typeName = 'buffer'; encoding?: keyof typeof IBufferEncodingTypes; - constructor(config?: IBufferSchemaConfig) { + constructor(config?: IBufferSchemaConfig) { super(config); if (isDefined(config.encoding)) diff --git a/shared/schema/lib/DateSchema.ts b/shared/schema/lib/DateSchema.ts index 0f324d3e7..7ebf8c182 100644 --- a/shared/schema/lib/DateSchema.ts +++ b/shared/schema/lib/DateSchema.ts @@ -2,17 +2,22 @@ import moment = require('moment'); import * as assert from 'assert'; import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; -export interface IDateSchemaConfig extends IBaseConfig { +export interface IDateSchemaConfig + extends IBaseConfig { future?: boolean; past?: boolean; } -export default class DateSchema extends BaseSchema { +export default class DateSchema extends BaseSchema< + Date, + TOptional, + IDateSchemaConfig +> { readonly typeName = 'date'; future?: boolean; past?: boolean; - constructor(config: IDateSchemaConfig = {}) { + constructor(config: IDateSchemaConfig = {}) { super(config); if (isDefined(config.future)) assert(typeof config.future === 'boolean', 'future must be a boolean'); diff --git a/shared/schema/lib/NumberSchema.ts b/shared/schema/lib/NumberSchema.ts index 38fbb47ec..c16cb3ed7 100644 --- a/shared/schema/lib/NumberSchema.ts +++ b/shared/schema/lib/NumberSchema.ts @@ -1,21 +1,26 @@ import * as assert from 'assert'; import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; -export interface INumberSchemaConfig extends IBaseConfig { +export interface INumberSchemaConfig + extends IBaseConfig { min?: number; max?: number; decimals?: number; integer?: boolean; } -export default class NumberSchema extends BaseSchema { +export default class NumberSchema extends BaseSchema< + number, + TOptional, + INumberSchemaConfig +> { readonly typeName = 'number'; min?: number; max?: number; decimals?: number; integer?: boolean; - constructor(config: INumberSchemaConfig = {}) { + constructor(config: INumberSchemaConfig = {}) { super(config); if (isDefined(config.min)) assert(typeof config.min === 'number', 'Min value must be a number'); if (isDefined(config.max)) assert(typeof config.max === 'number', 'Max value must be a number'); diff --git a/shared/schema/lib/ObjectSchema.ts b/shared/schema/lib/ObjectSchema.ts index d75ef4536..be7458382 100644 --- a/shared/schema/lib/ObjectSchema.ts +++ b/shared/schema/lib/ObjectSchema.ts @@ -1,19 +1,29 @@ import * as assert from 'assert'; import BaseSchema, { IBaseConfig } from './BaseSchema'; +import { ExtractSchemaType } from '../index'; -export interface IObjectSchemaConfig>> - extends IBaseConfig { - fields: O; +type ISchemaRecord< + O extends Record, + TSchema extends BaseSchema = BaseSchema, +> = { + [T in keyof O]: O[T]; +}; + +export interface IObjectSchemaConfig< + O extends Record>, + TOptional extends boolean = boolean, +> extends IBaseConfig { + fields: ISchemaRecord; } -export default class ObjectSchema>> extends BaseSchema< - { [K in keyof O]?: O[K]['type'] }, - IObjectSchemaConfig -> { +export default class ObjectSchema< + O extends Record>, + TOptional extends boolean = boolean, +> extends BaseSchema, TOptional, IObjectSchemaConfig> { readonly typeName = 'object'; fields: O; - constructor(config: IObjectSchemaConfig) { + constructor(config: IObjectSchemaConfig) { super(config); assert(config.fields, 'You must configure the fields for this object'); assert( @@ -41,7 +51,7 @@ export default class ObjectSchema>> ext for (const key of keys) { const childPath = `${path}.${key}`; if (key in fields) { - const schema: BaseSchema = fields[key]; + const schema: BaseSchema = fields[key]; if (!schema || !(schema instanceof BaseSchema)) continue; const keyValue = value[key]; if (keyValue !== null && keyValue !== undefined) { diff --git a/shared/schema/lib/RecordSchema.ts b/shared/schema/lib/RecordSchema.ts index c641dae07..d16713736 100644 --- a/shared/schema/lib/RecordSchema.ts +++ b/shared/schema/lib/RecordSchema.ts @@ -1,21 +1,29 @@ import * as assert from 'assert'; import BaseSchema, { IBaseConfig } from './BaseSchema'; import StringSchema from './StringSchema'; +import { ExtractSchemaType } from '../index'; -export interface IRecordSchemaConfig> extends IBaseConfig { +export interface IRecordSchemaConfig< + Value extends BaseSchema, + TOptional extends boolean = false, +> extends IBaseConfig { values: Value; keys?: StringSchema; } -export default class RecordSchema> extends BaseSchema< - Record, - IRecordSchemaConfig +export default class RecordSchema< + Value extends BaseSchema, + TOptional extends boolean = boolean, +> extends BaseSchema< + Record>, + TOptional, + IRecordSchemaConfig > { readonly typeName = 'record'; values: BaseSchema; keys?: StringSchema; - constructor(config: IRecordSchemaConfig) { + constructor(config: IRecordSchemaConfig) { super(config); assert(config.values, 'You must configure the types of values for this record'); assert( diff --git a/shared/schema/lib/StringSchema.ts b/shared/schema/lib/StringSchema.ts index 31c915ff0..57c723ada 100644 --- a/shared/schema/lib/StringSchema.ts +++ b/shared/schema/lib/StringSchema.ts @@ -3,7 +3,8 @@ import { URL } from 'url'; import * as assert from 'assert'; import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; -export interface IStringSchemaConfig extends IBaseConfig { +export interface IStringSchemaConfig + extends IBaseConfig { format?: 'email' | 'url' | 'date' | 'time'; regexp?: RegExp; enum?: string[]; @@ -12,7 +13,11 @@ export interface IStringSchemaConfig extends IBaseConfig { length?: number; } -export default class StringSchema extends BaseSchema { +export default class StringSchema extends BaseSchema< + string, + TOptional, + IStringSchemaConfig +> { readonly typeName = 'string'; format?: 'email' | 'url' | 'date' | 'time'; regexp?: RegExp; @@ -21,7 +26,7 @@ export default class StringSchema extends BaseSchema = {}) { super(config); if (isDefined(this.format)) assert( @@ -50,7 +55,7 @@ export default class StringSchema extends BaseSchema; if (config.format) { switch (config.format) { case 'date': { diff --git a/shared/schema/test/Object.test.ts b/shared/schema/test/Object.test.ts index 0424faff6..02f28894d 100644 --- a/shared/schema/test/Object.test.ts +++ b/shared/schema/test/Object.test.ts @@ -1,4 +1,17 @@ -import { array, boolean, ExtractSchemaType, number, object, string } from '../index'; +import { + array, + bigint, + boolean, + buffer, + date, + ExtractSchemaType, + FilterOptionalKeys, + FilterRequiredKeys, + number, + object, + string, +} from '../index'; +import ObjectSchema from '../lib/ObjectSchema'; test('should be able to create an object schema', () => { const schema = object({ @@ -26,6 +39,33 @@ test('should be able to create an object schema with nested objects', () => { two: string({ format: 'email' }), }); + const record = { + one: string({ optional: true }), + two: string({ format: 'email' }), + nested: object({ + three: buffer({ optional: true }), + four: number({ optional: false }), + }), + nestedWithFields: object({ + optional: true, + fields: { + five: number({ optional: true }), + six: date(), + seven: bigint({ optional: false }), + }, + }), + }; + + // test out some nested optionals (just in typescript) + const nestedOptionalSchema: ExtractSchemaType = { + two: 'two', + nested: { + four: 1, + }, + nestedWithFields: { seven: 2n, six: new Date() }, + }; + expect(nestedOptionalSchema).toBeTruthy(); + const schema = object({ fields: { one: boolean(), From 5cb1befa3accccc756ab9c8fd820f275a476bda3 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 29 Dec 2022 20:27:36 -0700 Subject: [PATCH 059/147] feat: add counter to resolvable for debugging --- shared/commons/lib/Resolvable.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shared/commons/lib/Resolvable.ts b/shared/commons/lib/Resolvable.ts index 49eb6e15d..c20711156 100644 --- a/shared/commons/lib/Resolvable.ts +++ b/shared/commons/lib/Resolvable.ts @@ -1,7 +1,10 @@ import IResolvablePromise from '../interfaces/IResolvablePromise'; import TimeoutError from '../interfaces/TimeoutError'; +let idCounter = 0; export default class Resolvable implements IResolvablePromise, PromiseLike { + // eslint-disable-next-line no-multi-assign + public id = (idCounter += 1); public isResolved = false; public resolved: T; public promise: Promise; From 978150c48f75ab3bcfd0473d96abc5f4c2705323 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 3 Jan 2023 09:13:05 -0500 Subject: [PATCH 060/147] feat: databox stream and output apis --- shared/commons/lib/Logger.ts | 2 + shared/schema/index.ts | 2 +- shared/specification/databox/DataboxApis.ts | 44 ++++++++++++++++++--- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index 8121381e2..ff2a90b31 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -169,6 +169,8 @@ export function translateToPrintable( if (typeof value === 'object') { const { message, ...rest } = value as any; result.error = new Error(message); + if ('stack' in value) result.error.stack = (value as any).stack; + if ('name' in value) result.error.name = (value as any).name; Object.assign(result.error, rest); } else if (typeof value === 'string') { result.error = new Error(value as string); diff --git a/shared/schema/index.ts b/shared/schema/index.ts index c38c2a095..88975b486 100644 --- a/shared/schema/index.ts +++ b/shared/schema/index.ts @@ -43,7 +43,7 @@ export type ExtractSchemaType = T extends BaseSchema ? T['$type'] : T extends Record> ? IRecordSchemaType - : any; + : unknown; export function boolean( config: IBooleanSchemaConfig = {}, diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/databox/DataboxApis.ts index d9d53030b..000fefaae 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/databox/DataboxApis.ts @@ -76,6 +76,41 @@ export const DataboxApiSchemas = { .describe('The identities this databox allows gift card payments for (if any).'), }), }, + 'Databox.stream': { + args: z.object({ + streamId: z.string().describe('The streamId to push results for this query.'), + functionName: z.string().describe('The DataboxFunction name'), + input: z.any().optional().describe('Optional input parameters for this function call'), + versionHash: databoxVersionHashValidation.describe('The hash of this unique databox version'), + payment: PaymentSchema.optional().describe( + 'Payment for this request created with an approved Ulixee Sidechain.', + ), + authentication: z + .object({ + identity: identityValidation, + signature: signatureValidation, + nonce: z.string().length(10).describe('A random nonce adding signature noise.'), + }) + .optional(), + pricingPreferences: z + .object({ + maxComputePricePerQuery: micronoteTokenValidation.describe( + 'Maximum price to pay for compute costs per query (NOTE: This only applies to Servers implementing surge pricing).', + ), + }) + .optional(), + }), + result: z.object({ + latestVersionHash: databoxVersionHashValidation, + metadata: z + .object({ + microgons: micronoteTokenValidation, + bytes: z.number().int().nonnegative(), + milliseconds: z.number().int().nonnegative(), + }) + .optional(), + }), + }, 'Databox.query': { args: z.object({ sql: z.string().describe('The SQL command(s) you want to run'), @@ -101,8 +136,7 @@ export const DataboxApiSchemas = { }), result: z.object({ latestVersionHash: databoxVersionHashValidation, - output: z.any().optional(), - error: z.any().optional(), + outputs: z.any().array(), metadata: z .object({ microgons: micronoteTokenValidation, @@ -122,7 +156,7 @@ export const DataboxApiSchemas = { }), result: z.object({ latestVersionHash: databoxVersionHashValidation, - output: z.any().optional(), + outputs: z.any().array(), error: z.any().optional(), }), }, @@ -153,13 +187,13 @@ export const DataboxApiSchemas = { }), result: z.any({}), }, - 'Databox.queryInternalFunction': { + 'Databox.queryInternalFunctionResult': { args: z.object({ name: z.string(), sql: z.string(), boundValues: z.any({}).optional(), input: z.any({}).optional(), - output: z.array(z.any({})), + outputs: z.array(z.any({})), databoxVersionHash: z.string().optional(), databoxInstanceId: z.string().optional(), }), From a6e8b2560080b111d6bf13c8f94b56273f2cf6ef Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 6 Jan 2023 13:26:11 -0500 Subject: [PATCH 061/147] chore: rename databox to datastore --- shared/commons/config/index.ts | 10 +-- shared/commons/lib/Logger.ts | 8 +-- shared/commons/package.json | 2 +- shared/specification/common.ts | 4 +- shared/specification/databox/index.ts | 8 --- .../DatastoreApis.ts} | 72 +++++++++---------- shared/specification/datastore/index.ts | 8 +++ shared/specification/package.json | 2 +- ...ricing.ts => IDatastoreFunctionPricing.ts} | 10 +-- ...taboxManifest.ts => IDatastoreManifest.ts} | 28 ++++---- shared/yarn.lock | 16 ++--- 11 files changed, 84 insertions(+), 84 deletions(-) delete mode 100644 shared/specification/databox/index.ts rename shared/specification/{databox/DataboxApis.ts => datastore/DatastoreApis.ts} (75%) create mode 100644 shared/specification/datastore/index.ts rename shared/specification/types/{IDataboxFunctionPricing.ts => IDatastoreFunctionPricing.ts} (67%) rename shared/specification/types/{IDataboxManifest.ts => IDatastoreManifest.ts} (60%) diff --git a/shared/commons/config/index.ts b/shared/commons/config/index.ts index 0b6275d68..5a65ec117 100644 --- a/shared/commons/config/index.ts +++ b/shared/commons/config/index.ts @@ -18,7 +18,7 @@ export default class UlixeeConfig { private static cachedConfigLocations: { [cwd_entrypoint: string]: string } = {}; private static cachedConfigObjects: { [cwd_entrypoint: string]: UlixeeConfig } = {}; - public databoxOutDir?: string; + public datastoreOutDir?: string; private get configPath(): string { return Path.join(this.directoryPath, 'config.json'); @@ -27,8 +27,8 @@ export default class UlixeeConfig { constructor(readonly directoryPath: string) { if (Fs.existsSync(this.configPath)) { const data = JSON.parse(Fs.readFileSync(this.configPath, 'utf8')); - if (data.databoxOutDir) { - this.databoxOutDir = Path.isAbsolute(data.databoxOutDir) ? data.databoxOutDir : Path.resolve(this.directoryPath, data.databoxOutDir); + if (data.datastoreOutDir) { + this.datastoreOutDir = Path.isAbsolute(data.datastoreOutDir) ? data.datastoreOutDir : Path.resolve(this.directoryPath, data.datastoreOutDir); } } } @@ -39,7 +39,7 @@ export default class UlixeeConfig { private getData(): IUlixeeConfig { return { - databoxOutDir: this.databoxOutDir, + datastoreOutDir: this.datastoreOutDir, }; } @@ -115,7 +115,7 @@ export default class UlixeeConfig { } export interface IUlixeeConfig { - databoxOutDir?: string + datastoreOutDir?: string } export interface IRuntimeLocation { diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index ff2a90b31..cf5d9b478 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -326,7 +326,7 @@ registerNamespaceMapping((ns, active, skip) => { /agent\/.*/, /plugins\/.*/, /net\/.*/, - /databox[/-].*/, + /datastore[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, /ramps[/-].*/, @@ -338,7 +338,7 @@ registerNamespaceMapping((ns, active, skip) => { /agent\/.*/, /plugins\/.*/, /net\/.*/, - /databox[/-].*/, + /datastore[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, /ramps[/-].*/, @@ -350,7 +350,7 @@ registerNamespaceMapping((ns, active, skip) => { active.push(/DevtoolsSessionLogger/); } else if (ns.includes('hero')) { active.push(/^hero[/-].*/, /net\/.*/); - } else if (ns.includes('databox')) { - active.push(/^databox[/-].*/, /net\/.*/); + } else if (ns.includes('datastore')) { + active.push(/^datastore[/-].*/, /net\/.*/); } }); diff --git a/shared/commons/package.json b/shared/commons/package.json index 93886172d..f4c42c72e 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -12,6 +12,6 @@ "source-map-js": "^1.0.1" }, "devDependencies": { - "@types/better-sqlite3": "^7.5.0" + "@types/better-sqlite3": "^7.6.3" } } diff --git a/shared/specification/common.ts b/shared/specification/common.ts index a5338201c..39764a9e2 100644 --- a/shared/specification/common.ts +++ b/shared/specification/common.ts @@ -50,10 +50,10 @@ export const centagonTokenValidation = z.bigint().refine(x => x > 0n); export const micronoteTokenValidation = z.number().int().positive(); -export const databoxVersionHashValidation = z +export const datastoreVersionHashValidation = z .string() .length(62) .regex( /^dbx1[ac-hj-np-z02-9]{58}/, - 'This is not a Databox versionHash (Bech32 encoded hash starting with "dbx1").', + 'This is not a Datastore versionHash (Bech32 encoded hash starting with "dbx1").', ); diff --git a/shared/specification/databox/index.ts b/shared/specification/databox/index.ts deleted file mode 100644 index efa26a238..000000000 --- a/shared/specification/databox/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; -import { DataboxApiSchemas } from './DataboxApis'; - -export type IDataboxApiTypes = IZodSchemaToApiTypes; - -export type IDataboxApis = IZodHandlers; - -export default DataboxApiSchemas; diff --git a/shared/specification/databox/DataboxApis.ts b/shared/specification/datastore/DatastoreApis.ts similarity index 75% rename from shared/specification/databox/DataboxApis.ts rename to shared/specification/datastore/DatastoreApis.ts index 000fefaae..caea3c653 100644 --- a/shared/specification/databox/DataboxApis.ts +++ b/shared/specification/datastore/DatastoreApis.ts @@ -1,20 +1,20 @@ import { z } from 'zod'; import { IZodSchemaToApiTypes } from '../utils/IZodApi'; import { - databoxVersionHashValidation, + datastoreVersionHashValidation, identityValidation, micronoteTokenValidation, signatureValidation, } from '../common'; import { PaymentSchema } from '../types/IPayment'; -import { DataboxFunctionPricing } from '../types/IDataboxFunctionPricing'; +import { DatastoreFunctionPricing } from '../types/IDatastoreFunctionPricing'; const positiveInt = z.number().int().positive(); -export const DataboxApiSchemas = { - 'Databox.upload': { +export const DatastoreApiSchemas = { + 'Datastore.upload': { args: z.object({ - compressedDatabox: z.instanceof(Buffer).describe('Bytes of a compressed .dbx file'), + compressedDatastore: z.instanceof(Buffer).describe('Bytes of a compressed .dbx file'), allowNewLinkedVersionHistory: z .boolean() .describe( @@ -31,13 +31,13 @@ export const DataboxApiSchemas = { success: z.boolean(), }), }, - 'Databox.meta': { + 'Datastore.meta': { args: z.object({ - versionHash: databoxVersionHashValidation.describe('The hash of a unique databox version'), + versionHash: datastoreVersionHashValidation.describe('The hash of a unique datastore version'), }), result: z.object({ - latestVersionHash: databoxVersionHashValidation.describe( - 'The latest version hash of this databox', + latestVersionHash: datastoreVersionHashValidation.describe( + 'The latest version hash of this datastore', ), functionsByName: z.record( z.string().describe('The name of a function'), @@ -61,7 +61,7 @@ export const DataboxApiSchemas = { minimumPrice: micronoteTokenValidation.describe( 'Minimum microgons that must be allocated for a query to be accepted.', ), - priceBreakdown: DataboxFunctionPricing.array(), + priceBreakdown: DatastoreFunctionPricing.array(), }), ), computePricePerQuery: micronoteTokenValidation.describe( @@ -70,18 +70,18 @@ export const DataboxApiSchemas = { schemaInterface: z .string() .optional() - .describe('A Typescript interface describing Function inputs and outputs this Databox.'), + .describe('A Typescript interface describing Function inputs and outputs this Datastore.'), giftCardIssuerIdentities: identityValidation .array() - .describe('The identities this databox allows gift card payments for (if any).'), + .describe('The identities this datastore allows gift card payments for (if any).'), }), }, - 'Databox.stream': { + 'Datastore.stream': { args: z.object({ streamId: z.string().describe('The streamId to push results for this query.'), - functionName: z.string().describe('The DataboxFunction name'), + functionName: z.string().describe('The DatastoreFunction name'), input: z.any().optional().describe('Optional input parameters for this function call'), - versionHash: databoxVersionHashValidation.describe('The hash of this unique databox version'), + versionHash: datastoreVersionHashValidation.describe('The hash of this unique datastore version'), payment: PaymentSchema.optional().describe( 'Payment for this request created with an approved Ulixee Sidechain.', ), @@ -101,7 +101,7 @@ export const DataboxApiSchemas = { .optional(), }), result: z.object({ - latestVersionHash: databoxVersionHashValidation, + latestVersionHash: datastoreVersionHashValidation, metadata: z .object({ microgons: micronoteTokenValidation, @@ -111,11 +111,11 @@ export const DataboxApiSchemas = { .optional(), }), }, - 'Databox.query': { + 'Datastore.query': { args: z.object({ sql: z.string().describe('The SQL command(s) you want to run'), boundValues: z.array(z.any()).optional().describe('An array of values you want to use as bound parameters'), - versionHash: databoxVersionHashValidation.describe('The hash of this unique databox version'), + versionHash: datastoreVersionHashValidation.describe('The hash of this unique datastore version'), payment: PaymentSchema.optional().describe( 'Payment for this request created with an approved Ulixee Sidechain.', ), @@ -135,7 +135,7 @@ export const DataboxApiSchemas = { .optional(), }), result: z.object({ - latestVersionHash: databoxVersionHashValidation, + latestVersionHash: datastoreVersionHashValidation, outputs: z.any().array(), metadata: z .object({ @@ -146,7 +146,7 @@ export const DataboxApiSchemas = { .optional(), }), }, - 'Databox.queryLocalScript': { + 'Datastore.queryLocalScript': { args: z.object({ sql: z.string().describe('The SQL command(s) you want to run'), boundValues: z.array(z.any()).optional().describe('An array of values you want to use as bound parameters'), @@ -155,63 +155,63 @@ export const DataboxApiSchemas = { .describe('A path to a local script to run. NOTE: API only enabled in development.'), }), result: z.object({ - latestVersionHash: databoxVersionHashValidation, + latestVersionHash: datastoreVersionHashValidation, outputs: z.any().array(), error: z.any().optional(), }), }, - 'Databox.createInMemoryTable': { + 'Datastore.createInMemoryTable': { args: z.object({ name: z.string(), schema: z.any({}), seedlings: z.any({}).optional(), - databoxInstanceId: z.string(), + datastoreInstanceId: z.string(), }), result: z.object({}), }, - 'Databox.createInMemoryFunction': { + 'Datastore.createInMemoryFunction': { args: z.object({ name: z.string(), schema: z.any({}), - databoxInstanceId: z.string(), + datastoreInstanceId: z.string(), }), result: z.object({}), }, - 'Databox.queryInternalTable': { + 'Datastore.queryInternalTable': { args: z.object({ name: z.string(), sql: z.string(), boundValues: z.any({}).optional(), - databoxVersionHash: z.string().optional(), - databoxInstanceId: z.string().optional(), + datastoreVersionHash: z.string().optional(), + datastoreInstanceId: z.string().optional(), }), result: z.any({}), }, - 'Databox.queryInternalFunctionResult': { + 'Datastore.queryInternalFunctionResult': { args: z.object({ name: z.string(), sql: z.string(), boundValues: z.any({}).optional(), input: z.any({}).optional(), outputs: z.array(z.any({})), - databoxVersionHash: z.string().optional(), - databoxInstanceId: z.string().optional(), + datastoreVersionHash: z.string().optional(), + datastoreInstanceId: z.string().optional(), }), result: z.any({}), }, - 'Databox.queryInternal': { + 'Datastore.queryInternal': { args: z.object({ sql: z.string(), boundValues: z.any({}).optional(), inputByFunctionName: z.record(z.any()), outputByFunctionName: z.record(z.array(z.any({}))), - databoxVersionHash: z.string().optional(), - databoxInstanceId: z.string().optional(), + datastoreVersionHash: z.string().optional(), + datastoreInstanceId: z.string().optional(), }), result: z.any({}), }, }; -type IDataboxApiTypes = IZodSchemaToApiTypes; +type IDatastoreApiTypes = IZodSchemaToApiTypes; -export default IDataboxApiTypes; +export default IDatastoreApiTypes; diff --git a/shared/specification/datastore/index.ts b/shared/specification/datastore/index.ts new file mode 100644 index 000000000..20febccbe --- /dev/null +++ b/shared/specification/datastore/index.ts @@ -0,0 +1,8 @@ +import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; +import { DatastoreApiSchemas } from './DatastoreApis'; + +export type IDatastoreApiTypes = IZodSchemaToApiTypes; + +export type IDatastoreApis = IZodHandlers; + +export default DatastoreApiSchemas; diff --git a/shared/specification/package.json b/shared/specification/package.json index 22f7435e4..127ee9a9d 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -5,6 +5,6 @@ "main": "./index.js", "license": "MIT", "dependencies": { - "zod": "^3.17.3" + "zod": "^3.20.2" } } diff --git a/shared/specification/types/IDataboxFunctionPricing.ts b/shared/specification/types/IDatastoreFunctionPricing.ts similarity index 67% rename from shared/specification/types/IDataboxFunctionPricing.ts rename to shared/specification/types/IDatastoreFunctionPricing.ts index 3acd322df..69a12f157 100644 --- a/shared/specification/types/IDataboxFunctionPricing.ts +++ b/shared/specification/types/IDatastoreFunctionPricing.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -import { databoxVersionHashValidation } from '../common'; +import { datastoreVersionHashValidation } from '../common'; -export const DataboxFunctionPricing = z.object({ +export const DatastoreFunctionPricing = z.object({ minimum: z.number().int().nonnegative().optional().describe('Minimum price for this step.'), perQuery: z.number().int().nonnegative().describe('Base price per query.'), addOns: z @@ -17,11 +17,11 @@ export const DataboxFunctionPricing = z.object({ remoteMeta: z .object({ host: z.string().describe('The remote host'), - databoxVersionHash: databoxVersionHashValidation, + datastoreVersionHash: datastoreVersionHashValidation, functionName: z.string().describe('The remote function name'), }) .optional(), }); -type IDataboxFunctionPricing = z.infer; +type IDatastoreFunctionPricing = z.infer; -export default IDataboxFunctionPricing; +export default IDatastoreFunctionPricing; diff --git a/shared/specification/types/IDataboxManifest.ts b/shared/specification/types/IDatastoreManifest.ts similarity index 60% rename from shared/specification/types/IDataboxManifest.ts rename to shared/specification/types/IDatastoreManifest.ts index 1a3e1ae92..20bde3fae 100644 --- a/shared/specification/types/IDataboxManifest.ts +++ b/shared/specification/types/IDatastoreManifest.ts @@ -1,15 +1,15 @@ import { z } from 'zod'; -import { addressValidation, identityValidation , databoxVersionHashValidation } from '../common'; -import { DataboxFunctionPricing } from './IDataboxFunctionPricing'; +import { addressValidation, identityValidation , datastoreVersionHashValidation } from '../common'; +import { DatastoreFunctionPricing } from './IDatastoreFunctionPricing'; const minDate = new Date('2022-01-01').getTime(); -export const DataboxManifestSchema = z.object({ - versionHash: databoxVersionHashValidation, +export const DatastoreManifestSchema = z.object({ + versionHash: datastoreVersionHashValidation, versionTimestamp: z.number().int().gt(minDate), linkedVersions: z .object({ - versionHash: databoxVersionHashValidation, + versionHash: datastoreVersionHashValidation, versionTimestamp: z.number().int().gt(minDate), }) .array() @@ -19,11 +19,11 @@ export const DataboxManifestSchema = z.object({ .length(62) .regex( /^scr1[ac-hj-np-z02-9]{58}/, - 'This is not a Databox scripthash (Bech32 encoded hash starting with "scr").', + 'This is not a Datastore scripthash (Bech32 encoded hash starting with "scr").', ), scriptEntrypoint: z.string().describe('A relative path from a project root'), - coreVersion: z.string().describe('Version of the Databox Core Runtime'), - schemaInterface: z.string().optional().describe('The raw typescript schema for this Databox'), + coreVersion: z.string().describe('Version of the Datastore Core Runtime'), + schemaInterface: z.string().optional().describe('The raw typescript schema for this Datastore'), functionsByName: z.record( z .string() @@ -34,24 +34,24 @@ export const DataboxManifestSchema = z.object({ .record(z.string()) .optional() .describe('plugin dependencies required for execution'), - prices: DataboxFunctionPricing.array() + prices: DatastoreFunctionPricing.array() .min(1) .optional() .describe( 'Price details for a function call. This array will have an entry for each function called in this process. ' + - 'The first entry is the cost of the function packaged in this Databox.', + 'The first entry is the cost of the function packaged in this Datastore.', ), }), ), paymentAddress: addressValidation.optional(), giftCardIssuerIdentity: identityValidation .optional() - .describe('A gift card issuer identity for this Databox.'), + .describe('A gift card issuer identity for this Datastore.'), }); export type IVersionHistoryEntry = z.infer< - typeof DataboxManifestSchema.shape.linkedVersions.element + typeof DatastoreManifestSchema.shape.linkedVersions.element >; -type IDataboxManifest = z.infer; +type IDatastoreManifest = z.infer; -export default IDataboxManifest; +export default IDatastoreManifest; diff --git a/shared/yarn.lock b/shared/yarn.lock index 40605c06e..23f79d5d1 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -1724,10 +1724,10 @@ dependencies: "@babel/types" "^7.3.0" -"@types/better-sqlite3@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.5.0.tgz#c57f42c76153d070f7673fbad0084ee324905be0" - integrity sha512-G9ZbMjydW2yj1AgiPlUtdgF3a1qNpLJLudc9ynJCeJByS3XFWpmT9LT+VSHrKHFbxb31CvtYwetLTOvG9zdxdg== +"@types/better-sqlite3@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.3.tgz#117c3c182e300799b84d1b7e1781c27d8d536505" + integrity sha512-YS64N9SNDT/NAvou3QNdzAu3E2om/W/0dhORimtPGLef+zSK5l1vDzfsWb4xgXOgfhtOI5ZDTRxnvRPb22AIVQ== dependencies: "@types/node" "*" @@ -7494,7 +7494,7 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zod@^3.17.3: - version "3.17.3" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.17.3.tgz#86abbc670ff0063a4588d85a4dcc917d6e4af2ba" - integrity sha512-4oKP5zvG6GGbMlqBkI5FESOAweldEhSOZ6LI6cG+JzUT7ofj1ZOC0PJudpQOpT1iqOFpYYtX5Pw0+o403y4bcg== +zod@^3.20.2: + version "3.20.2" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.2.tgz#068606642c8f51b3333981f91c0a8ab37dfc2807" + integrity sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ== From 5ca85d41de6fa5a978bd25561907b25321b499be Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 9 Jan 2023 11:18:00 -0500 Subject: [PATCH 062/147] feat(schema): ability to convert json to code --- shared/schema/lib/BaseSchema.ts | 7 +- shared/schema/lib/jsonToSchemaCode.ts | 115 ++++++++++++++++++ shared/schema/lib/schemaFromJson.ts | 38 +++--- shared/schema/test/jsonToSchemaCode.test.ts | 53 ++++++++ .../specification/datastore/DatastoreApis.ts | 32 ++++- .../specification/types/IDatastoreManifest.ts | 10 +- 6 files changed, 230 insertions(+), 25 deletions(-) create mode 100644 shared/schema/lib/jsonToSchemaCode.ts create mode 100644 shared/schema/test/jsonToSchemaCode.test.ts diff --git a/shared/schema/lib/BaseSchema.ts b/shared/schema/lib/BaseSchema.ts index 38d61b0cd..c5c5ca612 100644 --- a/shared/schema/lib/BaseSchema.ts +++ b/shared/schema/lib/BaseSchema.ts @@ -12,20 +12,23 @@ export default abstract class BaseSchema< Config extends IBaseConfig = IBaseConfig, > { readonly $type: Type; - readonly optional: TOptional; + optional: TOptional; description?: string; abstract readonly typeName: string; constructor(config?: Config) { if (config) { - Object.assign(this, config); if (isDefined(config.description)) { assert(typeof config.description === 'string', 'description must be a string'); } if (isDefined(config.optional)) { assert(typeof config.optional === 'boolean', 'optional must be a boolean'); } + for (const [key, value] of Object.entries(config)) { + if (key === 'optional' && value === false) continue; + this[key] = value; + } } } diff --git a/shared/schema/lib/jsonToSchemaCode.ts b/shared/schema/lib/jsonToSchemaCode.ts new file mode 100644 index 000000000..54f904534 --- /dev/null +++ b/shared/schema/lib/jsonToSchemaCode.ts @@ -0,0 +1,115 @@ +import { IAnySchemaJson, IObjectSchemaJson } from '../interfaces/ISchemaJson'; + +export default function jsonToSchemaCode( + json: Record | IAnySchemaJson, + schemaImports: Set, +): string { + if (!json) return undefined; + + if (json.typeName) { + return parseField(json as IAnySchemaJson, schemaImports); + } + + let js = `{\n`; + for (const [field, schemaJson] of Object.entries(json)) { + js += ` ${getFieldName(field)}: ${parseField(schemaJson, schemaImports, 2)},\n`; + } + return `${js}}`; +} + +function parseField(json: IAnySchemaJson, schemaImports: Set, leadingSpaces = 0): string { + const { typeName, element, fields, values, keys, ...config } = json as any; + if (config.optional !== true) delete config.optional; + schemaImports.add(typeName); + + if (typeName === 'object') { + return parseObjectSchema(json as IObjectSchemaJson, schemaImports, leadingSpaces); + } + + if (typeName === 'array') { + // use shortcut by default + if (Object.keys(config).length === 0) { + const field = parseField(element, schemaImports, leadingSpaces); + return `array(${field})`; + } + config.element = parseField(element, schemaImports, leadingSpaces + 2); + } + + if (typeName === 'record') { + config.values = parseField(values, schemaImports, leadingSpaces + 2); + if (keys) config.keys = parseField(keys, schemaImports, leadingSpaces + 2); + } + + let js = `${typeName}(`; + + const configEntries = Object.keys(config).length; + if (configEntries > 0) { + js += '{'; + if (configEntries > 1) js += '\n'; + + for (const [key, value] of Object.entries(config)) { + if (configEntries > 1) { + js += spaces(leadingSpaces + 2); + } else { + js += ' '; + } + js += `${getFieldName(key)}: ${JSON.stringify(value)}`; + if (configEntries > 1) js += ',\n'; + } + if (configEntries === 1) js += ' '; + else js += spaces(leadingSpaces); + js += '}'; + } + return `${js})`; +} + +function parseObjectSchema( + json: IObjectSchemaJson, + schemaImports: Set, + leadingSpaces = 0, +): string { + const { typeName, fields, ...config } = json; + if (config.optional !== true) delete config.optional; + + schemaImports.add('object'); + let js = `object({\n`; + + const configEntries = Object.keys(config).length; + const indented = spaces(leadingSpaces + 2); + + if (configEntries > 0) { + js += `${indented}fields: {\n`; + } + for (const [field, schemaJson] of Object.entries(fields)) { + js += `${indented}${getFieldName(field)}: ${parseField( + schemaJson, + schemaImports, + leadingSpaces + 2, + )},\n`; + } + if (configEntries > 0) { + // close fields + js += '},\n'; + for (const [key, value] of Object.entries(config)) { + js += `${indented}${getFieldName(key)}: ${JSON.stringify(value)},\n`; + } + } + js += spaces(leadingSpaces); + return `${js}})`; +} + +const identifierRE = /^[A-Za-z_$][A-Za-z0-9_$]*$/; + +export function getFieldName(str: string): string { + if (identifierRE.test(str)) { + return str; + } + + return JSON.stringify(str); +} + +function spaces(count: number): string { + let spacesStr = ''; + for (let i = 0; i < count; i += 1) spacesStr += ' '; + return spacesStr; +} diff --git a/shared/schema/lib/schemaFromJson.ts b/shared/schema/lib/schemaFromJson.ts index 79f06a32b..2d862d177 100644 --- a/shared/schema/lib/schemaFromJson.ts +++ b/shared/schema/lib/schemaFromJson.ts @@ -9,6 +9,7 @@ import RecordSchema, { IRecordSchemaConfig } from './RecordSchema'; import ArraySchema from './ArraySchema'; import ObjectSchema from './ObjectSchema'; import { ISchemaAny } from '../index'; +import { IBaseConfig } from './BaseSchema'; export default function schemaFromJson( json: Record | IAnySchemaJson, @@ -22,32 +23,37 @@ export default function schemaFromJson( } function parseField(json: IAnySchemaJson): ISchemaAny { - if (json.typeName === 'number') return new NumberSchema(json); - if (json.typeName === 'bigint') return new BigintSchema(json); - if (json.typeName === 'boolean') return new BooleanSchema(json); - if (json.typeName === 'buffer') return new BufferSchema(json); - if (json.typeName === 'date') return new DateSchema(json); - if (json.typeName === 'string') return new StringSchema(json); - if (json.typeName === 'record') { + const { typeName, element, fields, values, keys, ...config } = json as any; + if (typeName === 'number') return new NumberSchema(config); + if (typeName === 'bigint') return new BigintSchema(config); + if (typeName === 'boolean') return new BooleanSchema(config); + if (typeName === 'buffer') return new BufferSchema(config); + if (typeName === 'date') return new DateSchema(config); + if (typeName === 'string') return new StringSchema(config); + if (typeName === 'record') { const recordConfig: IRecordSchemaConfig = { - values: parseField(json.values), + values: parseField(values), + ...config, }; - if (json.keys) recordConfig.keys = new StringSchema(json.keys); + if (keys) recordConfig.keys = new StringSchema(keys); return new RecordSchema(recordConfig); } - if (json.typeName === 'array') { - const elementConfig = parseField(json.element); - return new ArraySchema({ element: elementConfig }); + if (typeName === 'array') { + const elementConfig = parseField(element); + return new ArraySchema({ element: elementConfig, ...config }); } - if (json.typeName === 'object') { - return parseObjectSchema(json.fields); + if (typeName === 'object') { + return parseObjectSchema(fields, config); } } -function parseObjectSchema(json: Record): ObjectSchema { +function parseObjectSchema( + json: Record, + options: IBaseConfig = {}, +): ObjectSchema { const fields: Record = {}; for (const [field, schemaJson] of Object.entries(json)) { fields[field] = parseField(schemaJson); } - return new ObjectSchema({ fields }); + return new ObjectSchema({ fields, ...options }); } diff --git a/shared/schema/test/jsonToSchemaCode.test.ts b/shared/schema/test/jsonToSchemaCode.test.ts new file mode 100644 index 000000000..3a99e8517 --- /dev/null +++ b/shared/schema/test/jsonToSchemaCode.test.ts @@ -0,0 +1,53 @@ +import { array, bigint, number, object, string } from '../index'; +import jsonToSchemaCode from '../lib/jsonToSchemaCode'; + +test('should be able to generate a schema from json', () => { + const schema = object({ + field1: string({ description: 'This is a test', format: 'email' }), + field2: string({ length: 4 }), + field3: string({ optional: true }), + 'field-4': number(), + }); + const json = JSON.parse(JSON.stringify(schema)); + + const schema2 = jsonToSchemaCode(json, new Set()); + + expect(schema2).toBe(`object({ + field1: string({ + description: "This is a test", + format: "email", + }), + field2: string({ length: 4 }), + field3: string({ optional: true }), + "field-4": number(), +})`); +}); + +test('should be able to generate a nested object structure from json', () => { + const schema = { + test: object({ + optional: false, + fields: { + field1: string({ description: 'This is a test', format: 'email' }), + field3: array(object({ 'tester-2': number({ optional: true }) })), + }, + }), + test2: bigint(), + }; + const json = JSON.parse(JSON.stringify(schema)); + + const schema2 = jsonToSchemaCode(json, new Set()); + + expect(schema2).toBe(`{ + test: object({ + field1: string({ + description: "This is a test", + format: "email", + }), + field3: array(object({ + "tester-2": number({ optional: true }), + })), + }), + test2: bigint(), +}`); +}); diff --git a/shared/specification/datastore/DatastoreApis.ts b/shared/specification/datastore/DatastoreApis.ts index caea3c653..3c0e75c92 100644 --- a/shared/specification/datastore/DatastoreApis.ts +++ b/shared/specification/datastore/DatastoreApis.ts @@ -33,7 +33,13 @@ export const DatastoreApiSchemas = { }, 'Datastore.meta': { args: z.object({ - versionHash: datastoreVersionHashValidation.describe('The hash of a unique datastore version'), + versionHash: datastoreVersionHashValidation.describe( + 'The hash of a unique datastore version', + ), + includeSchemasAsJson: z + .boolean() + .optional() + .describe('Include JSON describing the schema for each function'), }), result: z.object({ latestVersionHash: datastoreVersionHashValidation.describe( @@ -62,6 +68,8 @@ export const DatastoreApiSchemas = { 'Minimum microgons that must be allocated for a query to be accepted.', ), priceBreakdown: DatastoreFunctionPricing.array(), + + schemaJson: z.string().optional().describe('The schema JSON if requested'), }), ), computePricePerQuery: micronoteTokenValidation.describe( @@ -70,7 +78,9 @@ export const DatastoreApiSchemas = { schemaInterface: z .string() .optional() - .describe('A Typescript interface describing Function inputs and outputs this Datastore.'), + .describe( + 'A Typescript interface describing all Function inputs and outputs of this Datastore.', + ), giftCardIssuerIdentities: identityValidation .array() .describe('The identities this datastore allows gift card payments for (if any).'), @@ -81,7 +91,9 @@ export const DatastoreApiSchemas = { streamId: z.string().describe('The streamId to push results for this query.'), functionName: z.string().describe('The DatastoreFunction name'), input: z.any().optional().describe('Optional input parameters for this function call'), - versionHash: datastoreVersionHashValidation.describe('The hash of this unique datastore version'), + versionHash: datastoreVersionHashValidation.describe( + 'The hash of this unique datastore version', + ), payment: PaymentSchema.optional().describe( 'Payment for this request created with an approved Ulixee Sidechain.', ), @@ -114,8 +126,13 @@ export const DatastoreApiSchemas = { 'Datastore.query': { args: z.object({ sql: z.string().describe('The SQL command(s) you want to run'), - boundValues: z.array(z.any()).optional().describe('An array of values you want to use as bound parameters'), - versionHash: datastoreVersionHashValidation.describe('The hash of this unique datastore version'), + boundValues: z + .array(z.any()) + .optional() + .describe('An array of values you want to use as bound parameters'), + versionHash: datastoreVersionHashValidation.describe( + 'The hash of this unique datastore version', + ), payment: PaymentSchema.optional().describe( 'Payment for this request created with an approved Ulixee Sidechain.', ), @@ -149,7 +166,10 @@ export const DatastoreApiSchemas = { 'Datastore.queryLocalScript': { args: z.object({ sql: z.string().describe('The SQL command(s) you want to run'), - boundValues: z.array(z.any()).optional().describe('An array of values you want to use as bound parameters'), + boundValues: z + .array(z.any()) + .optional() + .describe('An array of values you want to use as bound parameters'), scriptPath: z .string() .describe('A path to a local script to run. NOTE: API only enabled in development.'), diff --git a/shared/specification/types/IDatastoreManifest.ts b/shared/specification/types/IDatastoreManifest.ts index 20bde3fae..56eaebd80 100644 --- a/shared/specification/types/IDatastoreManifest.ts +++ b/shared/specification/types/IDatastoreManifest.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { addressValidation, identityValidation , datastoreVersionHashValidation } from '../common'; +import { addressValidation, identityValidation, datastoreVersionHashValidation } from '../common'; import { DatastoreFunctionPricing } from './IDatastoreFunctionPricing'; const minDate = new Date('2022-01-01').getTime(); @@ -34,6 +34,14 @@ export const DatastoreManifestSchema = z.object({ .record(z.string()) .optional() .describe('plugin dependencies required for execution'), + schemaAsJson: z + .object({ + input: z.any().optional(), + output: z.any().optional(), + inputExamples: z.any().optional(), + }) + .optional() + .describe('The schema as json.'), prices: DatastoreFunctionPricing.array() .min(1) .optional() From 0f004488f4d31fd4c3e8f8f788f2f34fed120fd9 Mon Sep 17 00:00:00 2001 From: Francisco Boni Neto Date: Wed, 11 Jan 2023 11:09:44 -0300 Subject: [PATCH 063/147] fix: add TransportBridge to net/index.ts and export Fixes importing with ESM via tsx, tsx and ts-node. Fullstack users should import it directly: import { TransportBridge } from '@ulixee/net'; --- shared/net/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/net/index.ts b/shared/net/index.ts index 00df73a77..efad513df 100644 --- a/shared/net/index.ts +++ b/shared/net/index.ts @@ -2,5 +2,6 @@ import ConnectionToCore from './lib/ConnectionToCore'; import ConnectionToClient from './lib/ConnectionToClient'; import WsTransportToCore from './lib/WsTransportToCore'; import WsTransportToClient from './lib/WsTransportToClient'; +import TransportBridge from './lib/TransportBridge'; -export { ConnectionToCore, WsTransportToClient, WsTransportToCore, ConnectionToClient }; +export { ConnectionToCore, WsTransportToClient, WsTransportToCore, ConnectionToClient, TransportBridge }; From d58db932c73add3d6da995f3bbe2bd03dccb5a74 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 10 Jan 2023 17:36:34 -0500 Subject: [PATCH 064/147] feat(schema): add tables to Manifest and Apis --- shared/schema/lib/schemaToInterface.ts | 17 ++++++----- .../specification/datastore/DatastoreApis.ts | 29 +++++++++++++++++-- .../specification/types/IDatastoreManifest.ts | 27 +++++++++++++++++ 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/shared/schema/lib/schemaToInterface.ts b/shared/schema/lib/schemaToInterface.ts index a49a3ff29..d90bfb2bd 100644 --- a/shared/schema/lib/schemaToInterface.ts +++ b/shared/schema/lib/schemaToInterface.ts @@ -6,12 +6,15 @@ import BaseSchema from './BaseSchema'; const { factory: f } = ts; export default function schemaToInterface( - schema: ISchemaAny | Record, + schema: ISchemaAny | Record | Record>, ): ts.TypeNode { - if (schema !== null && !(schema instanceof BaseSchema)) { - if (typeof schema === 'object' && Object.values(schema).every(x => x instanceof BaseSchema)) { - schema = object({ fields: schema as Record }); - } + if (schema !== null && !(schema instanceof BaseSchema) && typeof schema === 'object') { + const members = Object.entries(schema).map(([key, value]) => { + const propName = getIdentifierOrStringLiteral(key); + const type = schemaToInterface(value); + return f.createPropertySignature(undefined, propName, undefined, type); + }); + return f.createTypeLiteralNode(members); } switch (schema.typeName) { @@ -127,9 +130,7 @@ export function printNode(node: ts.Node, printerOptions?: ts.PrinterOptions): st false, ts.ScriptKind.TS, ); - const printer = ts.createPrinter( - printerOptions ?? { newLine: ts.NewLineKind.LineFeed }, - ); + const printer = ts.createPrinter(printerOptions ?? { newLine: ts.NewLineKind.LineFeed }); return ( printer .printNode(ts.EmitHint.Unspecified, node, sourceFile) diff --git a/shared/specification/datastore/DatastoreApis.ts b/shared/specification/datastore/DatastoreApis.ts index 3c0e75c92..ed9c42835 100644 --- a/shared/specification/datastore/DatastoreApis.ts +++ b/shared/specification/datastore/DatastoreApis.ts @@ -72,15 +72,34 @@ export const DatastoreApiSchemas = { schemaJson: z.string().optional().describe('The schema JSON if requested'), }), ), - computePricePerQuery: micronoteTokenValidation.describe( - 'The current server price per query. NOTE: if a server is implementing surge pricing, this amount could vary.', + tablesByName: z.record( + z.string().describe('The name of a table'), + z.object({ + pricePerQuery: micronoteTokenValidation.describe('The table base price per query.'), + priceBreakdown: z + .object({ + perQuery: z.number().int().nonnegative().describe('Base price per query.'), + remoteMeta: z + .object({ + host: z.string().describe('The remote host'), + datastoreVersionHash: datastoreVersionHashValidation, + tableName: z.string().describe('The remote table name'), + }) + .optional(), + }) + .array(), + schemaJson: z.string().optional().describe('The schema JSON if requested'), + }), ), schemaInterface: z .string() .optional() .describe( - 'A Typescript interface describing all Function inputs and outputs of this Datastore.', + 'A Typescript interface describing input and outputs of Datastore Functions, and schemas of Datastore Tables', ), + computePricePerQuery: micronoteTokenValidation.describe( + 'The current server price per query. NOTE: if a server is implementing surge pricing, this amount could vary.', + ), giftCardIssuerIdentities: identityValidation .array() .describe('The identities this datastore allows gift card payments for (if any).'), @@ -225,6 +244,10 @@ export const DatastoreApiSchemas = { boundValues: z.any({}).optional(), inputByFunctionName: z.record(z.any()), outputByFunctionName: z.record(z.array(z.any({}))), + recordsByVirtualTableName: z.record( + z.string({ description: 'Virtual Table Name' }), + z.record(z.string(), z.any(), { description: 'Virtual Table Record' }).array(), + ), datastoreVersionHash: z.string().optional(), datastoreInstanceId: z.string().optional(), }), diff --git a/shared/specification/types/IDatastoreManifest.ts b/shared/specification/types/IDatastoreManifest.ts index 56eaebd80..6d46baf4a 100644 --- a/shared/specification/types/IDatastoreManifest.ts +++ b/shared/specification/types/IDatastoreManifest.ts @@ -51,6 +51,33 @@ export const DatastoreManifestSchema = z.object({ ), }), ), + tablesByName: z.record( + z + .string() + .regex(/[a-z][A-Za-z0-9]+/) + .describe('The Table name'), + z.object({ + schemaAsJson: z.record(z.string(), z.any()).optional().describe('The schema as json.'), + prices: z + .object({ + perQuery: z.number().int().nonnegative().describe('Base price per query.'), + remoteMeta: z + .object({ + host: z.string().describe('The remote host'), + datastoreVersionHash: datastoreVersionHashValidation, + tableName: z.string().describe('The remote table name'), + }) + .optional(), + }) + .array() + .min(1) + .optional() + .describe( + 'Price details for a table call. This array will have an entry for each table called in this process. ' + + 'The first entry is the cost of the table packaged in this Datastore.', + ), + }), + ), paymentAddress: addressValidation.optional(), giftCardIssuerIdentity: identityValidation .optional() From c6e728b803532c8b3b9ab1fb6185fcef109e3b9b Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 16 Jan 2023 17:20:41 -0500 Subject: [PATCH 065/147] feat(specification): credits api in datastore chore(specification): remove gift cards feat(crypto): cli to import identities feat(specification): short datastore versions --- shared/crypto/cli.ts | 57 ++++++++++++++++ shared/specification/common.ts | 16 +---- .../specification/datastore/DatastoreApis.ts | 68 +++++++++++++++---- .../specification/sidechain/GiftCardApis.ts | 66 ------------------ .../sidechain/SidechainInfoApis.ts | 1 - shared/specification/sidechain/index.ts | 2 - .../specification/types/IDatastoreManifest.ts | 8 ++- shared/specification/types/IMicronoteBatch.ts | 3 +- shared/specification/types/IPayment.ts | 15 ++-- 9 files changed, 131 insertions(+), 105 deletions(-) delete mode 100644 shared/specification/sidechain/GiftCardApis.ts diff --git a/shared/crypto/cli.ts b/shared/crypto/cli.ts index a5a115a1f..f3659ef3d 100644 --- a/shared/crypto/cli.ts +++ b/shared/crypto/cli.ts @@ -5,8 +5,10 @@ import { randomBytes } from 'crypto'; import Identity from '@ulixee/crypto/lib/Identity'; import * as Path from 'path'; import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import UlixeeConfig from '@ulixee/commons/config/index'; import Address from './lib/Address'; import IAddressSettings, { ISignerType } from './interfaces/IAddressSettings'; +import Ed25519 from './lib/Ed25519'; const logError = (err: Error): void => { if (err instanceof APIError) { @@ -132,5 +134,60 @@ export default function cliCommands(): Command { } }); + cryptoCommands + .command('save-identity') + .description('Save an Identity PEM to a local file.') + .option('-k, --privateKey ', 'The private key bytes') + .option( + '-f, --filename ', + 'Save this Identity to a filepath. If not specified, will be placed in /identities.', + ) + .option('-p, --passphrase ', 'Save identity to a file with a passphrase.') + .option( + '-c, --passphrase-cipher ', + 'Encrypt the internal key with a cipher (pkcs8 format).', + Identity.defaultPkcsCipher, + ) + .action(async ({ privateKey, filename, passphraseCipher, passphrase }) => { + const ed25519 = Ed25519.createPrivateKeyFromBytes(Buffer.from(privateKey, 'base64')); + + const identity = new Identity(ed25519); + identity.verifyKeys(); + + filename ||= Path.join( + UlixeeConfig.global.directoryPath, + 'identities', + `${identity.bech32}.pem`, + ); + + await identity.save(filename, { passphrase, cipher: passphraseCipher }); + console.log('Saved %s to %s', identity.bech32, filename); // eslint-disable-line no-console + }); + + cryptoCommands + .command('read-identity') + .description('Output the bech32 value of an identity.') + .option('--pem ', 'The raw bytes of the PEM.') + .option( + '-f, --filename ', + 'Save this Identity to a filepath. If not specified, will be console logged.', + ) + .option('-p, --passphrase ', 'Save identity to a file with a passphrase.') + .enablePositionalOptions(true) + .action(({ pem, filename, passphrase }) => { + pem = pem.replaceAll('\\n', '\n'); + if (filename) { + const identity = Identity.loadFromFile(Path.resolve(process.cwd(), filename), { + keyPassphrase: passphrase, + }); + + console.log(identity.bech32); // eslint-disable-line no-console + } else { + const identity = Identity.loadFromPem(pem, { keyPassphrase: passphrase }); + + console.log(identity.bech32); // eslint-disable-line no-console + } + }); + return cryptoCommands; } diff --git a/shared/specification/common.ts b/shared/specification/common.ts index 39764a9e2..e5022d3a8 100644 --- a/shared/specification/common.ts +++ b/shared/specification/common.ts @@ -16,16 +16,6 @@ export const identityValidation = z 'This is not a Ulixee identity (Bech32 encoded hash starting with "id1").', ); -export const giftCardIdValidation = z.string().length(12); - -export const giftCardRemptionKeyValidation = z - .string() - .length(62) - .regex( - /^gft1[ac-hj-np-z02-9]{58}/, - 'This is not a Ulixee gift card redemption key (Bech32 encoded hash starting with "gft1").', - ); - export const hashValidation = z .instanceof(Buffer) .refine(x => x.length === 32, { message: 'Hashes must be 32 bytes' }); @@ -52,8 +42,8 @@ export const micronoteTokenValidation = z.number().int().positive(); export const datastoreVersionHashValidation = z .string() - .length(62) + .length(22) .regex( - /^dbx1[ac-hj-np-z02-9]{58}/, - 'This is not a Datastore versionHash (Bech32 encoded hash starting with "dbx1").', + /^dbx1[ac-hj-np-z02-9]{18}/, + 'This is not a Datastore versionHash (first 21 characters of the bech32 encoded hash starting with "dbx1").', ); diff --git a/shared/specification/datastore/DatastoreApis.ts b/shared/specification/datastore/DatastoreApis.ts index ed9c42835..acc712dab 100644 --- a/shared/specification/datastore/DatastoreApis.ts +++ b/shared/specification/datastore/DatastoreApis.ts @@ -20,17 +20,56 @@ export const DatastoreApiSchemas = { .describe( 'Allow this upload to start a new version chain (do not link to previous versions)', ), - uploaderIdentity: identityValidation + adminIdentity: identityValidation .optional() - .describe('If this server is private, an approved uploader Identity'), - uploaderSignature: signatureValidation + .describe( + 'If this server is in production mode, an AdminIdentity approved on the Server or Datastore.', + ), + adminSignature: signatureValidation .optional() - .describe('A signature from an approved uploader Identity'), + .describe('A signature from an approved AdminIdentity'), }), result: z.object({ success: z.boolean(), }), }, + 'Datastore.creditsBalance': { + args: z.object({ + datastoreVersionHash: datastoreVersionHashValidation.describe( + 'The hash of the Datastore version to look at credits for.', + ), + creditId: z.string().describe('CreditId issued by this datastore.'), + }), + result: z.object({ + issuedCredits: micronoteTokenValidation.describe('Issued credits balance in microgons.'), + balance: micronoteTokenValidation.describe('Remaining credits balance in microgons.'), + }), + }, + 'Datastore.admin': { + args: z.object({ + versionHash: datastoreVersionHashValidation.describe( + 'The hash of a unique datastore version', + ), + adminIdentity: identityValidation + .optional() + .describe('An admin identity for this Datastore.'), + adminSignature: signatureValidation + .optional() + .describe('A signature from the admin Identity'), + adminFunction: z.object({ + ownerType: z + .enum(['table', 'crawler', 'function', 'datastore']) + .describe('Where to locate the function.'), + ownerName: z + .string() + .describe('The name of the owning function, table or crawler (if applicable).') + .optional(), + functionName: z.string().describe('The name of the function'), + }), + functionArgs: z.any().array().describe('The args to provide to the function.'), + }), + result: z.any().describe('A flexible result based on the type of api.'), + }, 'Datastore.meta': { args: z.object({ versionHash: datastoreVersionHashValidation.describe( @@ -69,7 +108,7 @@ export const DatastoreApiSchemas = { ), priceBreakdown: DatastoreFunctionPricing.array(), - schemaJson: z.string().optional().describe('The schema JSON if requested'), + schemaJson: z.any().optional().describe('The schema JSON if requested'), }), ), tablesByName: z.record( @@ -88,7 +127,7 @@ export const DatastoreApiSchemas = { .optional(), }) .array(), - schemaJson: z.string().optional().describe('The schema JSON if requested'), + schemaJson: z.any().optional().describe('The schema JSON if requested'), }), ), schemaInterface: z @@ -100,9 +139,6 @@ export const DatastoreApiSchemas = { computePricePerQuery: micronoteTokenValidation.describe( 'The current server price per query. NOTE: if a server is implementing surge pricing, this amount could vary.', ), - giftCardIssuerIdentities: identityValidation - .array() - .describe('The identities this datastore allows gift card payments for (if any).'), }), }, 'Datastore.stream': { @@ -113,9 +149,12 @@ export const DatastoreApiSchemas = { versionHash: datastoreVersionHashValidation.describe( 'The hash of this unique datastore version', ), - payment: PaymentSchema.optional().describe( - 'Payment for this request created with an approved Ulixee Sidechain.', - ), + payment: PaymentSchema.optional().describe('Payment for this request.'), + affiliateId: z + .string() + .regex(/aff[a-zA-Z_0-9-]{10}/) + .optional() + .describe('A tracking id to attribute payments to source affiliates.'), authentication: z .object({ identity: identityValidation, @@ -152,6 +191,11 @@ export const DatastoreApiSchemas = { versionHash: datastoreVersionHashValidation.describe( 'The hash of this unique datastore version', ), + affiliateId: z + .string() + .regex(/aff[a-zA-Z_0-9-]{10}/) + .optional() + .describe('A tracking id to attribute payments to source affiliates.'), payment: PaymentSchema.optional().describe( 'Payment for this request created with an approved Ulixee Sidechain.', ), diff --git a/shared/specification/sidechain/GiftCardApis.ts b/shared/specification/sidechain/GiftCardApis.ts deleted file mode 100644 index 303c439ae..000000000 --- a/shared/specification/sidechain/GiftCardApis.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { z } from 'zod'; -import { IZodSchemaToApiTypes } from '../utils/IZodApi'; -import { - giftCardIdValidation, - giftCardRemptionKeyValidation, - identityValidation, - micronoteTokenValidation, - signatureValidation, -} from '../common'; -import { MicronoteBatchSchema } from '../types/IMicronoteBatch'; - -export const GiftCardApiSchemas = { - 'GiftCard.create': { - args: z.object({ - batchSlug: MicronoteBatchSchema.shape.batchSlug, - microgons: micronoteTokenValidation, - issuerIdentities: z.array(identityValidation), - issuerSignatures: z.array(signatureValidation), - }), - result: z.object({ - giftCardId: giftCardIdValidation, - redemptionKey: giftCardRemptionKeyValidation, - }), - }, - 'GiftCard.get': { - args: z.object({ - batchSlug: MicronoteBatchSchema.shape.batchSlug, - giftCardId: giftCardIdValidation, - }), - result: z.object({ - id: giftCardIdValidation, - balance: micronoteTokenValidation, - issuerIdentities: z.array(identityValidation), - }), - }, - 'GiftCard.createHold': { - args: z.object({ - batchSlug: MicronoteBatchSchema.shape.batchSlug, - giftCardId: giftCardIdValidation, - microgons: micronoteTokenValidation, - signature: signatureValidation.describe('Signature using the redemption key of the GiftCard'), - }), - result: z.object({ - holdId: z.string().length(32), - remainingBalance: micronoteTokenValidation, - }), - }, - 'GiftCard.settleHold': { - args: z.object({ - batchSlug: MicronoteBatchSchema.shape.batchSlug, - giftCardId: giftCardIdValidation, - holdId: z.string().length(32), - microgons: micronoteTokenValidation.describe( - 'Final microgon total to settle with. NOTE: if this exceeds the available balance, the balance will take available funds.', - ), - }), - result: z.object({ - success: z.boolean(), - microgonsAllowed: micronoteTokenValidation.describe('The microgons settled.'), - remainingBalance: micronoteTokenValidation, - }), - }, -}; - -type IGiftCardApis = IZodSchemaToApiTypes; -export default IGiftCardApis; diff --git a/shared/specification/sidechain/SidechainInfoApis.ts b/shared/specification/sidechain/SidechainInfoApis.ts index 2449de26a..3926a67cb 100644 --- a/shared/specification/sidechain/SidechainInfoApis.ts +++ b/shared/specification/sidechain/SidechainInfoApis.ts @@ -41,7 +41,6 @@ export const SidechainInfoApiSchemas = { args: z.undefined().nullish(), result: z.object({ micronote: MicronoteBatchSchema.array(), - giftCard: MicronoteBatchSchema.optional(), }), }, }; diff --git a/shared/specification/sidechain/index.ts b/shared/specification/sidechain/index.ts index 62427ddd2..30c153614 100644 --- a/shared/specification/sidechain/index.ts +++ b/shared/specification/sidechain/index.ts @@ -4,7 +4,6 @@ import { MicronoteApiSchemas } from './MicronoteApis'; import { FundingTransferApiSchemas } from './FundingTransferApis'; import { AddressApiSchemas } from './AddressApis'; import { StakeApiSchemas } from './StakeApis'; -import { GiftCardApiSchemas } from './GiftCardApis'; import { SidechainInfoApiSchemas } from './SidechainInfoApis'; import { RampApiSchemas } from './RampApis'; import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; @@ -17,7 +16,6 @@ const SidechainApiSchema = { ...MicronoteBatchApiSchemas, ...NoteApiSchemas, ...StakeApiSchemas, - ...GiftCardApiSchemas, ...RampApiSchemas, }; diff --git a/shared/specification/types/IDatastoreManifest.ts b/shared/specification/types/IDatastoreManifest.ts index 6d46baf4a..1a8a3a085 100644 --- a/shared/specification/types/IDatastoreManifest.ts +++ b/shared/specification/types/IDatastoreManifest.ts @@ -21,6 +21,11 @@ export const DatastoreManifestSchema = z.object({ /^scr1[ac-hj-np-z02-9]{58}/, 'This is not a Datastore scripthash (Bech32 encoded hash starting with "scr").', ), + adminIdentities: identityValidation + .array() + .describe( + 'Administrators of this Datastore. If none are present, defaults to Administrators on the Miner.', + ), scriptEntrypoint: z.string().describe('A relative path from a project root'), coreVersion: z.string().describe('Version of the Datastore Core Runtime'), schemaInterface: z.string().optional().describe('The raw typescript schema for this Datastore'), @@ -79,9 +84,6 @@ export const DatastoreManifestSchema = z.object({ }), ), paymentAddress: addressValidation.optional(), - giftCardIssuerIdentity: identityValidation - .optional() - .describe('A gift card issuer identity for this Datastore.'), }); export type IVersionHistoryEntry = z.infer< diff --git a/shared/specification/types/IMicronoteBatch.ts b/shared/specification/types/IMicronoteBatch.ts index bb8fc3668..cd50d16bb 100644 --- a/shared/specification/types/IMicronoteBatch.ts +++ b/shared/specification/types/IMicronoteBatch.ts @@ -5,11 +5,10 @@ export const MicronoteBatchSchema = z.object({ batchHost: z.string().url(), batchSlug: z .string() - .regex(/^(?:gifts_|micro_)[0-9A-F]+$/i) + .regex(/^[0-9A-Fa-f]+$/) .length(14), plannedClosingTime: z.date(), stopNewNotesTime: z.date(), - isGiftCardBatch: z.boolean(), minimumFundingCentagons: z.bigint().refine(x => x >= 1n), micronoteBatchIdentity: identityValidation, micronoteBatchAddress: addressValidation, diff --git a/shared/specification/types/IPayment.ts b/shared/specification/types/IPayment.ts index cdb0ede6f..b38e50275 100644 --- a/shared/specification/types/IPayment.ts +++ b/shared/specification/types/IPayment.ts @@ -1,8 +1,6 @@ import { z } from 'zod'; import { blockHeightValidation, - giftCardIdValidation, - giftCardRemptionKeyValidation, identityValidation, micronoteIdValidation, micronoteTokenValidation, @@ -32,11 +30,16 @@ export const PaymentSchema = z.object({ .optional() .describe('A hold authorization code granting sub-holds on a micronote.'), }).optional(), - giftCard: z + credits: z .object({ - id: giftCardIdValidation, - sidechainIdentity: identityValidation, - redemptionKey: giftCardRemptionKeyValidation, + id: z + .string() + .length(12) + .regex( + /^cred[A-Za-z0-9_]{8}$/, + 'This is not a Datastore credits id (starting with "cred", following by 8 alphanumeric characters).', + ), + secret: z.string().length(12), }) .optional(), }); From e2b14cc472de96f22297df6ec1a9166e2a66e1d5 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 17 Jan 2023 12:28:26 -0500 Subject: [PATCH 066/147] =?UTF-8?q?fix(crypt):=20don=E2=80=99t=20read=20pe?= =?UTF-8?q?m=20if=20not=20provided?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/crypto/cli.ts | 2 +- shared/specification/common.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/crypto/cli.ts b/shared/crypto/cli.ts index f3659ef3d..f414e92af 100644 --- a/shared/crypto/cli.ts +++ b/shared/crypto/cli.ts @@ -175,7 +175,6 @@ export default function cliCommands(): Command { .option('-p, --passphrase ', 'Save identity to a file with a passphrase.') .enablePositionalOptions(true) .action(({ pem, filename, passphrase }) => { - pem = pem.replaceAll('\\n', '\n'); if (filename) { const identity = Identity.loadFromFile(Path.resolve(process.cwd(), filename), { keyPassphrase: passphrase, @@ -183,6 +182,7 @@ export default function cliCommands(): Command { console.log(identity.bech32); // eslint-disable-line no-console } else { + pem = pem?.replaceAll('\\n', '\n'); const identity = Identity.loadFromPem(pem, { keyPassphrase: passphrase }); console.log(identity.bech32); // eslint-disable-line no-console diff --git a/shared/specification/common.ts b/shared/specification/common.ts index e5022d3a8..ec89515b8 100644 --- a/shared/specification/common.ts +++ b/shared/specification/common.ts @@ -45,5 +45,5 @@ export const datastoreVersionHashValidation = z .length(22) .regex( /^dbx1[ac-hj-np-z02-9]{18}/, - 'This is not a Datastore versionHash (first 21 characters of the bech32 encoded hash starting with "dbx1").', + 'This is not a Datastore versionHash (first 22 characters of the bech32 encoded hash, first 4 characters are "dbx1").', ); From de17d7ee66f58e0de30652b5c0518f6e4183e1bc Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 17 Jan 2023 12:38:11 -0500 Subject: [PATCH 067/147] v2.0.0-alpha.18 --- shared/CHANGELOG.md | 24 ++++++++++++++++++++++++ shared/commons/CHANGELOG.md | 18 ++++++++++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 16 ++++++++++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 11 +++++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 14 ++++++++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 19 +++++++++++++++++++ shared/specification/package.json | 2 +- 12 files changed, 112 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 885a461cd..d2c83c2c5 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) + + +### Bug Fixes + +* add TransportBridge to net/index.ts and export ([8d4f1f1](https://github.com/ulixee/shared/commit/8d4f1f1e954553dbb75c6df8d155d361d506e83b)) +* **crypt:** don’t read pem if not provided ([cb825d1](https://github.com/ulixee/shared/commit/cb825d11712215c3a157f433e6b77dcd23230019)) +* don’t bindFunction for classes ([cdf1904](https://github.com/ulixee/shared/commit/cdf19040e090c44a6f713457545c65a549879da8)) + + +### Features + +* add counter to resolvable for debugging ([8ea0232](https://github.com/ulixee/shared/commit/8ea0232bc46c44d9db68918673c542ef90ec5415)) +* allow optional schema types at compile time ([188ccfd](https://github.com/ulixee/shared/commit/188ccfdca5aeb7f391a4063d8e9af805ae82bc60)) +* catch unhandled rejections for closes ([1dd47a9](https://github.com/ulixee/shared/commit/1dd47a97aeec413475a853b5b4f259bce0e3a3de)) +* databox stream and output apis ([1901482](https://github.com/ulixee/shared/commit/1901482b58d8e8d82497841d7a781efa5ee520cb)) +* **schema:** ability to convert json to code ([1bd0281](https://github.com/ulixee/shared/commit/1bd028171be4751e342e500e44fee0db9306e435)) +* **schema:** add tables to Manifest and Apis ([545bbb0](https://github.com/ulixee/shared/commit/545bbb0412058f3271e4d5796344e270457f4af0)) +* **specification:** credits api in datastore ([0dfab62](https://github.com/ulixee/shared/commit/0dfab6269e14c2d8cba99e860110732c58365a2e)) + + + + + # [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index db9008a77..6dca6376d 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) + + +### Bug Fixes + +* don’t bindFunction for classes ([cdf1904](https://github.com/ulixee/shared/commit/cdf19040e090c44a6f713457545c65a549879da8)) + + +### Features + +* add counter to resolvable for debugging ([8ea0232](https://github.com/ulixee/shared/commit/8ea0232bc46c44d9db68918673c542ef90ec5415)) +* catch unhandled rejections for closes ([1dd47a9](https://github.com/ulixee/shared/commit/1dd47a97aeec413475a853b5b4f259bce0e3a3de)) +* databox stream and output apis ([1901482](https://github.com/ulixee/shared/commit/1901482b58d8e8d82497841d7a781efa5ee520cb)) + + + + + # [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) diff --git a/shared/commons/package.json b/shared/commons/package.json index f4c42c72e..936c0e479 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.17", + "version": "2.0.0-alpha.18", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 7791f1101..8a77594c8 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) + + +### Bug Fixes + +* **crypt:** don’t read pem if not provided ([cb825d1](https://github.com/ulixee/shared/commit/cb825d11712215c3a157f433e6b77dcd23230019)) + + +### Features + +* **specification:** credits api in datastore ([0dfab62](https://github.com/ulixee/shared/commit/0dfab6269e14c2d8cba99e860110732c58365a2e)) + + + + + # [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 475a6cd9d..2752ea111 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.17", + "version": "2.0.0-alpha.18", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.17", - "@ulixee/crypto": "2.0.0-alpha.17", - "@ulixee/specification": "2.0.0-alpha.17", + "@ulixee/commons": "2.0.0-alpha.18", + "@ulixee/crypto": "2.0.0-alpha.18", + "@ulixee/specification": "2.0.0-alpha.18", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index aefd7fa61..48d88ed0e 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.17", + "version": "2.0.0-alpha.18", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index fe2661364..660a86d6f 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) + + +### Bug Fixes + +* add TransportBridge to net/index.ts and export ([8d4f1f1](https://github.com/ulixee/shared/commit/8d4f1f1e954553dbb75c6df8d155d361d506e83b)) + + + + + # [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) diff --git a/shared/net/package.json b/shared/net/package.json index 56a7a69a4..2d316a707 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.17", + "version": "2.0.0-alpha.18", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.17", + "@ulixee/commons": "2.0.0-alpha.18", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index 2f84a5373..3f11e84af 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) + + +### Features + +* allow optional schema types at compile time ([188ccfd](https://github.com/ulixee/shared/commit/188ccfdca5aeb7f391a4063d8e9af805ae82bc60)) +* databox stream and output apis ([1901482](https://github.com/ulixee/shared/commit/1901482b58d8e8d82497841d7a781efa5ee520cb)) +* **schema:** ability to convert json to code ([1bd0281](https://github.com/ulixee/shared/commit/1bd028171be4751e342e500e44fee0db9306e435)) +* **schema:** add tables to Manifest and Apis ([545bbb0](https://github.com/ulixee/shared/commit/545bbb0412058f3271e4d5796344e270457f4af0)) + + + + + # [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) **Note:** Version bump only for package @ulixee/schema diff --git a/shared/schema/package.json b/shared/schema/package.json index d817563a7..ac54ca14e 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.17", + "version": "2.0.0-alpha.18", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 9e088db20..1c88abab4 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) + + +### Bug Fixes + +* **crypt:** don’t read pem if not provided ([cb825d1](https://github.com/ulixee/shared/commit/cb825d11712215c3a157f433e6b77dcd23230019)) + + +### Features + +* databox stream and output apis ([1901482](https://github.com/ulixee/shared/commit/1901482b58d8e8d82497841d7a781efa5ee520cb)) +* **schema:** ability to convert json to code ([1bd0281](https://github.com/ulixee/shared/commit/1bd028171be4751e342e500e44fee0db9306e435)) +* **schema:** add tables to Manifest and Apis ([545bbb0](https://github.com/ulixee/shared/commit/545bbb0412058f3271e4d5796344e270457f4af0)) +* **specification:** credits api in datastore ([0dfab62](https://github.com/ulixee/shared/commit/0dfab6269e14c2d8cba99e860110732c58365a2e)) + + + + + # [2.0.0-alpha.17](https://github.com/ulixee/shared/compare/v2.0.0-alpha.16...v2.0.0-alpha.17) (2022-12-15) diff --git a/shared/specification/package.json b/shared/specification/package.json index 127ee9a9d..3a797500a 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.17", + "version": "2.0.0-alpha.18", "description": "", "main": "./index.js", "license": "MIT", From 0d4b350e8b358c0fa84db7771867deb6f4d30f91 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 18 Jan 2023 16:12:30 -0500 Subject: [PATCH 068/147] fix(commons): remove memory for once events --- shared/commons/lib/EventSubscriber.ts | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/shared/commons/lib/EventSubscriber.ts b/shared/commons/lib/EventSubscriber.ts index 5de656857..56a640a33 100644 --- a/shared/commons/lib/EventSubscriber.ts +++ b/shared/commons/lib/EventSubscriber.ts @@ -2,9 +2,10 @@ import IRegisteredEventListener, { IEventSubscriber } from '../interfaces/IRegis type AnyFunction = (...args: any[]) => any; +let idCounter = 0; export default class EventSubscriber implements IEventSubscriber { public groups: { [key: string]: IRegisteredEventListener[] } = {}; - private readonly registeredEventListeners = new Set(); + private readonly registeredEventListeners = new Set(); on( emitter: { @@ -20,7 +21,8 @@ export default class EventSubscriber implements IEventSubscriber { includeUnhandledEvents?: boolean, ): IRegisteredEventListener { emitter.on(eventName, handler, includeUnhandledEvents); - const registeredEvent: IRegisteredEventListener = { emitter, eventName, handler }; + const id = idCounter++; + const registeredEvent = { id, emitter, eventName, handler }; this.registeredEventListeners.add(registeredEvent); return registeredEvent; } @@ -38,16 +40,22 @@ export default class EventSubscriber implements IEventSubscriber { handler: (...args: Parameters) => ReturnType, includeUnhandledEvents?: boolean, ): IRegisteredEventListener { - emitter.once(eventName, handler, includeUnhandledEvents); - const registeredEvent: IRegisteredEventListener = { emitter, eventName, handler }; + const id = idCounter++; + const finalHandler = (...args: Parameters): ReturnType => { + this.removeHandlerById(id); + return handler(...args); + }; + const registeredEvent = { id, emitter, eventName, handler: finalHandler }; + emitter.once(eventName, finalHandler, includeUnhandledEvents); this.registeredEventListeners.add(registeredEvent); return registeredEvent; } off(...listeners: IRegisteredEventListener[]): void { for (const listener of listeners) { + if (!listener.emitter) continue; listener.emitter.off(listener.eventName, listener.handler); - this.registeredEventListeners.delete(listener); + this.registeredEventListeners.delete(listener as any); } listeners.length = 0; } @@ -73,4 +81,13 @@ export default class EventSubscriber implements IEventSubscriber { delete this.groups[name]; if (events) this.off(...events); } + + private removeHandlerById(id: number): void { + for (const listener of this.registeredEventListeners) { + if (listener.id === id) { + this.registeredEventListeners.delete(listener); + break; + } + } + } } From 4bd979b619bf7904f97ec6910c13aab6d2eccb87 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 19 Jan 2023 09:54:40 -0500 Subject: [PATCH 069/147] chore: publish js branch --- shared/.github/workflows/js-branch.yml | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 shared/.github/workflows/js-branch.yml diff --git a/shared/.github/workflows/js-branch.yml b/shared/.github/workflows/js-branch.yml new file mode 100644 index 000000000..27c9b756e --- /dev/null +++ b/shared/.github/workflows/js-branch.yml @@ -0,0 +1,34 @@ +name: 'Publish a built Javascript Branch' + +on: + push: + branches: [main] + workflow_dispatch: + +jobs: + build: + name: Build Javascript + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: yarn + + - name: Build modules + run: yarn && yarn build:dist --network-timeout 1000000 + + - name: Publish branch + run: | + cd build-dist + git config --global user.email "staff@ulixee.org" + git config --global user.name "CI" + git init -b main + git add -A + git commit -m 'Auto-build Javascript files' + git push -f https://ulixee:${{ env.GH_TOKEN }}@github.com/ulixee/shared.git main:${{ github.ref_name }}-built-js + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 761e90bb262b7e5f2482ced8a7487c04e1a9f165 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 20 Jan 2023 09:40:29 -0500 Subject: [PATCH 070/147] fix(net): default to ws transport over actual wire --- shared/commons/interfaces/ILog.ts | 4 ++-- shared/net/lib/WsTransportToCore.ts | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/shared/commons/interfaces/ILog.ts b/shared/commons/interfaces/ILog.ts index bb8b18b20..2657380d6 100644 --- a/shared/commons/interfaces/ILog.ts +++ b/shared/commons/interfaces/ILog.ts @@ -1,6 +1,6 @@ export default interface ILog extends IBoundLog { - level: string; - flush(); + level?: string; + flush?(); } export interface IBoundLog { diff --git a/shared/net/lib/WsTransportToCore.ts b/shared/net/lib/WsTransportToCore.ts index 39cc6bef5..937f739c0 100644 --- a/shared/net/lib/WsTransportToCore.ts +++ b/shared/net/lib/WsTransportToCore.ts @@ -123,5 +123,10 @@ export default class WsTransportToCore< } else { this.host = host; } + if (!this.host.startsWith('ws') && !this.host.startsWith('http')) { + const url = new URL(this.host); + url.protocol = 'ws:'; + this.host = url.href; + } } } From eaa765febc34115df7d0edde2610609c5d2a1dbf Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 20 Jan 2023 09:41:17 -0500 Subject: [PATCH 071/147] feat(specification): add dns domains to datastores --- shared/specification/datastore/DatastoreApis.ts | 1 + shared/specification/types/IDatastoreManifest.ts | 2 ++ shared/specification/types/IPayment.ts | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/shared/specification/datastore/DatastoreApis.ts b/shared/specification/datastore/DatastoreApis.ts index acc712dab..fa12354bd 100644 --- a/shared/specification/datastore/DatastoreApis.ts +++ b/shared/specification/datastore/DatastoreApis.ts @@ -81,6 +81,7 @@ export const DatastoreApiSchemas = { .describe('Include JSON describing the schema for each function'), }), result: z.object({ + name: z.string().optional(), latestVersionHash: datastoreVersionHashValidation.describe( 'The latest version hash of this datastore', ), diff --git a/shared/specification/types/IDatastoreManifest.ts b/shared/specification/types/IDatastoreManifest.ts index 1a8a3a085..09417db99 100644 --- a/shared/specification/types/IDatastoreManifest.ts +++ b/shared/specification/types/IDatastoreManifest.ts @@ -5,7 +5,9 @@ import { DatastoreFunctionPricing } from './IDatastoreFunctionPricing'; const minDate = new Date('2022-01-01').getTime(); export const DatastoreManifestSchema = z.object({ + name: z.string().optional(), versionHash: datastoreVersionHashValidation, + domain: z.string().optional().describe('A Custom DNS name pointing at the latest version of the Datastore.'), versionTimestamp: z.number().int().gt(minDate), linkedVersions: z .object({ diff --git a/shared/specification/types/IPayment.ts b/shared/specification/types/IPayment.ts index b38e50275..922453154 100644 --- a/shared/specification/types/IPayment.ts +++ b/shared/specification/types/IPayment.ts @@ -34,9 +34,9 @@ export const PaymentSchema = z.object({ .object({ id: z .string() - .length(12) + .length(11) .regex( - /^cred[A-Za-z0-9_]{8}$/, + /^crd[A-Za-z0-9_]{8}$/, 'This is not a Datastore credits id (starting with "cred", following by 8 alphanumeric characters).', ), secret: z.string().length(12), From 2459095f3b93faf4284bc8a7789251fb2baa2ef7 Mon Sep 17 00:00:00 2001 From: Caleb Clark Date: Thu, 26 Jan 2023 12:48:13 -0600 Subject: [PATCH 072/147] feat: added Datastore.fetchInternalTable + tweaked Datastore.stream --- shared/specification/datastore/DatastoreApis.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/shared/specification/datastore/DatastoreApis.ts b/shared/specification/datastore/DatastoreApis.ts index fa12354bd..ed597d927 100644 --- a/shared/specification/datastore/DatastoreApis.ts +++ b/shared/specification/datastore/DatastoreApis.ts @@ -145,8 +145,8 @@ export const DatastoreApiSchemas = { 'Datastore.stream': { args: z.object({ streamId: z.string().describe('The streamId to push results for this query.'), - functionName: z.string().describe('The DatastoreFunction name'), - input: z.any().optional().describe('Optional input parameters for this function call'), + name: z.string().describe('The name of the table or function'), + input: z.any().optional().describe('Optional input or where parameters'), versionHash: datastoreVersionHashValidation.describe( 'The hash of this unique datastore version', ), @@ -182,6 +182,15 @@ export const DatastoreApiSchemas = { .optional(), }), }, + 'Datastore.fetchInternalTable': { + args: z.object({ + name: z.string().describe('The name of the table'), + input: z.any().optional().describe('Optional input or where parameters'), + datastoreVersionHash: z.string().optional(), + datastoreInstanceId: z.string().optional(), + }), + result: z.any({}), + }, 'Datastore.query': { args: z.object({ sql: z.string().describe('The SQL command(s) you want to run'), From 1236c1e1f8dacea288b73f6b4263a62fb6ed9892 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 27 Jan 2023 14:29:14 -0500 Subject: [PATCH 073/147] fix(schema): serialization fixes for schema object --- shared/net/lib/WsTransportToCore.ts | 4 +-- shared/schema/lib/BaseSchema.ts | 34 ++++++++++++++------------ shared/schema/lib/StringSchema.ts | 28 ++++++++++++++++++--- shared/schema/lib/schemaToInterface.ts | 2 +- 4 files changed, 47 insertions(+), 21 deletions(-) diff --git a/shared/net/lib/WsTransportToCore.ts b/shared/net/lib/WsTransportToCore.ts index 937f739c0..decb961fe 100644 --- a/shared/net/lib/WsTransportToCore.ts +++ b/shared/net/lib/WsTransportToCore.ts @@ -92,13 +92,13 @@ export default class WsTransportToCore< this.events.once(webSocket, 'error', this.onConnectError), ); this.events.once(webSocket, 'open', () => { + this.events.once(webSocket, 'close', this.disconnect); + this.events.on(webSocket, 'error', this.disconnect); this.events.endGroup('preConnect'); this.connectPromise.resolve(); }); this.webSocket = webSocket; - this.events.once(webSocket, 'close', this.disconnect); - this.events.on(webSocket, 'error', this.disconnect); this.events.on(webSocket, 'message', this.onMessage); } const connectOrError = await this.connectPromise; diff --git a/shared/schema/lib/BaseSchema.ts b/shared/schema/lib/BaseSchema.ts index c5c5ca612..dddc1a4e3 100644 --- a/shared/schema/lib/BaseSchema.ts +++ b/shared/schema/lib/BaseSchema.ts @@ -1,5 +1,6 @@ import * as assert from 'assert'; import IValidationResult, { IValidationError } from '../interfaces/IValidationResult'; +import { ObjectSchema } from '../index'; export interface IBaseConfig { optional?: TOptional; @@ -107,21 +108,24 @@ export default abstract class BaseSchema< return schema.typeName; } case 'array': - return `${schema}${BaseSchema.inspect(schema.element, true, circular)}[]`; - case 'record': { - const keys = Object.keys(schema.fields); - return keys.length - ? `{ ${keys - .map( - k => - `${schema}${k}${schema.fields[k].optional ? '?' : ''}: ${BaseSchema.inspect( - schema.fields[k], - false, - circular, - )};`, - ) - .join(' ')} }` - : '{}'; + return `Array<${BaseSchema.inspect(schema.element, true, circular)}>`; + case 'record': + return `{ keys: ${BaseSchema.inspect( + schema.keys, + true, + circular, + )}, values: ${BaseSchema.inspect(schema.values, true, circular)} }`; + case 'object': { + let returnType = '{'; + let isFirst = true; + for (const [key, field] of Object.entries(schema.fields)) { + if (!isFirst) returnType += ','; + const optional = (field as BaseSchema).optional; + const nested = BaseSchema.inspect(field, false, circular); + returnType += ` ${key}${optional ? '?' : ''}: ${nested}`; + isFirst = false; + } + return `${returnType} }`; } } } finally { diff --git a/shared/schema/lib/StringSchema.ts b/shared/schema/lib/StringSchema.ts index 57c723ada..d630e730f 100644 --- a/shared/schema/lib/StringSchema.ts +++ b/shared/schema/lib/StringSchema.ts @@ -1,4 +1,4 @@ -import moment = require('moment'); +import * as moment from 'moment'; import { URL } from 'url'; import * as assert from 'assert'; import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; @@ -18,6 +18,9 @@ export default class StringSchema extends B TOptional, IStringSchemaConfig > { + public static DateFormat = 'YYYY-MM-DD'; + public static TimeFormat = 'HH:mm'; + readonly typeName = 'string'; format?: 'email' | 'url' | 'date' | 'time'; regexp?: RegExp; @@ -50,6 +53,25 @@ export default class StringSchema extends B assert(typeof config.length === 'number', 'length value must be a number'); } + public toMoment(value: string): moment.Moment { + if (this.format === 'date') return moment(value, StringSchema.DateFormat); + if (this.format === 'time') return moment(value, StringSchema.TimeFormat); + throw new Error('This StringSchema does not have a format of date or time.'); + } + + public toDate(value: string): Date { + return this.toMoment(value).toDate(); + } + + public toFormat(date: Date | moment.Moment): string { + if (date instanceof Date) { + date = moment(date); + } + if (this.format === 'time') return date.format(StringSchema.TimeFormat); + if (this.format === 'date') return date.format(StringSchema.DateFormat); + throw new Error('This StringSchema does not have a format of date or time.'); + } + protected validationLogic(value: any, path, tracker): void { if (typeof value !== this.typeName) { return this.incorrectType(value, path, tracker); @@ -59,7 +81,7 @@ export default class StringSchema extends B if (config.format) { switch (config.format) { case 'date': { - if (!moment(value, 'YYYY-MM-DD').isValid()) { + if (!moment(value, StringSchema.DateFormat).isValid()) { return this.failedConstraint( value, ` This value does not follow the YYYY-MM-DD date pattern`, @@ -76,7 +98,7 @@ export default class StringSchema extends B break; } case 'time': { - if (!moment(value, 'HH:mm').isValid()) { + if (!moment(value, StringSchema.TimeFormat).isValid()) { return this.failedConstraint( value, ` This value does not follow the HH:mm time pattern`, diff --git a/shared/schema/lib/schemaToInterface.ts b/shared/schema/lib/schemaToInterface.ts index d90bfb2bd..b6e27d8ca 100644 --- a/shared/schema/lib/schemaToInterface.ts +++ b/shared/schema/lib/schemaToInterface.ts @@ -1,6 +1,6 @@ // eslint-disable-next-line import/no-extraneous-dependencies import * as ts from 'typescript'; -import { ISchemaAny, object } from '../index'; +import { ISchemaAny } from '../index'; import BaseSchema from './BaseSchema'; const { factory: f } = ts; From 06ffe1017ff908860680ce45e98d0f989d55f255 Mon Sep 17 00:00:00 2001 From: Caleb Clark Date: Fri, 27 Jan 2023 17:02:08 -0600 Subject: [PATCH 074/147] chore: renamed Function to Runner --- .../specification/datastore/DatastoreApis.ts | 20 +++++++++---------- .../specification/types/IDatastoreManifest.ts | 8 ++++---- ...nPricing.ts => IDatastoreRunnerPricing.ts} | 8 ++++---- 3 files changed, 18 insertions(+), 18 deletions(-) rename shared/specification/types/{IDatastoreFunctionPricing.ts => IDatastoreRunnerPricing.ts} (73%) diff --git a/shared/specification/datastore/DatastoreApis.ts b/shared/specification/datastore/DatastoreApis.ts index ed597d927..a1fa9f1a0 100644 --- a/shared/specification/datastore/DatastoreApis.ts +++ b/shared/specification/datastore/DatastoreApis.ts @@ -7,7 +7,7 @@ import { signatureValidation, } from '../common'; import { PaymentSchema } from '../types/IPayment'; -import { DatastoreFunctionPricing } from '../types/IDatastoreFunctionPricing'; +import { DatastoreRunnerPricing } from '../types/IDatastoreRunnerPricing'; const positiveInt = z.number().int().positive(); @@ -58,11 +58,11 @@ export const DatastoreApiSchemas = { .describe('A signature from the admin Identity'), adminFunction: z.object({ ownerType: z - .enum(['table', 'crawler', 'function', 'datastore']) + .enum(['table', 'crawler', 'runner', 'datastore']) .describe('Where to locate the function.'), ownerName: z .string() - .describe('The name of the owning function, table or crawler (if applicable).') + .describe('The name of the owning runner, table or crawler (if applicable).') .optional(), functionName: z.string().describe('The name of the function'), }), @@ -85,7 +85,7 @@ export const DatastoreApiSchemas = { latestVersionHash: datastoreVersionHashValidation.describe( 'The latest version hash of this datastore', ), - functionsByName: z.record( + runnersByName: z.record( z.string().describe('The name of a function'), z.object({ stats: z.object({ @@ -107,7 +107,7 @@ export const DatastoreApiSchemas = { minimumPrice: micronoteTokenValidation.describe( 'Minimum microgons that must be allocated for a query to be accepted.', ), - priceBreakdown: DatastoreFunctionPricing.array(), + priceBreakdown: DatastoreRunnerPricing.array(), schemaJson: z.any().optional().describe('The schema JSON if requested'), }), @@ -135,7 +135,7 @@ export const DatastoreApiSchemas = { .string() .optional() .describe( - 'A Typescript interface describing input and outputs of Datastore Functions, and schemas of Datastore Tables', + 'A Typescript interface describing input and outputs of Datastore Runners, and schemas of Datastore Tables', ), computePricePerQuery: micronoteTokenValidation.describe( 'The current server price per query. NOTE: if a server is implementing surge pricing, this amount could vary.', @@ -262,7 +262,7 @@ export const DatastoreApiSchemas = { }), result: z.object({}), }, - 'Datastore.createInMemoryFunction': { + 'Datastore.createInMemoryRunner': { args: z.object({ name: z.string(), schema: z.any({}), @@ -280,7 +280,7 @@ export const DatastoreApiSchemas = { }), result: z.any({}), }, - 'Datastore.queryInternalFunctionResult': { + 'Datastore.queryInternalRunnerResult': { args: z.object({ name: z.string(), sql: z.string(), @@ -296,8 +296,8 @@ export const DatastoreApiSchemas = { args: z.object({ sql: z.string(), boundValues: z.any({}).optional(), - inputByFunctionName: z.record(z.any()), - outputByFunctionName: z.record(z.array(z.any({}))), + inputByRunnerName: z.record(z.any()), + outputByRunnerName: z.record(z.array(z.any({}))), recordsByVirtualTableName: z.record( z.string({ description: 'Virtual Table Name' }), z.record(z.string(), z.any(), { description: 'Virtual Table Record' }).array(), diff --git a/shared/specification/types/IDatastoreManifest.ts b/shared/specification/types/IDatastoreManifest.ts index 09417db99..d7d55e701 100644 --- a/shared/specification/types/IDatastoreManifest.ts +++ b/shared/specification/types/IDatastoreManifest.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import { addressValidation, identityValidation, datastoreVersionHashValidation } from '../common'; -import { DatastoreFunctionPricing } from './IDatastoreFunctionPricing'; +import { DatastoreRunnerPricing } from './IDatastoreRunnerPricing'; const minDate = new Date('2022-01-01').getTime(); @@ -31,11 +31,11 @@ export const DatastoreManifestSchema = z.object({ scriptEntrypoint: z.string().describe('A relative path from a project root'), coreVersion: z.string().describe('Version of the Datastore Core Runtime'), schemaInterface: z.string().optional().describe('The raw typescript schema for this Datastore'), - functionsByName: z.record( + runnersByName: z.record( z .string() .regex(/[a-z][A-Za-z0-9]+/) - .describe('The Function name'), + .describe('The Runner name'), z.object({ corePlugins: z .record(z.string()) @@ -49,7 +49,7 @@ export const DatastoreManifestSchema = z.object({ }) .optional() .describe('The schema as json.'), - prices: DatastoreFunctionPricing.array() + prices: DatastoreRunnerPricing.array() .min(1) .optional() .describe( diff --git a/shared/specification/types/IDatastoreFunctionPricing.ts b/shared/specification/types/IDatastoreRunnerPricing.ts similarity index 73% rename from shared/specification/types/IDatastoreFunctionPricing.ts rename to shared/specification/types/IDatastoreRunnerPricing.ts index 69a12f157..63bde21cf 100644 --- a/shared/specification/types/IDatastoreFunctionPricing.ts +++ b/shared/specification/types/IDatastoreRunnerPricing.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; import { datastoreVersionHashValidation } from '../common'; -export const DatastoreFunctionPricing = z.object({ +export const DatastoreRunnerPricing = z.object({ minimum: z.number().int().nonnegative().optional().describe('Minimum price for this step.'), perQuery: z.number().int().nonnegative().describe('Base price per query.'), addOns: z @@ -18,10 +18,10 @@ export const DatastoreFunctionPricing = z.object({ .object({ host: z.string().describe('The remote host'), datastoreVersionHash: datastoreVersionHashValidation, - functionName: z.string().describe('The remote function name'), + runnerName: z.string().describe('The remote runner name'), }) .optional(), }); -type IDatastoreFunctionPricing = z.infer; +type IDatastoreRunnerPricing = z.infer; -export default IDatastoreFunctionPricing; +export default IDatastoreRunnerPricing; From c9e7826563f7b6cd6f8d7f60a38d549b1be7b5fe Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 31 Jan 2023 21:20:42 -0500 Subject: [PATCH 075/147] fix(commons): allow clearing sourcemap paths fix(schema): fix moment date formatting --- shared/commons/lib/SourceMapSupport.ts | 11 +++++++++++ shared/schema/lib/StringSchema.ts | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/shared/commons/lib/SourceMapSupport.ts b/shared/commons/lib/SourceMapSupport.ts index ec27d9cf3..e91d755cc 100644 --- a/shared/commons/lib/SourceMapSupport.ts +++ b/shared/commons/lib/SourceMapSupport.ts @@ -13,6 +13,11 @@ const fileUrlPrefix = 'file://'; export class SourceMapSupport { private static sourceMapCache: { [source: string]: { map: SourceMapConsumer; url: string } } = {}; private static resolvedPathCache: { [file_url: string]: string } = {}; + private static stackPathsToClear = new Set(); + + static clearStackPath(stackPath: string): void { + this.stackPathsToClear.add(stackPath) + } static resetCache(): void { this.sourceMapCache = {}; @@ -145,6 +150,12 @@ export class SourceMapSupport { }); if (position.filename !== filename) { const fnName = containingFnName ?? frame.getFunctionName(); + for (const toReplace of this.stackPathsToClear) { + if (position.filename.startsWith(toReplace)) { + position.filename = position.filename.replace(toReplace, ''); + } + } + containingFnName = position.name; frame = new Proxy(frame, { get(target: NodeJS.CallSite, p: string | symbol): any { diff --git a/shared/schema/lib/StringSchema.ts b/shared/schema/lib/StringSchema.ts index d630e730f..59dcde517 100644 --- a/shared/schema/lib/StringSchema.ts +++ b/shared/schema/lib/StringSchema.ts @@ -81,7 +81,7 @@ export default class StringSchema extends B if (config.format) { switch (config.format) { case 'date': { - if (!moment(value, StringSchema.DateFormat).isValid()) { + if (!moment(value, StringSchema.DateFormat, true).isValid()) { return this.failedConstraint( value, ` This value does not follow the YYYY-MM-DD date pattern`, @@ -98,7 +98,7 @@ export default class StringSchema extends B break; } case 'time': { - if (!moment(value, StringSchema.TimeFormat).isValid()) { + if (!moment(value, StringSchema.TimeFormat, true).isValid()) { return this.failedConstraint( value, ` This value does not follow the HH:mm time pattern`, From 414266d4b4900c76a7d3803e0c6ae705773dd5b5 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 1 Feb 2023 13:00:01 -0500 Subject: [PATCH 076/147] fix(commons): serialize objects named error too --- shared/commons/lib/TypeSerializer.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shared/commons/lib/TypeSerializer.ts b/shared/commons/lib/TypeSerializer.ts index 4d1c4234d..893cfa380 100644 --- a/shared/commons/lib/TypeSerializer.ts +++ b/shared/commons/lib/TypeSerializer.ts @@ -115,6 +115,7 @@ export default class TypeSerializer { } const type = typeof value; + if (type === Types.boolean || type === Types.string || type === Types.number) return value; if (type === Types.bigint || value instanceof BigInt) { return { __type: Types.bigint, value: value.toString() }; @@ -128,7 +129,10 @@ export default class TypeSerializer { return { __type: Types.RegExp, value: [value.source, value.flags] }; } - if (value instanceof Error) { + if ( + value instanceof Error || + ('stack' in value && 'name' in value && (value.name as string)?.endsWith?.('Error')) + ) { const { name, message, stack, ...data } = value; const extras = this.replace(data, options) as object; return { __type: Types.Error, value: { name, message, stack, ...extras } }; From ab116c0e46a42190742e75de97512f76bcfdc94a Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 1 Feb 2023 14:56:39 -0500 Subject: [PATCH 077/147] feat(commons): read embedded sourcemap content --- shared/commons/lib/SourceLoader.ts | 16 +++++++--------- shared/commons/lib/SourceMapSupport.ts | 13 ++++++++++--- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/shared/commons/lib/SourceLoader.ts b/shared/commons/lib/SourceLoader.ts index 6e8c7d49d..1a5349e0e 100644 --- a/shared/commons/lib/SourceLoader.ts +++ b/shared/commons/lib/SourceLoader.ts @@ -19,19 +19,17 @@ export default class SourceLoader { static getSource(codeLocation: ISourceCodeLocation): ISourceCodeLocation & { code: string } { if (!codeLocation) return null; - codeLocation = SourceMapSupport.getOriginalSourcePosition(codeLocation); + const sourcePosition = SourceMapSupport.getOriginalSourcePosition(codeLocation, true); - if (!this.sourceLines[codeLocation.filename]) { - const file = this.getFileContents(codeLocation.filename); + const code = sourcePosition.content; + if (!this.sourceLines[sourcePosition.filename]) { + const file = code || this.getFileContents(sourcePosition.filename); if (!file) return null; - this.sourceLines[codeLocation.filename] = file.split(/\r?\n/); + this.sourceLines[sourcePosition.filename] = file.split(/\r?\n/); } - const code = this.sourceLines[codeLocation.filename][codeLocation.line - 1]; - return { - code, - ...codeLocation, - }; + (sourcePosition as any).code = this.sourceLines[sourcePosition.filename][sourcePosition.line - 1]; + return sourcePosition as any; } static getFileContents(filepath: string, cache = true): string { diff --git a/shared/commons/lib/SourceMapSupport.ts b/shared/commons/lib/SourceMapSupport.ts index e91d755cc..b99346ac2 100644 --- a/shared/commons/lib/SourceMapSupport.ts +++ b/shared/commons/lib/SourceMapSupport.ts @@ -16,7 +16,7 @@ export class SourceMapSupport { private static stackPathsToClear = new Set(); static clearStackPath(stackPath: string): void { - this.stackPathsToClear.add(stackPath) + this.stackPathsToClear.add(stackPath); } static resetCache(): void { @@ -69,7 +69,8 @@ export class SourceMapSupport { static getOriginalSourcePosition( position: ISourceCodeLocation, - ): ISourceCodeLocation & { name?: string } { + includeContent = false, + ): ISourceCodeLocation & { name?: string; content?: string } { this.sourceMapCache[position.filename] ??= this.retrieveSourceMap(position.filename); const sourceMap = this.sourceMapCache[position.filename]; @@ -78,11 +79,17 @@ export class SourceMapSupport { // Only return the original position if a matching line was found if (originalPosition.source) { + let content: string = null; + const filename = this.resolvePath(sourceMap.url, originalPosition.source); + if (includeContent) { + content = sourceMap.map.sourceContentFor(originalPosition.source, true); + } return { - filename: this.resolvePath(sourceMap.url, originalPosition.source), + filename, column: originalPosition.column, line: originalPosition.line, name: originalPosition.name, + content, }; } } From c12aa36bdb4c9e1dbe2965693cb2f7917e8ba526 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 22 Feb 2023 13:54:22 -0500 Subject: [PATCH 078/147] chore: remove datastore apis from spec --- shared/specification/common.ts | 8 - .../specification/datastore/DatastoreApis.ts | 314 ------------------ shared/specification/datastore/index.ts | 8 - shared/specification/index.ts | 8 +- .../specification/types/IDatastoreManifest.ts | 96 ------ .../types/IDatastoreRunnerPricing.ts | 27 -- .../types/{IPayment.ts => IMicronote.ts} | 26 +- 7 files changed, 7 insertions(+), 480 deletions(-) delete mode 100644 shared/specification/datastore/DatastoreApis.ts delete mode 100644 shared/specification/datastore/index.ts delete mode 100644 shared/specification/types/IDatastoreManifest.ts delete mode 100644 shared/specification/types/IDatastoreRunnerPricing.ts rename shared/specification/types/{IPayment.ts => IMicronote.ts} (57%) diff --git a/shared/specification/common.ts b/shared/specification/common.ts index ec89515b8..66eede8f6 100644 --- a/shared/specification/common.ts +++ b/shared/specification/common.ts @@ -39,11 +39,3 @@ export const micronoteIdValidation = z export const centagonTokenValidation = z.bigint().refine(x => x > 0n); export const micronoteTokenValidation = z.number().int().positive(); - -export const datastoreVersionHashValidation = z - .string() - .length(22) - .regex( - /^dbx1[ac-hj-np-z02-9]{18}/, - 'This is not a Datastore versionHash (first 22 characters of the bech32 encoded hash, first 4 characters are "dbx1").', - ); diff --git a/shared/specification/datastore/DatastoreApis.ts b/shared/specification/datastore/DatastoreApis.ts deleted file mode 100644 index a1fa9f1a0..000000000 --- a/shared/specification/datastore/DatastoreApis.ts +++ /dev/null @@ -1,314 +0,0 @@ -import { z } from 'zod'; -import { IZodSchemaToApiTypes } from '../utils/IZodApi'; -import { - datastoreVersionHashValidation, - identityValidation, - micronoteTokenValidation, - signatureValidation, -} from '../common'; -import { PaymentSchema } from '../types/IPayment'; -import { DatastoreRunnerPricing } from '../types/IDatastoreRunnerPricing'; - -const positiveInt = z.number().int().positive(); - -export const DatastoreApiSchemas = { - 'Datastore.upload': { - args: z.object({ - compressedDatastore: z.instanceof(Buffer).describe('Bytes of a compressed .dbx file'), - allowNewLinkedVersionHistory: z - .boolean() - .describe( - 'Allow this upload to start a new version chain (do not link to previous versions)', - ), - adminIdentity: identityValidation - .optional() - .describe( - 'If this server is in production mode, an AdminIdentity approved on the Server or Datastore.', - ), - adminSignature: signatureValidation - .optional() - .describe('A signature from an approved AdminIdentity'), - }), - result: z.object({ - success: z.boolean(), - }), - }, - 'Datastore.creditsBalance': { - args: z.object({ - datastoreVersionHash: datastoreVersionHashValidation.describe( - 'The hash of the Datastore version to look at credits for.', - ), - creditId: z.string().describe('CreditId issued by this datastore.'), - }), - result: z.object({ - issuedCredits: micronoteTokenValidation.describe('Issued credits balance in microgons.'), - balance: micronoteTokenValidation.describe('Remaining credits balance in microgons.'), - }), - }, - 'Datastore.admin': { - args: z.object({ - versionHash: datastoreVersionHashValidation.describe( - 'The hash of a unique datastore version', - ), - adminIdentity: identityValidation - .optional() - .describe('An admin identity for this Datastore.'), - adminSignature: signatureValidation - .optional() - .describe('A signature from the admin Identity'), - adminFunction: z.object({ - ownerType: z - .enum(['table', 'crawler', 'runner', 'datastore']) - .describe('Where to locate the function.'), - ownerName: z - .string() - .describe('The name of the owning runner, table or crawler (if applicable).') - .optional(), - functionName: z.string().describe('The name of the function'), - }), - functionArgs: z.any().array().describe('The args to provide to the function.'), - }), - result: z.any().describe('A flexible result based on the type of api.'), - }, - 'Datastore.meta': { - args: z.object({ - versionHash: datastoreVersionHashValidation.describe( - 'The hash of a unique datastore version', - ), - includeSchemasAsJson: z - .boolean() - .optional() - .describe('Include JSON describing the schema for each function'), - }), - result: z.object({ - name: z.string().optional(), - latestVersionHash: datastoreVersionHashValidation.describe( - 'The latest version hash of this datastore', - ), - runnersByName: z.record( - z.string().describe('The name of a function'), - z.object({ - stats: z.object({ - averageBytesPerQuery: positiveInt.describe( - 'Average bytes of output returned per query.', - ), - maxBytesPerQuery: positiveInt.describe('The largest byte count seen.'), - averageMilliseconds: positiveInt.describe( - 'Average milliseconds spent before response.', - ), - maxMilliseconds: positiveInt.describe('Max milliseconds spent before response.'), - averageTotalPricePerQuery: positiveInt.describe( - 'Average total microgons paid for a query.', - ), - maxPricePerQuery: positiveInt.describe('The largest total microgon price seen.'), - }), - - pricePerQuery: micronoteTokenValidation.describe('The function base price per query.'), - minimumPrice: micronoteTokenValidation.describe( - 'Minimum microgons that must be allocated for a query to be accepted.', - ), - priceBreakdown: DatastoreRunnerPricing.array(), - - schemaJson: z.any().optional().describe('The schema JSON if requested'), - }), - ), - tablesByName: z.record( - z.string().describe('The name of a table'), - z.object({ - pricePerQuery: micronoteTokenValidation.describe('The table base price per query.'), - priceBreakdown: z - .object({ - perQuery: z.number().int().nonnegative().describe('Base price per query.'), - remoteMeta: z - .object({ - host: z.string().describe('The remote host'), - datastoreVersionHash: datastoreVersionHashValidation, - tableName: z.string().describe('The remote table name'), - }) - .optional(), - }) - .array(), - schemaJson: z.any().optional().describe('The schema JSON if requested'), - }), - ), - schemaInterface: z - .string() - .optional() - .describe( - 'A Typescript interface describing input and outputs of Datastore Runners, and schemas of Datastore Tables', - ), - computePricePerQuery: micronoteTokenValidation.describe( - 'The current server price per query. NOTE: if a server is implementing surge pricing, this amount could vary.', - ), - }), - }, - 'Datastore.stream': { - args: z.object({ - streamId: z.string().describe('The streamId to push results for this query.'), - name: z.string().describe('The name of the table or function'), - input: z.any().optional().describe('Optional input or where parameters'), - versionHash: datastoreVersionHashValidation.describe( - 'The hash of this unique datastore version', - ), - payment: PaymentSchema.optional().describe('Payment for this request.'), - affiliateId: z - .string() - .regex(/aff[a-zA-Z_0-9-]{10}/) - .optional() - .describe('A tracking id to attribute payments to source affiliates.'), - authentication: z - .object({ - identity: identityValidation, - signature: signatureValidation, - nonce: z.string().length(10).describe('A random nonce adding signature noise.'), - }) - .optional(), - pricingPreferences: z - .object({ - maxComputePricePerQuery: micronoteTokenValidation.describe( - 'Maximum price to pay for compute costs per query (NOTE: This only applies to Servers implementing surge pricing).', - ), - }) - .optional(), - }), - result: z.object({ - latestVersionHash: datastoreVersionHashValidation, - metadata: z - .object({ - microgons: micronoteTokenValidation, - bytes: z.number().int().nonnegative(), - milliseconds: z.number().int().nonnegative(), - }) - .optional(), - }), - }, - 'Datastore.fetchInternalTable': { - args: z.object({ - name: z.string().describe('The name of the table'), - input: z.any().optional().describe('Optional input or where parameters'), - datastoreVersionHash: z.string().optional(), - datastoreInstanceId: z.string().optional(), - }), - result: z.any({}), - }, - 'Datastore.query': { - args: z.object({ - sql: z.string().describe('The SQL command(s) you want to run'), - boundValues: z - .array(z.any()) - .optional() - .describe('An array of values you want to use as bound parameters'), - versionHash: datastoreVersionHashValidation.describe( - 'The hash of this unique datastore version', - ), - affiliateId: z - .string() - .regex(/aff[a-zA-Z_0-9-]{10}/) - .optional() - .describe('A tracking id to attribute payments to source affiliates.'), - payment: PaymentSchema.optional().describe( - 'Payment for this request created with an approved Ulixee Sidechain.', - ), - authentication: z - .object({ - identity: identityValidation, - signature: signatureValidation, - nonce: z.string().length(10).describe('A random nonce adding signature noise.'), - }) - .optional(), - pricingPreferences: z - .object({ - maxComputePricePerQuery: micronoteTokenValidation.describe( - 'Maximum price to pay for compute costs per query (NOTE: This only applies to Servers implementing surge pricing).', - ), - }) - .optional(), - }), - result: z.object({ - latestVersionHash: datastoreVersionHashValidation, - outputs: z.any().array(), - metadata: z - .object({ - microgons: micronoteTokenValidation, - bytes: z.number().int().nonnegative(), - milliseconds: z.number().int().nonnegative(), - }) - .optional(), - }), - }, - 'Datastore.queryLocalScript': { - args: z.object({ - sql: z.string().describe('The SQL command(s) you want to run'), - boundValues: z - .array(z.any()) - .optional() - .describe('An array of values you want to use as bound parameters'), - scriptPath: z - .string() - .describe('A path to a local script to run. NOTE: API only enabled in development.'), - }), - result: z.object({ - latestVersionHash: datastoreVersionHashValidation, - outputs: z.any().array(), - error: z.any().optional(), - }), - }, - 'Datastore.createInMemoryTable': { - args: z.object({ - name: z.string(), - schema: z.any({}), - seedlings: z.any({}).optional(), - datastoreInstanceId: z.string(), - }), - result: z.object({}), - }, - 'Datastore.createInMemoryRunner': { - args: z.object({ - name: z.string(), - schema: z.any({}), - datastoreInstanceId: z.string(), - }), - result: z.object({}), - }, - 'Datastore.queryInternalTable': { - args: z.object({ - name: z.string(), - sql: z.string(), - boundValues: z.any({}).optional(), - datastoreVersionHash: z.string().optional(), - datastoreInstanceId: z.string().optional(), - }), - result: z.any({}), - }, - 'Datastore.queryInternalRunnerResult': { - args: z.object({ - name: z.string(), - sql: z.string(), - boundValues: z.any({}).optional(), - input: z.any({}).optional(), - outputs: z.array(z.any({})), - datastoreVersionHash: z.string().optional(), - datastoreInstanceId: z.string().optional(), - }), - result: z.any({}), - }, - 'Datastore.queryInternal': { - args: z.object({ - sql: z.string(), - boundValues: z.any({}).optional(), - inputByRunnerName: z.record(z.any()), - outputByRunnerName: z.record(z.array(z.any({}))), - recordsByVirtualTableName: z.record( - z.string({ description: 'Virtual Table Name' }), - z.record(z.string(), z.any(), { description: 'Virtual Table Record' }).array(), - ), - datastoreVersionHash: z.string().optional(), - datastoreInstanceId: z.string().optional(), - }), - result: z.any({}), - }, -}; - -type IDatastoreApiTypes = IZodSchemaToApiTypes; - -export default IDatastoreApiTypes; diff --git a/shared/specification/datastore/index.ts b/shared/specification/datastore/index.ts deleted file mode 100644 index 20febccbe..000000000 --- a/shared/specification/datastore/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IZodHandlers, IZodSchemaToApiTypes } from '../utils/IZodApi'; -import { DatastoreApiSchemas } from './DatastoreApis'; - -export type IDatastoreApiTypes = IZodSchemaToApiTypes; - -export type IDatastoreApis = IZodHandlers; - -export default DatastoreApiSchemas; diff --git a/shared/specification/index.ts b/shared/specification/index.ts index 19a28328e..edd5d8cd1 100644 --- a/shared/specification/index.ts +++ b/shared/specification/index.ts @@ -1,3 +1,4 @@ +import { z } from 'zod'; import INote from './types/INote'; import IMerkleProof from './types/IMerkleProof'; import IAddressOwnershipProof from './types/IAddressOwnershipProof'; @@ -16,10 +17,11 @@ import IBlock from './types/IBlock'; import LedgerType from './types/LedgerType'; import IBlockHeader from './types/IBlockHeader'; import IBlockSettings from './types/IBlockSettings'; +import IMicronote from './types/IMicronote'; import TransactionError from './types/TransactionError'; -import IPayment from './types/IPayment'; export { + z, IBlock, IBlockHeader, IBlockSettings, @@ -29,6 +31,7 @@ export { NoteType, LedgerType, IMerkleProof, + IMicronote, IStakeSettings, ITransaction, ITransactionSource, @@ -38,6 +41,5 @@ export { IStakeSignature, IAddressSignature, IAddressOwnershipProof, - TransactionError, - IPayment, + TransactionError }; diff --git a/shared/specification/types/IDatastoreManifest.ts b/shared/specification/types/IDatastoreManifest.ts deleted file mode 100644 index d7d55e701..000000000 --- a/shared/specification/types/IDatastoreManifest.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { z } from 'zod'; -import { addressValidation, identityValidation, datastoreVersionHashValidation } from '../common'; -import { DatastoreRunnerPricing } from './IDatastoreRunnerPricing'; - -const minDate = new Date('2022-01-01').getTime(); - -export const DatastoreManifestSchema = z.object({ - name: z.string().optional(), - versionHash: datastoreVersionHashValidation, - domain: z.string().optional().describe('A Custom DNS name pointing at the latest version of the Datastore.'), - versionTimestamp: z.number().int().gt(minDate), - linkedVersions: z - .object({ - versionHash: datastoreVersionHashValidation, - versionTimestamp: z.number().int().gt(minDate), - }) - .array() - .describe('Older versions that should be redirected to this version'), - scriptHash: z - .string() - .length(62) - .regex( - /^scr1[ac-hj-np-z02-9]{58}/, - 'This is not a Datastore scripthash (Bech32 encoded hash starting with "scr").', - ), - adminIdentities: identityValidation - .array() - .describe( - 'Administrators of this Datastore. If none are present, defaults to Administrators on the Miner.', - ), - scriptEntrypoint: z.string().describe('A relative path from a project root'), - coreVersion: z.string().describe('Version of the Datastore Core Runtime'), - schemaInterface: z.string().optional().describe('The raw typescript schema for this Datastore'), - runnersByName: z.record( - z - .string() - .regex(/[a-z][A-Za-z0-9]+/) - .describe('The Runner name'), - z.object({ - corePlugins: z - .record(z.string()) - .optional() - .describe('plugin dependencies required for execution'), - schemaAsJson: z - .object({ - input: z.any().optional(), - output: z.any().optional(), - inputExamples: z.any().optional(), - }) - .optional() - .describe('The schema as json.'), - prices: DatastoreRunnerPricing.array() - .min(1) - .optional() - .describe( - 'Price details for a function call. This array will have an entry for each function called in this process. ' + - 'The first entry is the cost of the function packaged in this Datastore.', - ), - }), - ), - tablesByName: z.record( - z - .string() - .regex(/[a-z][A-Za-z0-9]+/) - .describe('The Table name'), - z.object({ - schemaAsJson: z.record(z.string(), z.any()).optional().describe('The schema as json.'), - prices: z - .object({ - perQuery: z.number().int().nonnegative().describe('Base price per query.'), - remoteMeta: z - .object({ - host: z.string().describe('The remote host'), - datastoreVersionHash: datastoreVersionHashValidation, - tableName: z.string().describe('The remote table name'), - }) - .optional(), - }) - .array() - .min(1) - .optional() - .describe( - 'Price details for a table call. This array will have an entry for each table called in this process. ' + - 'The first entry is the cost of the table packaged in this Datastore.', - ), - }), - ), - paymentAddress: addressValidation.optional(), -}); - -export type IVersionHistoryEntry = z.infer< - typeof DatastoreManifestSchema.shape.linkedVersions.element ->; -type IDatastoreManifest = z.infer; - -export default IDatastoreManifest; diff --git a/shared/specification/types/IDatastoreRunnerPricing.ts b/shared/specification/types/IDatastoreRunnerPricing.ts deleted file mode 100644 index 63bde21cf..000000000 --- a/shared/specification/types/IDatastoreRunnerPricing.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { z } from 'zod'; -import { datastoreVersionHashValidation } from '../common'; - -export const DatastoreRunnerPricing = z.object({ - minimum: z.number().int().nonnegative().optional().describe('Minimum price for this step.'), - perQuery: z.number().int().nonnegative().describe('Base price per query.'), - addOns: z - .object({ - perKb: z - .number() - .int() - .nonnegative() - .optional() - .describe('Optional add-on price per kilobyte of output data.'), - }) - .optional(), - remoteMeta: z - .object({ - host: z.string().describe('The remote host'), - datastoreVersionHash: datastoreVersionHashValidation, - runnerName: z.string().describe('The remote runner name'), - }) - .optional(), -}); -type IDatastoreRunnerPricing = z.infer; - -export default IDatastoreRunnerPricing; diff --git a/shared/specification/types/IPayment.ts b/shared/specification/types/IMicronote.ts similarity index 57% rename from shared/specification/types/IPayment.ts rename to shared/specification/types/IMicronote.ts index 922453154..c764b03b4 100644 --- a/shared/specification/types/IPayment.ts +++ b/shared/specification/types/IMicronote.ts @@ -22,28 +22,6 @@ export const MicronoteSchema = z.object({ guaranteeBlockHeight: blockHeightValidation, }); -export const PaymentSchema = z.object({ - micronote: MicronoteSchema.extend({ - holdAuthorizationCode: z - .string() - .length(16) - .optional() - .describe('A hold authorization code granting sub-holds on a micronote.'), - }).optional(), - credits: z - .object({ - id: z - .string() - .length(11) - .regex( - /^crd[A-Za-z0-9_]{8}$/, - 'This is not a Datastore credits id (starting with "cred", following by 8 alphanumeric characters).', - ), - secret: z.string().length(12), - }) - .optional(), -}); - -type IPayment = z.infer; +type IMicronote = z.infer; -export default IPayment; +export default IMicronote; From 32ef46bbf2774652635cfc76264aee977f9beed7 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 23 Feb 2023 17:23:20 -0500 Subject: [PATCH 079/147] feat(commons): host file monitoring --- shared/commons/config/hosts.ts | 39 +++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/shared/commons/config/hosts.ts b/shared/commons/config/hosts.ts index cc5564e27..7bfe7c3f6 100644 --- a/shared/commons/config/hosts.ts +++ b/shared/commons/config/hosts.ts @@ -3,28 +3,30 @@ import * as Path from 'path'; import { getCacheDirectory } from '../lib/dirUtils'; import { isSemverSatisfied } from '../lib/VersionUtils'; import { isPortInUse } from '../lib/utils'; +import { TypedEventEmitter } from '../lib/eventUtils'; -export default class UlixeeHostsConfig { +export default class UlixeeHostsConfig extends TypedEventEmitter<{ change: void }> { public static global = new UlixeeHostsConfig(Path.join(getCacheDirectory(), 'ulixee')); public hostByVersion: IUlixeeHostsConfig['hostByVersion'] = {}; + #watchHandle: Fs.FSWatcher; private get configPath(): string { return Path.join(this.directoryPath, 'hosts'); } constructor(readonly directoryPath: string) { - if (Fs.existsSync(this.configPath)) { - for (const file of Fs.readdirSync(this.configPath)) { - if (file.endsWith('.json')) { - const versionPath = Path.join(this.configPath, file); - const version = file.replace('.json', ''); - this.hostByVersion[version] = JSON.parse(Fs.readFileSync(versionPath, 'utf8')); - } - } - } else { + super(); + if (!Fs.existsSync(this.configPath)) { Fs.mkdirSync(this.configPath, { recursive: true }); } + + this.#watchHandle = Fs.watch( + this.configPath, + { recursive: true, persistent: false }, + this.reload.bind(this, true), + ); + this.reload(); } public setVersionHost(version: string, host: string): void { @@ -72,6 +74,23 @@ export default class UlixeeHostsConfig { return host; } + private reload(checkForChange = false): void { + const prev = checkForChange ? JSON.stringify(this.hostByVersion) : ''; + this.hostByVersion = {}; + + for (const file of Fs.readdirSync(this.configPath)) { + if (file.endsWith('.json')) { + const versionPath = Path.join(this.configPath, file); + const version = file.replace('.json', ''); + this.hostByVersion[version] = JSON.parse(Fs.readFileSync(versionPath, 'utf8')); + } + } + + if (checkForChange && prev !== JSON.stringify(this.hostByVersion)) { + this.emit('change'); + } + } + private save(version: string): void { const versionPath = Path.join(this.configPath, `${version}.json`); const host = this.hostByVersion[version]; From 4af008fb2a3427dd16123a1b12b80177d5baa2ad Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 23 Feb 2023 17:24:40 -0500 Subject: [PATCH 080/147] feat(net): emit request, response and event feat(net): timeout for connect --- shared/commons/interfaces/ITypedEventEmitter.ts | 2 ++ shared/commons/lib/Logger.ts | 6 ++++-- shared/net/interfaces/IConnectionToClient.ts | 13 ++++++++++++- shared/net/interfaces/ICoreEventPayload.ts | 2 +- shared/net/interfaces/ITransportToCore.ts | 2 +- shared/net/lib/ConnectionToClient.ts | 5 ++++- shared/net/lib/ConnectionToCore.ts | 4 ++-- shared/net/lib/WsTransportToCore.ts | 7 +++++-- 8 files changed, 31 insertions(+), 10 deletions(-) diff --git a/shared/commons/interfaces/ITypedEventEmitter.ts b/shared/commons/interfaces/ITypedEventEmitter.ts index bf688ea2b..0cb57024a 100644 --- a/shared/commons/interfaces/ITypedEventEmitter.ts +++ b/shared/commons/interfaces/ITypedEventEmitter.ts @@ -40,4 +40,6 @@ export default interface ITypedEventEmitter { listener: (this: this, event?: T[K]) => void, includeUnhandledEvents?: boolean, ): this; + + removeAllListeners(event?: string | symbol): this; } diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index cf5d9b478..79ad44ad3 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -321,7 +321,7 @@ function loadNamespaces(namespaces: string): void { registerNamespaceMapping((ns, active, skip) => { if (ns.includes('ulx:*') || ns.includes('ulx*') || ns === '*') { active.push( - /^apps[/-]chromealive*/, + /desktop[/-]?.*/, /hero[/-].*/, /agent\/.*/, /plugins\/.*/, @@ -343,7 +343,9 @@ registerNamespaceMapping((ns, active, skip) => { /sidechain[/-].*/, /ramps[/-].*/, ); - skip.push(/^apps[/-]chromealive*/, /DevtoolsSessionLogger/); + skip.push(/desktop[/-]?.*/, /DevtoolsSessionLogger/); + } else if (ns.includes('ulx:desktop')) { + active.push(/desktop[/-]?.*/); } else if (ns === 'ulx:mitm') { active.push(/agent[/-]mitm.*/); } else if (ns.includes('ulx:devtools') || ns === '*') { diff --git a/shared/net/interfaces/IConnectionToClient.ts b/shared/net/interfaces/IConnectionToClient.ts index 3e3ffb331..73f743e0f 100644 --- a/shared/net/interfaces/IConnectionToClient.ts +++ b/shared/net/interfaces/IConnectionToClient.ts @@ -2,6 +2,8 @@ import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; import ICoreEventPayload from './ICoreEventPayload'; import IApiHandlers from './IApiHandlers'; import ITransportToClient from './ITransportToClient'; +import ICoreRequestPayload from './ICoreRequestPayload'; +import ICoreResponsePayload from './ICoreResponsePayload'; export default interface IConnectionToClient extends ITypedEventEmitter { @@ -11,7 +13,16 @@ export default interface IConnectionToClient(event: ICoreEventPayload): void; } -export interface IConnectionToClientEvents { +export interface IConnectionToClientEvents< + IClientApiSpec extends IApiHandlers = IApiHandlers, + TKeys extends keyof IClientApiSpec & string = keyof IClientApiSpec & string, +> { 'send-error': Error; disconnected: Error | null; + request: { request: ICoreRequestPayload }; + response: { + request: ICoreRequestPayload; + response: ICoreResponsePayload; + }; + event: { event: ICoreEventPayload }; } diff --git a/shared/net/interfaces/ICoreEventPayload.ts b/shared/net/interfaces/ICoreEventPayload.ts index 5a60cee7f..51b825b24 100644 --- a/shared/net/interfaces/ICoreEventPayload.ts +++ b/shared/net/interfaces/ICoreEventPayload.ts @@ -1,4 +1,4 @@ -export default interface ICoreEventPayload { +export default interface ICoreEventPayload { eventType: T; listenerId?: string; data: Spec[T]; diff --git a/shared/net/interfaces/ITransportToCore.ts b/shared/net/interfaces/ITransportToCore.ts index 7f6fad79c..eb0613d51 100644 --- a/shared/net/interfaces/ITransportToCore.ts +++ b/shared/net/interfaces/ITransportToCore.ts @@ -12,7 +12,7 @@ export default interface ITransportToCore< > extends ITypedEventEmitter> { host: string; isConnected: boolean; - connect?(): Promise; + connect?(timeoutMs?: number): Promise; disconnect?(): Promise; send(message: RequestPayload): Promise; } diff --git a/shared/net/lib/ConnectionToClient.ts b/shared/net/lib/ConnectionToClient.ts index 8f5716e12..033c6c9bb 100644 --- a/shared/net/lib/ConnectionToClient.ts +++ b/shared/net/lib/ConnectionToClient.ts @@ -46,10 +46,11 @@ export default class ConnectionToClient< } public sendEvent(event: ICoreEventPayload): void { + this.emit('event', { event } as any); this.sendMessage(event); } - protected async handleRequest( + protected async handleRequest( apiRequest: ICoreRequestPayload, ): Promise { const { command, messageId } = apiRequest; @@ -61,6 +62,7 @@ export default class ConnectionToClient< try { const handler = this.apiHandlers[command]; if (!handler) throw new Error(`Unknown api requested: ${String(command)}`); + this.emit('request', { request: apiRequest }); data = await handler(...args); } catch (error) { error.stack ??= error.message; @@ -72,6 +74,7 @@ export default class ConnectionToClient< responseId: messageId, data, }; + this.emit('response', { request: apiRequest, response }); this.sendMessage(response); } diff --git a/shared/net/lib/ConnectionToCore.ts b/shared/net/lib/ConnectionToCore.ts index 310184f4b..01cf4f9f2 100644 --- a/shared/net/lib/ConnectionToCore.ts +++ b/shared/net/lib/ConnectionToCore.ts @@ -63,13 +63,13 @@ export default class ConnectionToCore< this.events.on(transport, 'message', this.onMessage.bind(this)); } - public async connect(isAutoConnect = false): Promise { + public async connect(isAutoConnect = false, timeoutMs = 30e3): Promise { if (!this.connectPromise) { this.didAutoConnect = isAutoConnect; this.connectStartTime = Date.now(); this.connectPromise = new Resolvable(); try { - const connectError = await this.transport.connect?.(); + const connectError = await this.transport.connect?.(timeoutMs); if (connectError) throw connectError; // disconnected during connect diff --git a/shared/net/lib/WsTransportToCore.ts b/shared/net/lib/WsTransportToCore.ts index decb961fe..304abf741 100644 --- a/shared/net/lib/WsTransportToCore.ts +++ b/shared/net/lib/WsTransportToCore.ts @@ -80,12 +80,15 @@ export default class WsTransportToCore< return Promise.resolve(); } - public async connect(): Promise { + public async connect(timeoutMs?: number): Promise { if (!this.connectPromise) { this.connectPromise = new Resolvable(); await this.hostPromise; - const webSocket = new WebSocket(this.host); + const webSocket = new WebSocket(this.host, { + followRedirects: false, + handshakeTimeout: timeoutMs, + }); this.events.group( 'preConnect', this.events.once(webSocket, 'close', this.onConnectError), From 1f55a51e91914f20465789eb6c15af4af52d9ca3 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 23 Feb 2023 17:25:20 -0500 Subject: [PATCH 081/147] chore(crypto): revert sha3 to sha256 --- shared/commons/lib/hashUtils.ts | 6 +++--- shared/crypto/lib/AddressOwnersTree.ts | 8 ++++---- shared/crypto/lib/AddressSignature.ts | 8 ++++---- shared/crypto/lib/Identity.ts | 4 ++-- shared/crypto/lib/MerkleTree.ts | 12 ++++++------ 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/shared/commons/lib/hashUtils.ts b/shared/commons/lib/hashUtils.ts index 6be776f23..e84ff4a12 100644 --- a/shared/commons/lib/hashUtils.ts +++ b/shared/commons/lib/hashUtils.ts @@ -3,8 +3,8 @@ import TypeSerializer from './TypeSerializer'; export const hashMessagePrefix = '\x18Ulixee Signed Message:\n'; -export function sha3(data: Buffer | string): Buffer { - return createHash('sha3-256').update(data).digest(); +export function sha256(data: Buffer | string): Buffer { + return createHash('sha256').update(data).digest(); } export function sortedJsonStringify(obj: T | null, ignoreProperties: (keyof T)[] = []): string { @@ -27,5 +27,5 @@ export function hashObject( let buffer = Buffer.from(`${hashMessagePrefix}${json.length}${json}`); if (options?.prefix) buffer = Buffer.concat([options.prefix, buffer]); - return createHash('sha3-256').update(buffer).digest(); + return sha256(buffer); } diff --git a/shared/crypto/lib/AddressOwnersTree.ts b/shared/crypto/lib/AddressOwnersTree.ts index 700802c88..2eea68598 100644 --- a/shared/crypto/lib/AddressOwnersTree.ts +++ b/shared/crypto/lib/AddressOwnersTree.ts @@ -1,4 +1,4 @@ -import { sha3 } from '@ulixee/commons/lib/hashUtils'; +import { sha256 } from '@ulixee/commons/lib/hashUtils'; import * as assert from 'assert'; import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; import { IMerkleProof } from '@ulixee/specification'; @@ -26,7 +26,7 @@ export default class AddressOwnersTree { } public static getIdentityIsOwnerProof(merkleTree: MerkleTree, identity: string): IMerkleProof[] { - return merkleTree.getProof(sha3(identity)); + return merkleTree.getProof(sha256(identity)); } public static getSignatureSettingsProof( @@ -78,7 +78,7 @@ export default class AddressOwnersTree { } } - const leaves = identities.map(sha3); + const leaves = identities.map(sha256); let fillLeaves = 2; if (leaves.length > 2) { fillLeaves = 6; @@ -111,6 +111,6 @@ export default class AddressOwnersTree { salt?.toString('hex') ?? '', publicKeyIndices?.join(',') ?? '', ]; - return sha3(parts.join('')); + return sha256(parts.join('')); } } diff --git a/shared/crypto/lib/AddressSignature.ts b/shared/crypto/lib/AddressSignature.ts index f42d11cd6..2e221d834 100644 --- a/shared/crypto/lib/AddressSignature.ts +++ b/shared/crypto/lib/AddressSignature.ts @@ -1,7 +1,7 @@ import { IAddressOwnershipProof, IAddressSignature } from '@ulixee/specification'; import Identity from '@ulixee/crypto/lib/Identity'; import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; -import { sha3 } from '@ulixee/commons/lib/hashUtils'; +import { sha256 } from '@ulixee/commons/lib/hashUtils'; import { MerklePosition } from '@ulixee/specification/types/IMerkleProof'; import IAddressSettings from '../interfaces/IAddressSettings'; import AddressOwnersTree from './AddressOwnersTree'; @@ -37,7 +37,7 @@ export default class AddressSignature { public isValidWalletOwnershipProof(owner: IAddressOwnershipProof): boolean { const isValidProof = MerkleTree.verify( owner.ownershipMerkleProofs, - sha3(owner.identity), + sha256(owner.identity), this.treeRoot, ); if (!isValidProof) return false; @@ -90,7 +90,7 @@ export default class AddressSignature { */ const isMatch = Identity.verify( signer.identity, - sha3(Buffer.concat([messageHash, ...signatures])), + sha256(Buffer.concat([messageHash, ...signatures])), signer.signature, ); if (isMatch === false) { @@ -138,7 +138,7 @@ export default class AddressSignature { const ownerProof: IAddressOwnershipProof = { ownershipMerkleProofs: identityProof, identity: identity.bech32, - signature: identity.sign(sha3(Buffer.concat([hash, ...signatures]))), + signature: identity.sign(sha256(Buffer.concat([hash, ...signatures]))), }; signatures.push(ownerProof.signature); return ownerProof; diff --git a/shared/crypto/lib/Identity.ts b/shared/crypto/lib/Identity.ts index 995c12093..6c7cf1edf 100644 --- a/shared/crypto/lib/Identity.ts +++ b/shared/crypto/lib/Identity.ts @@ -1,7 +1,7 @@ import { promises as fs, readFileSync } from 'fs'; import * as path from 'path'; import { createPrivateKey, generateKeyPairSync, KeyExportOptions, KeyObject } from 'crypto'; -import { sha3 } from '@ulixee/commons/lib/hashUtils'; +import { sha256 } from '@ulixee/commons/lib/hashUtils'; import { existsAsync } from '@ulixee/commons/lib/fileUtils'; import Log from '@ulixee/commons/lib/Logger'; import { decodeBuffer, encodeBuffer } from '@ulixee/commons/lib/bufferUtils'; @@ -44,7 +44,7 @@ export default class Identity { } public verifyKeys(): void { - const hashedMessage = sha3(Buffer.from('signed_test_message')); + const hashedMessage = sha256(Buffer.from('signed_test_message')); const signature = this.sign(hashedMessage); const isValid = Identity.verify(this.bech32, hashedMessage, signature); if (!isValid) { diff --git a/shared/crypto/lib/MerkleTree.ts b/shared/crypto/lib/MerkleTree.ts index 3d73392a4..b80845baf 100644 --- a/shared/crypto/lib/MerkleTree.ts +++ b/shared/crypto/lib/MerkleTree.ts @@ -1,15 +1,15 @@ -import { sha3 } from '@ulixee/commons/lib/hashUtils'; +import { sha256 } from '@ulixee/commons/lib/hashUtils'; import IMerkleProof, { MerklePosition } from '@ulixee/specification/types/IMerkleProof'; /** - * Use sha3 instead of default keccak used in the network. + * Use sha256 instead of default keccak used in the network. * This ensures the leaves have a different (albeit slight) encoding * - * Keccak has different padding than sha3 + * Keccak has different padding than sha256 * @param content */ function createHash(content: Buffer | string): Buffer { - return sha3(content); + return sha256(content); } interface Layer { @@ -72,8 +72,8 @@ export default class MerkleTree { * const proof = tree.getProof(leaves[2]) * * @example - * const leaves = ['a', 'b', 'a'].map(x => sha3(x)) - * const tree = new MerkleTree(leaves, sha3) + * const leaves = ['a', 'b', 'a'].map(x => sha256(x)) + * const tree = new MerkleTree(leaves, sha256) * const proof = tree.getProof(leaves[2], 2) */ public getProof(leaf: Buffer, index?: number): IMerkleProof[] { From 1b91957d5080ee2d92ecb81729bc5ff45faf8504 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 24 Feb 2023 16:01:54 -0500 Subject: [PATCH 082/147] fix(commons): no unhandled timeouts --- shared/commons/lib/Resolvable.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/shared/commons/lib/Resolvable.ts b/shared/commons/lib/Resolvable.ts index c20711156..f2c60f8c8 100644 --- a/shared/commons/lib/Resolvable.ts +++ b/shared/commons/lib/Resolvable.ts @@ -23,8 +23,9 @@ export default class Resolvable implements IResolvablePromise, Promi }); if (timeoutMillis !== undefined && timeoutMillis !== null) { - this.timeout = ( - setTimeout(this.rejectWithTimeout.bind(this, timeoutMessage), timeoutMillis) as any + this.timeout = setTimeout( + this.rejectWithTimeout.bind(this, timeoutMessage), + timeoutMillis, ).unref(); } this.resolve = this.resolve.bind(this); @@ -93,6 +94,6 @@ export default class Resolvable implements IResolvablePromise, Promi private rejectWithTimeout(message: string): void { const error = new TimeoutError(message); error.stack = `TimeoutError: ${message}\n${this.stack}`; - this.reject(error); + this.reject(error, true); } } From 9ba3970cbbe3ebf40cf105e49f1f0d9abb8b8d77 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 24 Feb 2023 16:59:18 -0500 Subject: [PATCH 083/147] fix(commons): watch not available on linux --- shared/commons/config/hosts.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/shared/commons/config/hosts.ts b/shared/commons/config/hosts.ts index 7bfe7c3f6..8dfb40a27 100644 --- a/shared/commons/config/hosts.ts +++ b/shared/commons/config/hosts.ts @@ -21,11 +21,14 @@ export default class UlixeeHostsConfig extends TypedEventEmitter<{ change: void Fs.mkdirSync(this.configPath, { recursive: true }); } - this.#watchHandle = Fs.watch( - this.configPath, - { recursive: true, persistent: false }, - this.reload.bind(this, true), - ); + // note supported on linux! + if (process.platform === 'win32' || process.platform === 'darwin') { + this.#watchHandle = Fs.watch( + this.configPath, + { recursive: true, persistent: false }, + this.reload.bind(this, true), + ); + } this.reload(); } From 36a2cf671a7f2813debda069719ce63f90deb314 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 24 Feb 2023 20:08:40 -0500 Subject: [PATCH 084/147] fix(commons): wait to register hosts listener --- shared/commons/config/hosts.ts | 19 +++++++++++-------- shared/commons/lib/TypedEventEmitter.ts | 4 ++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/shared/commons/config/hosts.ts b/shared/commons/config/hosts.ts index 8dfb40a27..418fb81f6 100644 --- a/shared/commons/config/hosts.ts +++ b/shared/commons/config/hosts.ts @@ -21,14 +21,17 @@ export default class UlixeeHostsConfig extends TypedEventEmitter<{ change: void Fs.mkdirSync(this.configPath, { recursive: true }); } - // note supported on linux! - if (process.platform === 'win32' || process.platform === 'darwin') { - this.#watchHandle = Fs.watch( - this.configPath, - { recursive: true, persistent: false }, - this.reload.bind(this, true), - ); - } + // not supported on linux! + this.onEventListenerAdded = event => { + if (event !== 'change') return; + if (process.platform === 'win32' || process.platform === 'darwin') { + this.#watchHandle = Fs.watch( + this.configPath, + { recursive: true, persistent: false }, + this.reload.bind(this, true), + ); + } + }; this.reload(); } diff --git a/shared/commons/lib/TypedEventEmitter.ts b/shared/commons/lib/TypedEventEmitter.ts index 31e6610b4..501d75d0d 100644 --- a/shared/commons/lib/TypedEventEmitter.ts +++ b/shared/commons/lib/TypedEventEmitter.ts @@ -9,6 +9,8 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped public storeEventsWithoutListeners = false; public EventTypes: T; + public onEventListenerAdded?: (event: K) => void; + #logger?: IBoundLog; private pendingIdCounter = 0; @@ -103,6 +105,7 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped includeUnhandledEvents = false, ): this { super.on(eventType, listenerFn); + this.onListener?.(eventType); return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); } @@ -119,6 +122,7 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped includeUnhandledEvents = false, ): this { super.once(eventType, listenerFn); + this.onListener?.(eventType); return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); } From 179964eab5b432117831423e8ac333f7dd0fa360 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 24 Feb 2023 20:10:40 -0500 Subject: [PATCH 085/147] fix(commons): typo --- shared/commons/lib/TypedEventEmitter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/commons/lib/TypedEventEmitter.ts b/shared/commons/lib/TypedEventEmitter.ts index 501d75d0d..66074dc83 100644 --- a/shared/commons/lib/TypedEventEmitter.ts +++ b/shared/commons/lib/TypedEventEmitter.ts @@ -105,7 +105,7 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped includeUnhandledEvents = false, ): this { super.on(eventType, listenerFn); - this.onListener?.(eventType); + this.onEventListenerAdded?.(eventType); return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); } @@ -122,7 +122,7 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped includeUnhandledEvents = false, ): this { super.once(eventType, listenerFn); - this.onListener?.(eventType); + this.onEventListenerAdded?.(eventType); return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); } From 376ea7f00c9e9735e0256373c61abbbb95815298 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Sat, 25 Feb 2023 14:22:21 -0500 Subject: [PATCH 086/147] v2.0.0-alpha.19 --- shared/CHANGELOG.md | 28 ++++++++++++++++++++++++++++ shared/commons/CHANGELOG.md | 25 +++++++++++++++++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 8 ++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 17 +++++++++++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 12 ++++++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 12 ++++++++++++ shared/specification/package.json | 2 +- 12 files changed, 112 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index d2c83c2c5..9e580448a 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,34 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) + + +### Bug Fixes + +* **commons:** allow clearing sourcemap paths ([4d14167](https://github.com/ulixee/shared/commit/4d141673bd34e22d556539e6eb7bf8e63d9c9c3e)) +* **commons:** no unhandled timeouts ([5428d4a](https://github.com/ulixee/shared/commit/5428d4a2856c7c86dd4737522280a05b8f5d8c8e)) +* **commons:** remove memory for once events ([e9b70ac](https://github.com/ulixee/shared/commit/e9b70ac08ab94c46bd00baa43d56a0b1820f78b1)) +* **commons:** serialize objects named error too ([a915057](https://github.com/ulixee/shared/commit/a9150577b51572a25d3f3ca8144680ff87bf8b0b)) +* **commons:** typo ([38eba49](https://github.com/ulixee/shared/commit/38eba496ada28165dc5e99acc48b0ec81040569c)) +* **commons:** wait to register hosts listener ([02fcddb](https://github.com/ulixee/shared/commit/02fcddbf508c7392143c536707721a611c8b0205)) +* **commons:** watch not available on linux ([cbd982b](https://github.com/ulixee/shared/commit/cbd982bec27c6f9b9c794ff99d01ee50c553ff59)) +* **net:** default to ws transport over actual wire ([cbc0adc](https://github.com/ulixee/shared/commit/cbc0adcf0c899bfdc4d24ca5beccae7daf24869e)) +* **schema:** serialization fixes for schema object ([24ce6cc](https://github.com/ulixee/shared/commit/24ce6cc5605aaff5b1b306755f34e431c8f70cf3)) + + +### Features + +* added Datastore.fetchInternalTable + tweaked Datastore.stream ([5525bb4](https://github.com/ulixee/shared/commit/5525bb4cf0021ac933cfe4fb8e23b631e6aa0f8d)) +* **commons:** host file monitoring ([01d1e53](https://github.com/ulixee/shared/commit/01d1e53b5087b2b80f96a0bfc504323172adbb81)) +* **commons:** read embedded sourcemap content ([a20db0c](https://github.com/ulixee/shared/commit/a20db0c3c400939ef403a4c7c779f4a49811c92f)) +* **net:** emit request, response and event ([9ed0201](https://github.com/ulixee/shared/commit/9ed02013579ee3bc206182cfce85def3c0271034)) +* **specification:** add dns domains to datastores ([c36e3d7](https://github.com/ulixee/shared/commit/c36e3d7bbc40aef1f9323178556d59a7d8b203e5)) + + + + + # [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 6dca6376d..cef863b34 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,31 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) + + +### Bug Fixes + +* **commons:** allow clearing sourcemap paths ([4d14167](https://github.com/ulixee/shared/commit/4d141673bd34e22d556539e6eb7bf8e63d9c9c3e)) +* **commons:** no unhandled timeouts ([5428d4a](https://github.com/ulixee/shared/commit/5428d4a2856c7c86dd4737522280a05b8f5d8c8e)) +* **commons:** remove memory for once events ([e9b70ac](https://github.com/ulixee/shared/commit/e9b70ac08ab94c46bd00baa43d56a0b1820f78b1)) +* **commons:** serialize objects named error too ([a915057](https://github.com/ulixee/shared/commit/a9150577b51572a25d3f3ca8144680ff87bf8b0b)) +* **commons:** typo ([38eba49](https://github.com/ulixee/shared/commit/38eba496ada28165dc5e99acc48b0ec81040569c)) +* **commons:** wait to register hosts listener ([02fcddb](https://github.com/ulixee/shared/commit/02fcddbf508c7392143c536707721a611c8b0205)) +* **commons:** watch not available on linux ([cbd982b](https://github.com/ulixee/shared/commit/cbd982bec27c6f9b9c794ff99d01ee50c553ff59)) +* **net:** default to ws transport over actual wire ([cbc0adc](https://github.com/ulixee/shared/commit/cbc0adcf0c899bfdc4d24ca5beccae7daf24869e)) + + +### Features + +* **commons:** host file monitoring ([01d1e53](https://github.com/ulixee/shared/commit/01d1e53b5087b2b80f96a0bfc504323172adbb81)) +* **commons:** read embedded sourcemap content ([a20db0c](https://github.com/ulixee/shared/commit/a20db0c3c400939ef403a4c7c779f4a49811c92f)) +* **net:** emit request, response and event ([9ed0201](https://github.com/ulixee/shared/commit/9ed02013579ee3bc206182cfce85def3c0271034)) + + + + + # [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) diff --git a/shared/commons/package.json b/shared/commons/package.json index 936c0e479..7af026327 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.18", + "version": "2.0.0-alpha.19", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 8a77594c8..f5e2470cc 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) + +**Note:** Version bump only for package @ulixee/crypto + + + + + # [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 2752ea111..f0db036fb 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.18", + "version": "2.0.0-alpha.19", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.18", - "@ulixee/crypto": "2.0.0-alpha.18", - "@ulixee/specification": "2.0.0-alpha.18", + "@ulixee/commons": "2.0.0-alpha.19", + "@ulixee/crypto": "2.0.0-alpha.19", + "@ulixee/specification": "2.0.0-alpha.19", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index 48d88ed0e..3dcfd96d8 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.18", + "version": "2.0.0-alpha.19", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index 660a86d6f..a21550134 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,23 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) + + +### Bug Fixes + +* **net:** default to ws transport over actual wire ([cbc0adc](https://github.com/ulixee/shared/commit/cbc0adcf0c899bfdc4d24ca5beccae7daf24869e)) +* **schema:** serialization fixes for schema object ([24ce6cc](https://github.com/ulixee/shared/commit/24ce6cc5605aaff5b1b306755f34e431c8f70cf3)) + + +### Features + +* **net:** emit request, response and event ([9ed0201](https://github.com/ulixee/shared/commit/9ed02013579ee3bc206182cfce85def3c0271034)) + + + + + # [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) diff --git a/shared/net/package.json b/shared/net/package.json index 2d316a707..6e53924df 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.18", + "version": "2.0.0-alpha.19", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.18", + "@ulixee/commons": "2.0.0-alpha.19", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index 3f11e84af..81411ccff 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) + + +### Bug Fixes + +* **commons:** allow clearing sourcemap paths ([4d14167](https://github.com/ulixee/shared/commit/4d141673bd34e22d556539e6eb7bf8e63d9c9c3e)) +* **schema:** serialization fixes for schema object ([24ce6cc](https://github.com/ulixee/shared/commit/24ce6cc5605aaff5b1b306755f34e431c8f70cf3)) + + + + + # [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) diff --git a/shared/schema/package.json b/shared/schema/package.json index ac54ca14e..e2fd04dce 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.18", + "version": "2.0.0-alpha.19", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 1c88abab4..0af7a91dd 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) + + +### Features + +* added Datastore.fetchInternalTable + tweaked Datastore.stream ([5525bb4](https://github.com/ulixee/shared/commit/5525bb4cf0021ac933cfe4fb8e23b631e6aa0f8d)) +* **specification:** add dns domains to datastores ([c36e3d7](https://github.com/ulixee/shared/commit/c36e3d7bbc40aef1f9323178556d59a7d8b203e5)) + + + + + # [2.0.0-alpha.18](https://github.com/ulixee/shared/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2023-01-17) diff --git a/shared/specification/package.json b/shared/specification/package.json index 3a797500a..85698d27a 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.18", + "version": "2.0.0-alpha.19", "description": "", "main": "./index.js", "license": "MIT", From c952b49740ed379d1955e565a41b86036e19962c Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Sun, 26 Feb 2023 12:41:58 -0500 Subject: [PATCH 087/147] chore(commons): add miner logs fix(net): no unhandled rejections on connect --- shared/commons/lib/Logger.ts | 2 ++ shared/net/lib/ConnectionToCore.ts | 2 +- shared/net/lib/WsTransportToCore.ts | 10 +++++----- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index 79ad44ad3..1af9e9e84 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -326,6 +326,7 @@ registerNamespaceMapping((ns, active, skip) => { /agent\/.*/, /plugins\/.*/, /net\/.*/, + /miner\/.*/, /datastore[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, @@ -338,6 +339,7 @@ registerNamespaceMapping((ns, active, skip) => { /agent\/.*/, /plugins\/.*/, /net\/.*/, + /miner\/.*/, /datastore[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, diff --git a/shared/net/lib/ConnectionToCore.ts b/shared/net/lib/ConnectionToCore.ts index 01cf4f9f2..71b708409 100644 --- a/shared/net/lib/ConnectionToCore.ts +++ b/shared/net/lib/ConnectionToCore.ts @@ -92,7 +92,7 @@ export default class ConnectionToCore< if (this.didAutoConnect) { this.connectPromise.resolve(err); } else { - this.connectPromise.reject(err); + this.connectPromise.reject(err, true); } } } diff --git a/shared/net/lib/WsTransportToCore.ts b/shared/net/lib/WsTransportToCore.ts index 304abf741..6d167b172 100644 --- a/shared/net/lib/WsTransportToCore.ts +++ b/shared/net/lib/WsTransportToCore.ts @@ -27,7 +27,7 @@ export default class WsTransportToCore< public isConnected = false; public isDisconnecting = false; - private connectPromise: IResolvablePromise; + private connectPromise: IResolvablePromise; private webSocket: WebSocket; private events = new EventSubscriber(); private readonly hostPromise: Promise; @@ -104,8 +104,7 @@ export default class WsTransportToCore< this.webSocket = webSocket; this.events.on(webSocket, 'message', this.onMessage); } - const connectOrError = await this.connectPromise; - if (connectOrError) throw connectOrError; + await this.connectPromise; this.isConnected = true; this.emit('connected'); } @@ -116,8 +115,9 @@ export default class WsTransportToCore< } private onConnectError(error: Error): void { - if (error instanceof Error) this.connectPromise.resolve(error); - else this.connectPromise.resolve(new Error(`Error connecting to Websocket host -> ${error}`)); + if (error instanceof Error) this.connectPromise.reject(error); + else + this.connectPromise.reject(new Error(`Error connecting to Websocket host -> ${error}`), true); } private setHost(host: string): void { From f5dd6bbf298e2f91e1cbf8cb690436038f2593c2 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 1 Mar 2023 11:46:14 -0500 Subject: [PATCH 088/147] fix(net): not emitting transport disconnected --- shared/net/lib/ConnectionToClient.ts | 13 ++++++++----- shared/net/lib/WsTransportToClient.ts | 5 ++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/shared/net/lib/ConnectionToClient.ts b/shared/net/lib/ConnectionToClient.ts index 033c6c9bb..33e868d2b 100644 --- a/shared/net/lib/ConnectionToClient.ts +++ b/shared/net/lib/ConnectionToClient.ts @@ -36,11 +36,14 @@ export default class ConnectionToClient< if (this.disconnectPromise) return this.disconnectPromise; this.disconnectPromise = new Promise(async resolve => { - await this.transport.disconnect?.(); - this.events.close(); - this.transport.emit('disconnected'); - this.emit('disconnected', error); - resolve(); + try { + this.events.close(); + await this.transport.disconnect?.(); + } finally { + this.transport.emit('disconnected'); + this.emit('disconnected', error); + resolve(); + } }); return this.disconnectPromise; } diff --git a/shared/net/lib/WsTransportToClient.ts b/shared/net/lib/WsTransportToClient.ts index be53cb544..93e4a73ec 100644 --- a/shared/net/lib/WsTransportToClient.ts +++ b/shared/net/lib/WsTransportToClient.ts @@ -4,6 +4,7 @@ import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEve import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; import { IncomingMessage } from 'http'; +import { bindFunctions } from '@ulixee/commons/lib/utils'; import ITransportToClient, { ITransportToClientEvents } from '../interfaces/ITransportToClient'; import { sendWsCloseUnexpectedError, wsSend } from './WsUtils'; import IApiHandlers from '../interfaces/IApiHandlers'; @@ -16,7 +17,7 @@ export default class WsTransportToClient Date: Fri, 3 Mar 2023 20:40:06 -0500 Subject: [PATCH 089/147] chore: rename miner to cloud --- shared/commons/config/hosts.ts | 12 +++++++----- shared/commons/lib/Logger.ts | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/shared/commons/config/hosts.ts b/shared/commons/config/hosts.ts index 418fb81f6..2de000f08 100644 --- a/shared/commons/config/hosts.ts +++ b/shared/commons/config/hosts.ts @@ -39,16 +39,16 @@ export default class UlixeeHostsConfig extends TypedEventEmitter<{ change: void if (!host) { delete this.hostByVersion[version]; } else { - let minerModulePath: string; + let cloudModulePath: string; try { - minerModulePath = require.resolve('@ulixee/miner'); + cloudModulePath = require.resolve('@ulixee/cloud'); } catch (err) { /* no-op */ } this.hostByVersion[version] = { host, nodePath: process.execPath, - minerModulePath, + cloudModulePath, }; } this.save(version); @@ -88,7 +88,9 @@ export default class UlixeeHostsConfig extends TypedEventEmitter<{ change: void if (file.endsWith('.json')) { const versionPath = Path.join(this.configPath, file); const version = file.replace('.json', ''); - this.hostByVersion[version] = JSON.parse(Fs.readFileSync(versionPath, 'utf8')); + try { + this.hostByVersion[version] = JSON.parse(Fs.readFileSync(versionPath, 'utf8')); + } catch {} } } @@ -119,5 +121,5 @@ export interface IUlixeeHostsConfig { export interface IUlixeeHostConfig { host: string; nodePath: string; - minerModulePath: string; + cloudModulePath: string; } diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index 1af9e9e84..3e2f4eb6b 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -326,7 +326,7 @@ registerNamespaceMapping((ns, active, skip) => { /agent\/.*/, /plugins\/.*/, /net\/.*/, - /miner\/.*/, + /cloud\/.*/, /datastore[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, @@ -339,7 +339,7 @@ registerNamespaceMapping((ns, active, skip) => { /agent\/.*/, /plugins\/.*/, /net\/.*/, - /miner\/.*/, + /cloud\/.*/, /datastore[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, From f4133597642d1d45c1cf5cd2c4decf7fc808e23b Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Sat, 1 Apr 2023 10:43:28 -0400 Subject: [PATCH 090/147] fix(commons): always handle emitter errors --- shared/commons/lib/TypedEventEmitter.ts | 21 +++++++++++++++++++++ shared/commons/lib/fileUtils.ts | 9 +++++++++ shared/crypto/cli.ts | 10 +++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/shared/commons/lib/TypedEventEmitter.ts b/shared/commons/lib/TypedEventEmitter.ts index 66074dc83..8d6ae4a16 100644 --- a/shared/commons/lib/TypedEventEmitter.ts +++ b/shared/commons/lib/TypedEventEmitter.ts @@ -20,6 +20,14 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped private storedEventsByType = new Map(); private reemitterCountByEventType: { [eventType: string]: number } = {}; + constructor() { + super(); + this.defaultErrorLogger = this.defaultErrorLogger.bind(this); + if ('captureRejections' in this) (this as any).captureRejections = true; + // add an error logger as a backup + super.on('error', this.defaultErrorLogger); + } + public cancelPendingEvents(message?: string, excludeEvents?: (keyof T & string)[]): void { this.storedEventsByType.clear(); const events = [...this.pendingWaitEventsById.values()]; @@ -105,6 +113,10 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped includeUnhandledEvents = false, ): this { super.on(eventType, listenerFn); + // if we're adding an error logger, we can remove the default logger + if (eventType === 'error' && listenerFn !== this.defaultErrorLogger as any) { + super.off('error', this.defaultErrorLogger); + } this.onEventListenerAdded?.(eventType); return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); } @@ -113,6 +125,10 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped eventType: K, listenerFn: (this: this, event?: T[K]) => any, ): this { + // if we're adding an error logger, we can remove the default logger + if (eventType === 'error' && listenerFn !== this.defaultErrorLogger as any) { + super.on('error', this.defaultErrorLogger); + } return super.off(eventType, listenerFn); } @@ -175,6 +191,11 @@ export default class TypedEventEmitter extends EventEmitter implements ITyped return this.replayOrClearMissedEvents(includeUnhandledEvents, eventType); } + protected defaultErrorLogger(this: this, error: Error): void { + if (this.#logger) this.#logger.error('EventListenerError', error); + else console.warn('EventListenerError', error); + } + private replayOrClearMissedEvents( shouldReplay: boolean, eventType: K, diff --git a/shared/commons/lib/fileUtils.ts b/shared/commons/lib/fileUtils.ts index 858c55293..1e3917a7f 100644 --- a/shared/commons/lib/fileUtils.ts +++ b/shared/commons/lib/fileUtils.ts @@ -11,6 +11,15 @@ export async function existsAsync(path: string): Promise { } } +export async function copyDir(fromDir: string, toDir: string): Promise { + await Fs.mkdir(toDir, { recursive: true }); + for (const file of await Fs.readdir(fromDir, { withFileTypes: true })) { + const path = `${fromDir}/${file.name}`; + if (file.isDirectory()) await copyDir(path, `${toDir}/${file.name}`); + else await Fs.copyFile(path, `${toDir}/${file.name}`); + } +} + export async function readFileAsJson(path: string): Promise { const buffer = await Fs.readFile(path, 'utf8'); if (!buffer) return null; diff --git a/shared/crypto/cli.ts b/shared/crypto/cli.ts index f414e92af..8581c06c4 100644 --- a/shared/crypto/cli.ts +++ b/shared/crypto/cli.ts @@ -54,9 +54,11 @@ export default function cliCommands(): Command { 'Add salt (noise) to your claims signatures', randomBytes(32).toString('base64'), ) + + .option('-q, --quiet', "Don't log any details to the console.", false) .action(async (signerPattern: string, filename: string, args): Promise => { try { - const { transferSignatures, claimSignatures, transferSalt, claimSalt } = args; + const { transferSignatures, claimSignatures, transferSalt, claimSalt, quiet } = args; const signersCount = signerPattern.length; assert( signerPattern.length <= 6, @@ -100,8 +102,10 @@ export default function cliCommands(): Command { filename = filename.replace(Path.extname(filename), ''); } const filepath = await address.save(true, Path.basename(filename), Path.dirname(filename)); - console.log('Wrote address: %s to %s', address.bech32, filepath); // eslint-disable-line no-console - console.log(TypeSerializer.stringify(address.toJSON(), { format: true })); // eslint-disable-line no-console + if (!quiet) { + console.log('Wrote address: %s to %s', address.bech32, filepath); // eslint-disable-line no-console + console.log(TypeSerializer.stringify(address.toJSON(), { format: true })); // eslint-disable-line no-console + } } catch (err) { logError(err); } From 1faca06e430ccc1251e11bd0532a99e6526c33f6 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 5 Apr 2023 08:54:42 -0400 Subject: [PATCH 091/147] fix(commons): global instance of check --- shared/commons/interfaces/IPendingWaitEvent.ts | 2 ++ shared/commons/interfaces/TimeoutError.ts | 2 ++ shared/commons/lib/addGlobalInstance.ts | 15 +++++++++++++++ shared/commons/lib/errors.ts | 4 ++++ shared/net/errors/DisconnectedError.ts | 3 +++ shared/net/errors/RemoteError.ts | 4 ++++ 6 files changed, 30 insertions(+) create mode 100644 shared/commons/lib/addGlobalInstance.ts diff --git a/shared/commons/interfaces/IPendingWaitEvent.ts b/shared/commons/interfaces/IPendingWaitEvent.ts index 8a13cbaf9..4d0ab5383 100644 --- a/shared/commons/interfaces/IPendingWaitEvent.ts +++ b/shared/commons/interfaces/IPendingWaitEvent.ts @@ -1,3 +1,4 @@ +import addGlobalInstance from '../lib/addGlobalInstance'; import IResolvablePromise from './IResolvablePromise'; import { registerSerializableErrorType } from '../lib/TypeSerializer'; @@ -15,4 +16,5 @@ export default interface IPendingWaitEvent { error: CanceledPromiseError; } +addGlobalInstance(CanceledPromiseError); registerSerializableErrorType(CanceledPromiseError); diff --git a/shared/commons/interfaces/TimeoutError.ts b/shared/commons/interfaces/TimeoutError.ts index d5654ffae..100a497c8 100644 --- a/shared/commons/interfaces/TimeoutError.ts +++ b/shared/commons/interfaces/TimeoutError.ts @@ -1,4 +1,5 @@ import { registerSerializableErrorType } from '../lib/TypeSerializer'; +import addGlobalInstance from '../lib/addGlobalInstance'; export default class TimeoutError extends Error { constructor(message?: string) { @@ -7,4 +8,5 @@ export default class TimeoutError extends Error { } } +addGlobalInstance(TimeoutError); registerSerializableErrorType(TimeoutError); diff --git a/shared/commons/lib/addGlobalInstance.ts b/shared/commons/lib/addGlobalInstance.ts new file mode 100644 index 000000000..2d12bd6b8 --- /dev/null +++ b/shared/commons/lib/addGlobalInstance.ts @@ -0,0 +1,15 @@ +export default function addGlobalInstance(...constructors: Function[]): void { + for (const constructor of constructors) { + if (!constructor.prototype) continue; + const instanceSymbol = Symbol.for(`@ulixee/${constructor.name}`); + if (constructor.prototype[instanceSymbol] === true) continue; + + constructor.prototype[instanceSymbol] = true; + + Object.defineProperty(constructor, Symbol.hasInstance, { + value: function hasInstance(candidate): boolean { + return this === constructor && !!candidate[instanceSymbol]; + }, + }); + } +} diff --git a/shared/commons/lib/errors.ts b/shared/commons/lib/errors.ts index 013e1b5dd..98e077953 100644 --- a/shared/commons/lib/errors.ts +++ b/shared/commons/lib/errors.ts @@ -1,4 +1,6 @@ // eslint-disable-next-line max-classes-per-file +import addGlobalInstance from './addGlobalInstance'; + class UlixeeError extends Error { constructor(override message, public code, public data?: object) { // Calling parent constructor of base Error class. @@ -29,4 +31,6 @@ class APIError extends UlixeeError { } } +addGlobalInstance(UlixeeError, APIError); + export { APIError, UlixeeError }; diff --git a/shared/net/errors/DisconnectedError.ts b/shared/net/errors/DisconnectedError.ts index 5cfd57832..7b91fe875 100644 --- a/shared/net/errors/DisconnectedError.ts +++ b/shared/net/errors/DisconnectedError.ts @@ -1,5 +1,6 @@ import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; import { registerSerializableErrorType } from '@ulixee/commons/lib/TypeSerializer'; +import addGlobalInstance from '@ulixee/commons/lib/addGlobalInstance'; export default class DisconnectedError extends CanceledPromiseError { public code = 'DisconnectedError'; @@ -8,4 +9,6 @@ export default class DisconnectedError extends CanceledPromiseError { this.name = 'DisconnectedError'; } } + +addGlobalInstance(DisconnectedError); registerSerializableErrorType(DisconnectedError); diff --git a/shared/net/errors/RemoteError.ts b/shared/net/errors/RemoteError.ts index 16b7f625c..33e0e401d 100644 --- a/shared/net/errors/RemoteError.ts +++ b/shared/net/errors/RemoteError.ts @@ -1,3 +1,5 @@ +import addGlobalInstance from '@ulixee/commons/lib/addGlobalInstance'; + export default class RemoteError extends Error { private readonly type: string; private readonly code: string; @@ -30,3 +32,5 @@ export default class RemoteError extends Error { return `${this.message}: ${codeMessage}${extras}`; } } + +addGlobalInstance(RemoteError); From 7bc87e66e569ea0c7dbff4e057b14365fd025570 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 7 Apr 2023 13:47:14 -0400 Subject: [PATCH 092/147] fix(commons): global instance bug --- shared/commons/lib/addGlobalInstance.ts | 2 +- shared/commons/lib/utils.ts | 17 +++++++---------- shared/crypto/cli.ts | 1 - 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/shared/commons/lib/addGlobalInstance.ts b/shared/commons/lib/addGlobalInstance.ts index 2d12bd6b8..a9c22a065 100644 --- a/shared/commons/lib/addGlobalInstance.ts +++ b/shared/commons/lib/addGlobalInstance.ts @@ -8,7 +8,7 @@ export default function addGlobalInstance(...constructors: Function[]): void { Object.defineProperty(constructor, Symbol.hasInstance, { value: function hasInstance(candidate): boolean { - return this === constructor && !!candidate[instanceSymbol]; + return this === constructor && !!candidate?.[instanceSymbol]; }, }); } diff --git a/shared/commons/lib/utils.ts b/shared/commons/lib/utils.ts index 490677dde..ab3d89e3f 100644 --- a/shared/commons/lib/utils.ts +++ b/shared/commons/lib/utils.ts @@ -34,9 +34,12 @@ export function isPortInUse(port: number | string): Promise { }); } -// @deprecated - change case... can't remove due to hero dependency -export function getCallSite(priorToFilename?: string, endFilename?: string): ISourceCodeLocation[] { - return getCallsite(priorToFilename, endFilename); +function customStacktrace(_: Error, callsite: NodeJS.CallSite[]): ISourceCodeLocation[] { + return callsite.map(x => ({ + filename: x.getFileName(), + line: x.getLineNumber(), + column: x.getColumnNumber() - 1, + })); } export function getCallsite(priorToFilename?: string, endFilename?: string): ISourceCodeLocation[] { @@ -44,13 +47,7 @@ export function getCallsite(priorToFilename?: string, endFilename?: string): ISo const startingTraceLimit = Error.stackTraceLimit; Error.stackTraceLimit = 25; - Error.prepareStackTrace = (_, callsite): ISourceCodeLocation[] => { - return callsite.map(x => ({ - filename: x.getFileName(), - line: x.getLineNumber(), - column: x.getColumnNumber() - 1, - })); - }; + Error.prepareStackTrace = customStacktrace; const capture: { stack?: ISourceCodeLocation[] } = {}; Error.captureStackTrace(capture); diff --git a/shared/crypto/cli.ts b/shared/crypto/cli.ts index 8581c06c4..a02134422 100644 --- a/shared/crypto/cli.ts +++ b/shared/crypto/cli.ts @@ -54,7 +54,6 @@ export default function cliCommands(): Command { 'Add salt (noise) to your claims signatures', randomBytes(32).toString('base64'), ) - .option('-q, --quiet', "Don't log any details to the console.", false) .action(async (signerPattern: string, filename: string, args): Promise => { try { From 8b3f198b54e9463fd2a9b6cc1e9c97fc57c5ab45 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 18 Apr 2023 16:17:51 -0400 Subject: [PATCH 093/147] fix(crypto): disallow overwriting identity/address MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore(commons): extract callsite to module feat(commons): read inline source map fix(commons): Typeserializer bug checking “in” --- shared/commons/config/index.ts | 9 ++-- shared/commons/lib/Callsite.ts | 62 ++++++++++++++++++++++++ shared/commons/lib/ShutdownHandler.ts | 2 +- shared/commons/lib/SourceMapSupport.ts | 14 ++++-- shared/commons/lib/TypeSerializer.ts | 7 ++- shared/commons/lib/utils.ts | 48 ------------------ shared/commons/test/SourceLoader.test.ts | 4 +- shared/crypto/lib/Address.ts | 3 ++ shared/crypto/lib/Identity.ts | 5 +- shared/schema/lib/jsonToSchemaCode.ts | 13 +++-- 10 files changed, 102 insertions(+), 65 deletions(-) create mode 100644 shared/commons/lib/Callsite.ts diff --git a/shared/commons/config/index.ts b/shared/commons/config/index.ts index 5a65ec117..3ea1753fa 100644 --- a/shared/commons/config/index.ts +++ b/shared/commons/config/index.ts @@ -2,6 +2,7 @@ import * as Fs from 'fs'; import * as Path from 'path'; import { getCacheDirectory } from '../lib/dirUtils'; import { safeOverwriteFile } from '../lib/fileUtils'; +import Callsite from '../lib/Callsite'; export default class UlixeeConfig { public static get global(): UlixeeConfig { @@ -28,7 +29,9 @@ export default class UlixeeConfig { if (Fs.existsSync(this.configPath)) { const data = JSON.parse(Fs.readFileSync(this.configPath, 'utf8')); if (data.datastoreOutDir) { - this.datastoreOutDir = Path.isAbsolute(data.datastoreOutDir) ? data.datastoreOutDir : Path.resolve(this.directoryPath, data.datastoreOutDir); + this.datastoreOutDir = Path.isAbsolute(data.datastoreOutDir) + ? data.datastoreOutDir + : Path.resolve(this.directoryPath, data.datastoreOutDir); } } } @@ -75,7 +78,7 @@ export default class UlixeeConfig { private static useRuntimeLocationDefaults(runtimeLocation?: IRuntimeLocation): IRuntimeLocation { return { - entrypoint: runtimeLocation?.entrypoint ?? require.main?.filename ?? process.argv[1], + entrypoint: runtimeLocation?.entrypoint ?? Callsite.getEntrypoint(), workingDirectory: runtimeLocation?.workingDirectory ?? process.cwd(), }; } @@ -115,7 +118,7 @@ export default class UlixeeConfig { } export interface IUlixeeConfig { - datastoreOutDir?: string + datastoreOutDir?: string; } export interface IRuntimeLocation { diff --git a/shared/commons/lib/Callsite.ts b/shared/commons/lib/Callsite.ts new file mode 100644 index 000000000..614c0c9c1 --- /dev/null +++ b/shared/commons/lib/Callsite.ts @@ -0,0 +1,62 @@ +import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; + +export default class Callsite { + static getEntrypoint(): string { + return process.env.ULX_INJECTED_CALLSITE ?? require.main?.filename ?? process.argv[1]; + } + + static getSourceCodeLocation( + priorToFilename?: string, + endFilename?: string, + ): ISourceCodeLocation[] { + const startingPrepareStack = Error.prepareStackTrace; + const startingTraceLimit = Error.stackTraceLimit; + + Error.stackTraceLimit = 25; + Error.prepareStackTrace = this.customStacktrace; + + const capture: { stack?: ISourceCodeLocation[] } = {}; + Error.captureStackTrace(capture); + Error.stackTraceLimit = startingTraceLimit; + let stack = capture.stack; + + Error.prepareStackTrace = startingPrepareStack; + let startIndex = 1; + + console.log(stack) + if (priorToFilename) { + const idx = stack.findIndex( + x => x.filename === priorToFilename || x.filename?.endsWith(priorToFilename), + ); + if (idx >= 0) startIndex = idx + 1; + } + stack = stack.slice(startIndex); + + + if (endFilename) { + let lastIdx = -1; + for (let i = stack.length - 1; i >= 0; i -= 1) { + const x = stack[i]; + if (x.filename === endFilename || x.filename?.endsWith(endFilename)) { + lastIdx = i; + break; + } + } + if (lastIdx >= 0) stack = stack.slice(0, lastIdx + 1); + } + return stack.filter( + x => + !!x.filename && + !x.filename.startsWith('internal') && + !x.filename.startsWith('node:internal'), + ); + } + + private static customStacktrace(_: Error, callsite: NodeJS.CallSite[]): ISourceCodeLocation[] { + return callsite.map(x => ({ + filename: x.getFileName(), + line: x.getLineNumber(), + column: x.getColumnNumber() - 1, + })); + } +} diff --git a/shared/commons/lib/ShutdownHandler.ts b/shared/commons/lib/ShutdownHandler.ts index 324b8c4dc..cc0dca5ca 100644 --- a/shared/commons/lib/ShutdownHandler.ts +++ b/shared/commons/lib/ShutdownHandler.ts @@ -31,7 +31,7 @@ export default class ShutdownHandler { return this.onSignal('exit', null, true); } - private static registerSignals(): void { + public static registerSignals(): void { if (!this.isRegistered) { this.isRegistered = true; process.once('beforeExit', code => ShutdownHandler.onSignal('beforeExit' as any, code)); diff --git a/shared/commons/lib/SourceMapSupport.ts b/shared/commons/lib/SourceMapSupport.ts index b99346ac2..c371638b1 100644 --- a/shared/commons/lib/SourceMapSupport.ts +++ b/shared/commons/lib/SourceMapSupport.ts @@ -38,18 +38,23 @@ export class SourceMapSupport { } } - static getSourceFile(filename: string): string { + static getSourceFile(filename: string): { path: string; content?: string } { this.sourceMapCache[filename] ??= this.retrieveSourceMap(filename); - if (!this.sourceMapCache[filename].map) return filename; + if (!this.sourceMapCache[filename].map) + return { + path: filename, + }; let source = filename; + let content: string; const sourceMap = this.sourceMapCache[filename]; sourceMap.map.eachMapping(mapping => { if (source === filename) { source = this.resolvePath(sourceMap.url, mapping.source); + content = sourceMap.map.sourceContentFor(mapping.source, true); } }); - return source; + return { path: source, content }; } static getSourceFilePaths(filename: string): string[] { @@ -70,7 +75,7 @@ export class SourceMapSupport { static getOriginalSourcePosition( position: ISourceCodeLocation, includeContent = false, - ): ISourceCodeLocation & { name?: string; content?: string } { + ): ISourceCodeLocation & { name?: string; content?: string; source?: string } { this.sourceMapCache[position.filename] ??= this.retrieveSourceMap(position.filename); const sourceMap = this.sourceMapCache[position.filename]; @@ -85,6 +90,7 @@ export class SourceMapSupport { content = sourceMap.map.sourceContentFor(originalPosition.source, true); } return { + source: originalPosition.source, filename, column: originalPosition.column, line: originalPosition.line, diff --git a/shared/commons/lib/TypeSerializer.ts b/shared/commons/lib/TypeSerializer.ts index 893cfa380..2e9363ebb 100644 --- a/shared/commons/lib/TypeSerializer.ts +++ b/shared/commons/lib/TypeSerializer.ts @@ -131,7 +131,10 @@ export default class TypeSerializer { if ( value instanceof Error || - ('stack' in value && 'name' in value && (value.name as string)?.endsWith?.('Error')) + (type === 'object' && + 'stack' in value && + 'name' in value && + (value.name as string)?.endsWith?.('Error')) ) { const { name, message, stack, ...data } = value; const extras = this.replace(data, options) as object; @@ -192,7 +195,7 @@ export default class TypeSerializer { } } - if ('toJSON' in value) { + if (type === 'object' && 'toJSON' in value) { return value.toJSON(); } diff --git a/shared/commons/lib/utils.ts b/shared/commons/lib/utils.ts index ab3d89e3f..aa601bdd0 100644 --- a/shared/commons/lib/utils.ts +++ b/shared/commons/lib/utils.ts @@ -34,54 +34,6 @@ export function isPortInUse(port: number | string): Promise { }); } -function customStacktrace(_: Error, callsite: NodeJS.CallSite[]): ISourceCodeLocation[] { - return callsite.map(x => ({ - filename: x.getFileName(), - line: x.getLineNumber(), - column: x.getColumnNumber() - 1, - })); -} - -export function getCallsite(priorToFilename?: string, endFilename?: string): ISourceCodeLocation[] { - const startingPrepareStack = Error.prepareStackTrace; - const startingTraceLimit = Error.stackTraceLimit; - - Error.stackTraceLimit = 25; - Error.prepareStackTrace = customStacktrace; - - const capture: { stack?: ISourceCodeLocation[] } = {}; - Error.captureStackTrace(capture); - Error.stackTraceLimit = startingTraceLimit; - let stack = capture.stack; - - Error.prepareStackTrace = startingPrepareStack; - let startIndex = 1; - - if (priorToFilename) { - const idx = stack.findIndex( - x => x.filename === priorToFilename || x.filename?.endsWith(priorToFilename), - ); - if (idx >= 0) startIndex = idx + 1; - } - stack = stack.slice(startIndex); - - if (endFilename) { - let lastIdx = -1; - for (let i = stack.length - 1; i >= 0; i -= 1) { - const x = stack[i]; - if (x.filename === endFilename || x.filename?.endsWith(endFilename)) { - lastIdx = i; - break; - } - } - if (lastIdx >= 0) stack = stack.slice(0, lastIdx + 1); - } - return stack.filter( - x => - !!x.filename && !x.filename.startsWith('internal') && !x.filename.startsWith('node:internal'), - ); -} - export function escapeUnescapedChar(str: string, char: string): string { let i = str.indexOf(char); while (i !== -1) { diff --git a/shared/commons/test/SourceLoader.test.ts b/shared/commons/test/SourceLoader.test.ts index eb5c4edc3..ad06d4d30 100644 --- a/shared/commons/test/SourceLoader.test.ts +++ b/shared/commons/test/SourceLoader.test.ts @@ -1,4 +1,4 @@ -import { getCallsite } from '../lib/utils'; +import Callsite from '../lib/Callsite'; import SourceLoader from '../lib/SourceLoader'; import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; @@ -6,7 +6,7 @@ it('can lookup source code', () => { let callsite: ISourceCodeLocation[]; // run code like this so we can see the true load (?? will be translated by typescript) function loadCallsite() { - callsite ??= getCallsite(); + callsite ??= Callsite.getSourceCodeLocation(); return callsite; } const site = loadCallsite(); diff --git a/shared/crypto/lib/Address.ts b/shared/crypto/lib/Address.ts index c30453568..5b7b75792 100644 --- a/shared/crypto/lib/Address.ts +++ b/shared/crypto/lib/Address.ts @@ -63,6 +63,9 @@ export default class Address { const json = TypeSerializer.stringify(this.toJSON(), { format }); const filepath = path.resolve(basePath, `${filename || this.bech32}.json`); + if (fs.existsSync(filepath)) { + throw new Error('You attempted to overwrite an existing address!!'); + } await fs.promises.writeFile(filepath, json, { encoding: 'utf8' }); return filepath; } diff --git a/shared/crypto/lib/Identity.ts b/shared/crypto/lib/Identity.ts index 6c7cf1edf..8bdeccb8d 100644 --- a/shared/crypto/lib/Identity.ts +++ b/shared/crypto/lib/Identity.ts @@ -1,4 +1,4 @@ -import { promises as fs, readFileSync } from 'fs'; +import { promises as fs, readFileSync, existsSync } from 'fs'; import * as path from 'path'; import { createPrivateKey, generateKeyPairSync, KeyExportOptions, KeyObject } from 'crypto'; import { sha256 } from '@ulixee/commons/lib/hashUtils'; @@ -87,6 +87,9 @@ export default class Identity { } } if (!filepath) throw new Error('No valid filepath was provided'); + if (existsSync(filepath)) { + throw new Error('You attempted to overwrite an existing Identity!! Please remove it first.'); + } await fs.writeFile(filepath, this.export(options?.passphrase, options?.cipher)); return filepath; diff --git a/shared/schema/lib/jsonToSchemaCode.ts b/shared/schema/lib/jsonToSchemaCode.ts index 54f904534..fe286db89 100644 --- a/shared/schema/lib/jsonToSchemaCode.ts +++ b/shared/schema/lib/jsonToSchemaCode.ts @@ -32,12 +32,12 @@ function parseField(json: IAnySchemaJson, schemaImports: Set, leadingSpa const field = parseField(element, schemaImports, leadingSpaces); return `array(${field})`; } - config.element = parseField(element, schemaImports, leadingSpaces + 2); + config.element = element; } if (typeName === 'record') { - config.values = parseField(values, schemaImports, leadingSpaces + 2); - if (keys) config.keys = parseField(keys, schemaImports, leadingSpaces + 2); + config.values = values; + if (keys) config.keys = keys; } let js = `${typeName}(`; @@ -53,7 +53,12 @@ function parseField(json: IAnySchemaJson, schemaImports: Set, leadingSpa } else { js += ' '; } - js += `${getFieldName(key)}: ${JSON.stringify(value)}`; + js += `${getFieldName(key)}: `; + if (key === 'element' || key === 'values' || key === 'keys') { + js += `${parseField(value as any, schemaImports, leadingSpaces + 2)},\n`; + } else { + js += JSON.stringify(value); + } if (configEntries > 1) js += ',\n'; } if (configEntries === 1) js += ' '; From 9656ec852810a832964d3221b8e0cf2777d14ae3 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Tue, 18 Apr 2023 16:25:30 -0400 Subject: [PATCH 094/147] fix: tests + lint --- shared/commons/lib/Callsite.ts | 1 - shared/commons/test/SourceLoader.test.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/shared/commons/lib/Callsite.ts b/shared/commons/lib/Callsite.ts index 614c0c9c1..ba45d1999 100644 --- a/shared/commons/lib/Callsite.ts +++ b/shared/commons/lib/Callsite.ts @@ -23,7 +23,6 @@ export default class Callsite { Error.prepareStackTrace = startingPrepareStack; let startIndex = 1; - console.log(stack) if (priorToFilename) { const idx = stack.findIndex( x => x.filename === priorToFilename || x.filename?.endsWith(priorToFilename), diff --git a/shared/commons/test/SourceLoader.test.ts b/shared/commons/test/SourceLoader.test.ts index ad06d4d30..9cfd93239 100644 --- a/shared/commons/test/SourceLoader.test.ts +++ b/shared/commons/test/SourceLoader.test.ts @@ -10,6 +10,6 @@ it('can lookup source code', () => { return callsite; } const site = loadCallsite(); - expect(SourceLoader.getSource(site[0]).code).toBe(` callsite ??= getCallsite();`); + expect(SourceLoader.getSource(site[0]).code).toBe(` callsite ??= Callsite.getSourceCodeLocation();`); expect(SourceLoader.getSource(site[1]).code).toBe(` const site = loadCallsite();`); }); From c7cba656a2619d343fb6509d304f6289adcba1db Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 19 Apr 2023 18:21:18 -0400 Subject: [PATCH 095/147] v2.0.0-alpha.20 --- shared/CHANGELOG.md | 16 ++++++++++++++++ shared/commons/CHANGELOG.md | 15 +++++++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 13 +++++++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 12 ++++++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 11 +++++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 8 ++++++++ shared/specification/package.json | 2 +- 12 files changed, 85 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 9e580448a..4f182b2dd 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) + + +### Bug Fixes + +* **commons:** always handle emitter errors ([1c5f60f](https://github.com/ulixee/shared/commit/1c5f60f21c4c174c99c10e9e9d2edb07b06c28a0)) +* **commons:** global instance bug ([b895c0e](https://github.com/ulixee/shared/commit/b895c0e14602d92f42c559c6130d8a66b9b0770e)) +* **commons:** global instance of check ([f51fed1](https://github.com/ulixee/shared/commit/f51fed1f93e4bfb2c603a0bced79e249ff76d003)) +* **crypto:** disallow overwriting identity/address ([c14a185](https://github.com/ulixee/shared/commit/c14a1857c80ca800198d231236d5fcb6223026c9)) +* **net:** not emitting transport disconnected ([54f4c73](https://github.com/ulixee/shared/commit/54f4c73a096961c5fdf823679fdf25503c9ec6b5)) +* tests + lint ([66e49ae](https://github.com/ulixee/shared/commit/66e49ae931b54fd8577711562c56e2494d8149bb)) + + + + + # [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index cef863b34..2512e72d6 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,21 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) + + +### Bug Fixes + +* **commons:** always handle emitter errors ([1c5f60f](https://github.com/ulixee/shared/commit/1c5f60f21c4c174c99c10e9e9d2edb07b06c28a0)) +* **commons:** global instance bug ([b895c0e](https://github.com/ulixee/shared/commit/b895c0e14602d92f42c559c6130d8a66b9b0770e)) +* **commons:** global instance of check ([f51fed1](https://github.com/ulixee/shared/commit/f51fed1f93e4bfb2c603a0bced79e249ff76d003)) +* **crypto:** disallow overwriting identity/address ([c14a185](https://github.com/ulixee/shared/commit/c14a1857c80ca800198d231236d5fcb6223026c9)) +* tests + lint ([66e49ae](https://github.com/ulixee/shared/commit/66e49ae931b54fd8577711562c56e2494d8149bb)) + + + + + # [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) diff --git a/shared/commons/package.json b/shared/commons/package.json index 7af026327..ddac879a7 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.19", + "version": "2.0.0-alpha.20", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index f5e2470cc..21b97573a 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) + + +### Bug Fixes + +* **commons:** always handle emitter errors ([1c5f60f](https://github.com/ulixee/shared/commit/1c5f60f21c4c174c99c10e9e9d2edb07b06c28a0)) +* **commons:** global instance bug ([b895c0e](https://github.com/ulixee/shared/commit/b895c0e14602d92f42c559c6130d8a66b9b0770e)) +* **crypto:** disallow overwriting identity/address ([c14a185](https://github.com/ulixee/shared/commit/c14a1857c80ca800198d231236d5fcb6223026c9)) + + + + + # [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) **Note:** Version bump only for package @ulixee/crypto diff --git a/shared/crypto/package.json b/shared/crypto/package.json index f0db036fb..a11821f92 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.19", + "version": "2.0.0-alpha.20", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.19", - "@ulixee/crypto": "2.0.0-alpha.19", - "@ulixee/specification": "2.0.0-alpha.19", + "@ulixee/commons": "2.0.0-alpha.20", + "@ulixee/crypto": "2.0.0-alpha.20", + "@ulixee/specification": "2.0.0-alpha.20", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index 3dcfd96d8..3c8785a04 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.19", + "version": "2.0.0-alpha.20", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index a21550134..f41250546 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) + + +### Bug Fixes + +* **commons:** global instance of check ([f51fed1](https://github.com/ulixee/shared/commit/f51fed1f93e4bfb2c603a0bced79e249ff76d003)) +* **net:** not emitting transport disconnected ([54f4c73](https://github.com/ulixee/shared/commit/54f4c73a096961c5fdf823679fdf25503c9ec6b5)) + + + + + # [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) diff --git a/shared/net/package.json b/shared/net/package.json index 6e53924df..dcd947698 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.19", + "version": "2.0.0-alpha.20", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.19", + "@ulixee/commons": "2.0.0-alpha.20", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index 81411ccff..32e16d064 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) + + +### Bug Fixes + +* **crypto:** disallow overwriting identity/address ([c14a185](https://github.com/ulixee/shared/commit/c14a1857c80ca800198d231236d5fcb6223026c9)) + + + + + # [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) diff --git a/shared/schema/package.json b/shared/schema/package.json index e2fd04dce..0a8792852 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.19", + "version": "2.0.0-alpha.20", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 0af7a91dd..88925bd95 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) + +**Note:** Version bump only for package @ulixee/specification + + + + + # [2.0.0-alpha.19](https://github.com/ulixee/shared/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2023-02-25) diff --git a/shared/specification/package.json b/shared/specification/package.json index 85698d27a..25689e727 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.19", + "version": "2.0.0-alpha.20", "description": "", "main": "./index.js", "license": "MIT", From 1709ea98e7f020703a4896f3f6568bb744bd7781 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 24 Apr 2023 10:50:41 -0400 Subject: [PATCH 096/147] v2.0.0-alpha.21 --- shared/CHANGELOG.md | 8 ++++++++ shared/commons/CHANGELOG.md | 8 ++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 8 ++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 8 ++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 8 ++++++++ shared/specification/package.json | 2 +- 12 files changed, 58 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 4f182b2dd..f619c7ec1 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) + +**Note:** Version bump only for package @ulixee/shared-monorepo + + + + + # [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 2512e72d6..36e53391f 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) + +**Note:** Version bump only for package @ulixee/commons + + + + + # [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) diff --git a/shared/commons/package.json b/shared/commons/package.json index ddac879a7..a0aa61341 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.20", + "version": "2.0.0-alpha.21", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 21b97573a..b60f01036 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) + +**Note:** Version bump only for package @ulixee/crypto + + + + + # [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) diff --git a/shared/crypto/package.json b/shared/crypto/package.json index a11821f92..0bf915f76 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.20", + "version": "2.0.0-alpha.21", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.20", - "@ulixee/crypto": "2.0.0-alpha.20", - "@ulixee/specification": "2.0.0-alpha.20", + "@ulixee/commons": "2.0.0-alpha.21", + "@ulixee/crypto": "2.0.0-alpha.21", + "@ulixee/specification": "2.0.0-alpha.21", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index 3c8785a04..1af65ff89 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.20", + "version": "2.0.0-alpha.21", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index f41250546..daa7d4c66 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) diff --git a/shared/net/package.json b/shared/net/package.json index dcd947698..1900b1961 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.20", + "version": "2.0.0-alpha.21", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.20", + "@ulixee/commons": "2.0.0-alpha.21", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index 32e16d064..4bd0beb70 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) + +**Note:** Version bump only for package @ulixee/schema + + + + + # [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) diff --git a/shared/schema/package.json b/shared/schema/package.json index 0a8792852..32485811b 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.20", + "version": "2.0.0-alpha.21", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 88925bd95..876a9e418 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) + +**Note:** Version bump only for package @ulixee/specification + + + + + # [2.0.0-alpha.20](https://github.com/ulixee/shared/compare/v2.0.0-alpha.19...v2.0.0-alpha.20) (2023-04-19) **Note:** Version bump only for package @ulixee/specification diff --git a/shared/specification/package.json b/shared/specification/package.json index 25689e727..217d103ee 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.20", + "version": "2.0.0-alpha.21", "description": "", "main": "./index.js", "license": "MIT", From adb6a832e931d40024272b735348683350bae955 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 11 May 2023 16:00:45 -0400 Subject: [PATCH 097/147] fix(commons): handle relative source map content chore(commons): update repo tools --- shared/.nvmrc | 2 +- shared/commons/config/hosts.ts | 2 + .../commons/interfaces/ISourceCodeLocation.ts | 1 + shared/commons/lib/Logger.ts | 1 + shared/commons/lib/SourceLoader.ts | 23 +- shared/commons/lib/SourceMapSupport.ts | 320 +++++++++++++----- shared/commons/lib/VersionUtils.ts | 4 +- shared/commons/lib/utils.ts | 11 +- shared/commons/package.json | 7 +- shared/commons/test/utils.test.ts | 2 +- shared/crypto/lib/AddressOwnersTree.ts | 2 +- shared/net/lib/EmittingTransportToClient.ts | 3 + shared/net/lib/WsTransportToClient.ts | 2 +- shared/net/lib/WsTransportToCore.ts | 15 +- shared/net/lib/WsUtils.ts | 2 +- shared/package.json | 2 +- shared/schema/lib/ArraySchema.ts | 2 +- shared/schema/lib/BaseSchema.ts | 3 +- shared/schema/lib/BigintSchema.ts | 2 +- shared/schema/lib/BufferSchema.ts | 2 +- shared/schema/lib/DateSchema.ts | 2 +- shared/schema/lib/DateUtilities.ts | 2 +- shared/schema/lib/NumberSchema.ts | 2 +- shared/schema/lib/ObjectSchema.ts | 2 +- shared/schema/lib/RecordSchema.ts | 2 +- shared/schema/lib/StringSchema.ts | 4 +- shared/schema/lib/jsonToSchemaCode.ts | 2 + shared/schema/package.dist.json | 2 +- shared/schema/package.json | 2 +- shared/yarn.lock | 183 +++++++--- 30 files changed, 431 insertions(+), 180 deletions(-) diff --git a/shared/.nvmrc b/shared/.nvmrc index 70ffbd183..3c032078a 100644 --- a/shared/.nvmrc +++ b/shared/.nvmrc @@ -1 +1 @@ -14.20.0 \ No newline at end of file +18 diff --git a/shared/commons/config/hosts.ts b/shared/commons/config/hosts.ts index 2de000f08..ccef03fa6 100644 --- a/shared/commons/config/hosts.ts +++ b/shared/commons/config/hosts.ts @@ -30,6 +30,8 @@ export default class UlixeeHostsConfig extends TypedEventEmitter<{ change: void { recursive: true, persistent: false }, this.reload.bind(this, true), ); + } else { + Fs.watchFile(this.configPath, { persistent: false }, this.reload.bind(this, true)); } }; this.reload(); diff --git a/shared/commons/interfaces/ISourceCodeLocation.ts b/shared/commons/interfaces/ISourceCodeLocation.ts index 31240db1f..f6f0353b2 100644 --- a/shared/commons/interfaces/ISourceCodeLocation.ts +++ b/shared/commons/interfaces/ISourceCodeLocation.ts @@ -1,5 +1,6 @@ export default interface ISourceCodeLocation { filename: string; + source?: string; line: number; column: number; } diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index 3e2f4eb6b..e5bfbfd54 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -126,6 +126,7 @@ function translateValueToPrintable(value: any, depth = 0): any { } if (Buffer.isBuffer(value)) { if ((value as Buffer).length <= 256) return `0x${value.toString('hex')}`; + return ``; } if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { diff --git a/shared/commons/lib/SourceLoader.ts b/shared/commons/lib/SourceLoader.ts index 1a5349e0e..434a15e8f 100644 --- a/shared/commons/lib/SourceLoader.ts +++ b/shared/commons/lib/SourceLoader.ts @@ -1,4 +1,4 @@ -import { URL } from 'url'; +import { fileURLToPath } from 'url'; import * as fs from 'fs'; import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; import { SourceMapSupport } from './SourceMapSupport'; @@ -28,30 +28,35 @@ export default class SourceLoader { this.sourceLines[sourcePosition.filename] = file.split(/\r?\n/); } - (sourcePosition as any).code = this.sourceLines[sourcePosition.filename][sourcePosition.line - 1]; + (sourcePosition as any).code = + this.sourceLines[sourcePosition.filename][sourcePosition.line - 1]; return sourcePosition as any; } static getFileContents(filepath: string, cache = true): string { - if (cache && this.fileContentsCache[filepath]) return this.fileContentsCache[filepath]; + const cacheKey = SourceMapSupport.getCacheKey(filepath); + if (cache && this.fileContentsCache[cacheKey]) return this.fileContentsCache[cacheKey]; - const originalFilepath = filepath; // Trim the path to make sure there is no extra whitespace. - let lookupFilepath: string | URL = filepath.trim(); + filepath = filepath.trim(); if (filepath.startsWith('file://')) { - lookupFilepath = new URL(filepath); + filepath = fileURLToPath(filepath); } let data: string = null; try { - data = fs.readFileSync(lookupFilepath, 'utf8'); + data = fs.readFileSync(filepath, 'utf8'); } catch (err) { // couldn't read } if (cache) { - this.fileContentsCache[filepath] = data; - this.fileContentsCache[originalFilepath] = data; + this.fileContentsCache[cacheKey] = data; } return data; } + + static setFileContents(filepath: string, data: string): void { + const cacheKey = SourceMapSupport.getCacheKey(filepath); + this.fileContentsCache[cacheKey] = data; + } } diff --git a/shared/commons/lib/SourceMapSupport.ts b/shared/commons/lib/SourceMapSupport.ts index c371638b1..495aca684 100644 --- a/shared/commons/lib/SourceMapSupport.ts +++ b/shared/commons/lib/SourceMapSupport.ts @@ -1,17 +1,35 @@ -import { SourceMapConsumer } from 'source-map-js'; +import { AnyMap, originalPositionFor, TraceMap } from '@jridgewell/trace-mapping'; import * as path from 'path'; +import { fileURLToPath, pathToFileURL } from 'url'; import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; import SourceLoader from './SourceLoader'; -// ATTRIBUTION: forked from https://github.com/evanw/node-source-map-support +// ATTRIBUTION: forked from https://github.com/cspotcode/node-source-map-support const sourceMapDataUrlRegex = /^data:application\/json[^,]+base64,/; const sourceMapUrlRegex = /(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/gm; const fileUrlPrefix = 'file://'; +let kIsNodeError: symbol; +try { + // Get a deliberate ERR_INVALID_ARG_TYPE + // TODO is there a better way to reliably get an instance of NodeError? + // @ts-ignore + path.resolve(123); +} catch (e) { + const symbols = Object.getOwnPropertySymbols(e); + const symbol = symbols.find(s => { + return s.toString().indexOf('kIsNodeError') >= 0; + }); + if (symbol) kIsNodeError = symbol; +} + export class SourceMapSupport { - private static sourceMapCache: { [source: string]: { map: SourceMapConsumer; url: string } } = {}; + private static sourceMapCache: { + [source: string]: { map: TraceMap; url: string; rawMap: any }; + } = {}; + private static resolvedPathCache: { [file_url: string]: string } = {}; private static stackPathsToClear = new Set(); @@ -29,7 +47,7 @@ export class SourceMapSupport { } static install(): void { - // ts-node does it's own translations + // ts-node does its own translations if (process.execArgv?.includes('ts-node')) return; if (!Error[Symbol.for('source-map-support')]) { @@ -39,59 +57,49 @@ export class SourceMapSupport { } static getSourceFile(filename: string): { path: string; content?: string } { - this.sourceMapCache[filename] ??= this.retrieveSourceMap(filename); - if (!this.sourceMapCache[filename].map) + const sourceMap = this.retrieveSourceMap(filename); + if (!sourceMap.map) return { path: filename, }; - let source = filename; - let content: string; - const sourceMap = this.sourceMapCache[filename]; - sourceMap.map.eachMapping(mapping => { - if (source === filename) { - source = this.resolvePath(sourceMap.url, mapping.source); - content = sourceMap.map.sourceContentFor(mapping.source, true); - } - }); - return { path: source, content }; - } + let sourceIndex = sourceMap.map.sources.indexOf(filename); + if (sourceIndex === -1) sourceIndex = sourceMap.map.resolvedSources.indexOf(filename); - static getSourceFilePaths(filename: string): string[] { - this.sourceMapCache[filename] ??= this.retrieveSourceMap(filename); - if (!this.sourceMapCache[filename].map) return [filename]; + if (sourceIndex === -1 && sourceMap.map.sources.length === 1) sourceIndex = 0; - const sourcesByMappingSource = new Map(); - const sourceMap = this.sourceMapCache[filename]; - sourceMap.map.eachMapping(mapping => { - if (!sourcesByMappingSource.has(mapping.source)) { - const resolvedPath = this.resolvePath(sourceMap.url, mapping.source); - sourcesByMappingSource.set(mapping.source, resolvedPath); - } - }); - return [...sourcesByMappingSource.values()]; + const source = sourceIndex >= 0 ? sourceMap.map.resolvedSources[sourceIndex] : filename; + const content = SourceLoader.getFileContents(source); + return { path: source, content }; } static getOriginalSourcePosition( position: ISourceCodeLocation, includeContent = false, - ): ISourceCodeLocation & { name?: string; content?: string; source?: string } { - this.sourceMapCache[position.filename] ??= this.retrieveSourceMap(position.filename); + ): ISourceCodeLocation & { name?: string; content?: string } { + const cacheKey = this.getCacheKey(position.filename); + let sourceMap = this.sourceMapCache[cacheKey]; + if (!sourceMap) { + sourceMap = this.retrieveSourceMap(position.filename); + } - const sourceMap = this.sourceMapCache[position.filename]; - if (sourceMap?.map) { - const originalPosition = sourceMap.map.originalPositionFor(position); + // Resolve the source URL relative to the URL of the source map + if (sourceMap && sourceMap.map) { + const originalPosition = originalPositionFor(sourceMap.map, position); // Only return the original position if a matching line was found - if (originalPosition.source) { + if (originalPosition.source !== null) { + // originalPosition.source has *already* been resolved against sourceMap.url + // so is *already* as absolute as possible. + // However, we want to ensure we output in same format as input: URL or native path + originalPosition.source = matchStyleOfPathOrUrl(position.filename, originalPosition.source); let content: string = null; - const filename = this.resolvePath(sourceMap.url, originalPosition.source); if (includeContent) { - content = sourceMap.map.sourceContentFor(originalPosition.source, true); + content = SourceLoader.getFileContents(originalPosition.source); } return { source: originalPosition.source, - filename, + filename: position.filename, column: originalPosition.column, line: originalPosition.line, name: originalPosition.name, @@ -103,14 +111,23 @@ export class SourceMapSupport { return position; } - static retrieveSourceMap(source: string): { url: string; map: SourceMapConsumer; rawMap?: any } { - const fileData = SourceLoader.getFileContents(source, false); + static retrieveSourceMap( + source: string, + overrideSourceRoot?: string, + ): { + url: string; + map: TraceMap; + rawMap: any; + } { + const cacheKey = this.getCacheKey(source); + if (this.sourceMapCache[cacheKey]) return this.sourceMapCache[cacheKey]; // Find the *last* sourceMappingURL to avoid picking up sourceMappingURLs from comments, strings, etc. let sourceMappingURL: string; - let sourceMapData: string; + let sourceMapData: string | any; let match: RegExpMatchArray; + const fileData = SourceLoader.getFileContents(source); // eslint-disable-next-line no-cond-assign while ((match = sourceMapUrlRegex.exec(fileData))) { sourceMappingURL = match[1]; @@ -122,30 +139,93 @@ export class SourceMapSupport { sourceMapData = Buffer.from(rawData, 'base64').toString(); sourceMappingURL = source; } else { - sourceMappingURL = this.resolvePath(source, sourceMappingURL); + // Support source map URLs relative to the source URL + sourceMappingURL = supportRelativeURL(source, sourceMappingURL); sourceMapData = SourceLoader.getFileContents(sourceMappingURL); } } - if (!sourceMapData) { - return { + if (sourceMapData) { + if (overrideSourceRoot) { + const sourceMapJson = JSON.parse(sourceMapData); + sourceMapJson.sourceRoot = overrideSourceRoot; + sourceMapJson.sources = sourceMapJson.sources.map(x => { + // make relative to new source root + if (x.startsWith('..')) return x.substring(1); + return x; + }); + sourceMapData = sourceMapJson; + } + // eslint-disable-next-line no-multi-assign + const sourceMap = { + url: sourceMappingURL, + map: new AnyMap(sourceMapData, sourceMappingURL), + rawMap: sourceMapData, + }; + this.sourceMapCache[cacheKey] = sourceMap; + + // Load all sources stored inline with the source map into the file cache + // to pretend like they are already loaded. They may not exist on disk. + if (sourceMap.map.sourcesContent) { + sourceMap.map.resolvedSources.forEach((resolvedSource, i) => { + const contents = sourceMap.map.sourcesContent[i]; + if (contents) { + SourceLoader.setFileContents(resolvedSource, contents); + } + }); + } else { + const content = sourceMap.map.resolvedSources.map(x => SourceLoader.getFileContents(x)); + if (content.some(x => x !== null)) sourceMap.map.sourcesContent = content; + } + } else { + // eslint-disable-next-line no-multi-assign + this.sourceMapCache[cacheKey] = { url: null, map: null, + rawMap: null, }; } - const rawData = JSON.parse(sourceMapData); - return { - url: sourceMappingURL, - map: new SourceMapConsumer(rawData), - rawMap: rawData, - }; + return this.sourceMapCache[cacheKey]; + } + + public static getCacheKey(pathOrFileUrl): string { + if (this.resolvedPathCache[pathOrFileUrl]) return this.resolvedPathCache[pathOrFileUrl]; + + let result = pathOrFileUrl.trim(); + + try { + if (pathOrFileUrl.startsWith(fileUrlPrefix)) { + // Must normalize spaces to %20, stuff like that + result = new URL(pathOrFileUrl).toString(); + } else if (!result.startsWith('node:')) { + result = pathToFileURL(pathOrFileUrl).toString(); + } + } catch { + // keep original url + } + this.resolvedPathCache[pathOrFileUrl] = result; + return result; } private static prepareStackTrace(error: Error, stack: NodeJS.CallSite[]): string { - const name = error.name ?? error[Symbol.toStringTag] ?? error.constructor?.name ?? 'Error'; - const message = error.message ?? ''; - const errorString = `${name}: ${message}`; + // node gives its own errors special treatment. Mimic that behavior + // https://github.com/nodejs/node/blob/3cbaabc4622df1b4009b9d026a1a970bdbae6e89/lib/internal/errors.js#L118-L128 + // https://github.com/nodejs/node/pull/39182 + let errorString: string; + + if (kIsNodeError) { + if (kIsNodeError in error) { + errorString = `${error.name} [${(error as any).code}]: ${error.message}`; + } else { + errorString = ErrorPrototypeToString(error); + } + } else { + const name = error.name ?? error[Symbol.toStringTag] ?? error.constructor?.name ?? 'Error'; + const message = error.message ?? ''; + errorString = message ? `${name}: ${message}` : name; + } + // track fn name as we go backwards through stack const processedStack = []; let containingFnName: string = null; @@ -161,20 +241,19 @@ export class SourceMapSupport { line: frame.getLineNumber(), column: frame.getColumnNumber() - 1, }); - if (position.filename !== filename) { + if (position.source) { const fnName = containingFnName ?? frame.getFunctionName(); for (const toReplace of this.stackPathsToClear) { - if (position.filename.startsWith(toReplace)) { - position.filename = position.filename.replace(toReplace, ''); + if (position.source.startsWith(toReplace)) { + position.source = position.source.replace(toReplace, ''); } } - containingFnName = position.name; frame = new Proxy(frame, { get(target: NodeJS.CallSite, p: string | symbol): any { if (p === 'getFunctionName') return () => fnName; - if (p === 'getFileName') return () => position.filename; - if (p === 'getScriptNameOrSourceURL') return () => position.filename; + if (p === 'getFileName') return () => position.source; + if (p === 'getScriptNameOrSourceURL') return () => position.source; if (p === 'getLineNumber') return () => position.line; if (p === 'getColumnNumber') return () => position.column + 1; if (p === 'toString') return CallSiteToString.bind(frame); @@ -190,41 +269,24 @@ export class SourceMapSupport { } return errorString + processedStack.join(''); } - - private static resolvePath(base: string, relative: string): string { - if (!base) return relative; - const key = `${base}__${relative}`; - - if (!this.resolvedPathCache[key]) { - let protocol = base.startsWith(fileUrlPrefix) ? fileUrlPrefix : ''; - - let basePath = path.dirname(base).slice(protocol.length); - - // handle file:///C:/ paths - if (protocol && /^\/\w:/.test(basePath)) { - protocol += '/'; - basePath = basePath.slice(1); - } - - this.resolvedPathCache[key] = protocol + path.resolve(basePath, relative); - } - return this.resolvedPathCache[key]; - } } SourceMapSupport.install(); -// Converted from the V8 source code at: -// https://github.com/v8/v8/blob/dc712da548c7fb433caed56af9a021d964952728/src/objects/stack-frame-info.cc#L344-L393 -function CallSiteToString( - this: NodeJS.CallSite & { - getScriptNameOrSourceURL(): string; - isAsync(): boolean; - isPromiseAll?(): boolean; - isPromiseAny?(): boolean; - getPromiseIndex?(): number; - }, -): string { +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type +const ErrorPrototypeToString = err => Error.prototype.toString.call(err); + +// This is copied almost verbatim from the V8 source code at +// https://code.google.com/p/v8/source/browse/trunk/src/messages.js +// Update 2022-04-29: +// https://github.com/v8/v8/blob/98f6f100c5ab8e390e51422747c4ef644d5ac6f2/src/builtins/builtins-callsite.cc#L175-L179 +// https://github.com/v8/v8/blob/98f6f100c5ab8e390e51422747c4ef644d5ac6f2/src/objects/call-site-info.cc#L795-L804 +// https://github.com/v8/v8/blob/98f6f100c5ab8e390e51422747c4ef644d5ac6f2/src/objects/call-site-info.cc#L717-L750 +// The implementation of wrapCallSite() used to just forward to the actual source +// code of CallSite.prototype.toString but unfortunately a new release of V8 +// did something to the prototype chain and broke the shim. The only fix I +// could find was copy/paste. +function CallSiteToString(): string { let fileName; let fileLocation = ''; if (this.isNative()) { @@ -300,3 +362,81 @@ function CallSiteToString( } return line; } + +function isAbsoluteUrl(input: string): boolean { + return schemeRegex.test(input); +} + +// Matches the scheme of a URL, eg "http://" +const schemeRegex = /^[\w+.-]+:\/\//; +function isSchemeRelativeUrl(input: string): boolean { + return input.startsWith('//'); +} + +// Support URLs relative to a directory, but be careful about a protocol prefix +// in case we are in the browser (i.e. directories may start with "http://" or "file:///") +function supportRelativeURL(file: string, url: string): string { + if (!file) return url; + // given that this happens within error formatting codepath, probably best to + // fallback instead of throwing if anything goes wrong + try { + // if should output a URL + if (isAbsoluteUrl(file) || isSchemeRelativeUrl(file)) { + if (isAbsoluteUrl(url) || isSchemeRelativeUrl(url)) { + return new URL(url, file).toString(); + } + if (path.isAbsolute(url)) { + return new URL(pathToFileURL(url), file).toString(); + } + // url is relative path or URL + return new URL(url.replace(/\\/g, '/'), file).toString(); + } + + // if should output a path (unless URL is something like https://) + if (path.isAbsolute(file)) { + if (url.startsWith(fileUrlPrefix)) { + return fileURLToPath(url); + } + if (isSchemeRelativeUrl(url)) { + return fileURLToPath(new URL(url, fileUrlPrefix)); + } + if (isAbsoluteUrl(url)) { + // url is a non-file URL + // Go with the URL + return url; + } + if (path.isAbsolute(url)) { + // Normalize at all? decodeURI or normalize slashes? + return path.normalize(url); + } + // url is relative path or URL + return path.join(file, '..', decodeURI(url)); + } + // If we get here, file is relative. + // Shouldn't happen since node identifies modules with absolute paths or URLs. + // But we can take a stab at returning something meaningful anyway. + if (isAbsoluteUrl(url) || isSchemeRelativeUrl(url)) { + return url; + } + return path.join(file, '..', url); + } catch (e) { + return url; + } +} + +// Return pathOrUrl in the same style as matchStyleOf: either a file URL or a native path +function matchStyleOfPathOrUrl(matchStyleOf: string, pathOrUrl: string): string { + try { + if (isAbsoluteUrl(matchStyleOf) || isSchemeRelativeUrl(matchStyleOf)) { + if (isAbsoluteUrl(pathOrUrl) || isSchemeRelativeUrl(pathOrUrl)) return pathOrUrl; + if (path.isAbsolute(pathOrUrl)) return pathToFileURL(pathOrUrl).toString(); + } else if (path.isAbsolute(matchStyleOf)) { + if (isAbsoluteUrl(pathOrUrl) || isSchemeRelativeUrl(pathOrUrl)) { + return fileURLToPath(new URL(pathOrUrl, fileUrlPrefix)); + } + } + return pathOrUrl; + } catch (e) { + return pathOrUrl; + } +} diff --git a/shared/commons/lib/VersionUtils.ts b/shared/commons/lib/VersionUtils.ts index 71120acba..54c8013a0 100644 --- a/shared/commons/lib/VersionUtils.ts +++ b/shared/commons/lib/VersionUtils.ts @@ -1,8 +1,8 @@ -import * as semver from 'semver' +import * as semver from 'semver'; export function isSemverSatisfied(version: string, isSatisfiedByVersion: string): boolean { return semver.satisfies(isSatisfiedByVersion, `~${version}`, { includePrerelease: true }); } export function nextVersion(version :string): string { - return semver.inc(version, 'patch') + return semver.inc(version, 'patch'); } diff --git a/shared/commons/lib/utils.ts b/shared/commons/lib/utils.ts index aa601bdd0..1109de523 100644 --- a/shared/commons/lib/utils.ts +++ b/shared/commons/lib/utils.ts @@ -1,6 +1,5 @@ import * as net from 'net'; import IResolvablePromise from '../interfaces/IResolvablePromise'; -import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; import Resolvable from './Resolvable'; export function assert(value: unknown, message?: string, reject?): void { @@ -13,6 +12,16 @@ export function assert(value: unknown, message?: string, reject?): void { } } +export function toUrl(hostOrUrlFragment: string, defaultProtocol = 'ws:'): URL { + if (!hostOrUrlFragment) return null; + + defaultProtocol = defaultProtocol.replaceAll('/', ''); + if (!hostOrUrlFragment.includes('://')) { + hostOrUrlFragment = `${defaultProtocol}//${hostOrUrlFragment}`; + } + return new URL(hostOrUrlFragment); +} + export function isPortInUse(port: number | string): Promise { return new Promise((resolve, reject) => { const client = new net.Socket(); diff --git a/shared/commons/package.json b/shared/commons/package.json index a0aa61341..fb7dc03dd 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -6,12 +6,13 @@ "license": "MIT", "dependencies": { "bech32": "^2.0.0", - "devtools-protocol": "^0.0.981744", + "devtools-protocol": "^0.0.1137505", "https-proxy-agent": "^5.0.0", "semver": "^7.3.7", - "source-map-js": "^1.0.1" + "@jridgewell/trace-mapping": "^0.3.18" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.3" + "@types/better-sqlite3": "^7.6.4", + "source-map-js": "^1.0.2" } } diff --git a/shared/commons/test/utils.test.ts b/shared/commons/test/utils.test.ts index 5e79e2dfa..25123ba24 100644 --- a/shared/commons/test/utils.test.ts +++ b/shared/commons/test/utils.test.ts @@ -55,4 +55,4 @@ test('can check Prerelease Semvers', () => { test('can handle v in front of versions', () => { expect(isSemverSatisfied('v2.0.0-alpha.1', '2.0.0-alpha.1')).toBeTruthy(); -}) +}); diff --git a/shared/crypto/lib/AddressOwnersTree.ts b/shared/crypto/lib/AddressOwnersTree.ts index 2eea68598..259945806 100644 --- a/shared/crypto/lib/AddressOwnersTree.ts +++ b/shared/crypto/lib/AddressOwnersTree.ts @@ -1,5 +1,5 @@ import { sha256 } from '@ulixee/commons/lib/hashUtils'; -import * as assert from 'assert'; +import assert = require('assert'); import MerkleTree from '@ulixee/crypto/lib/MerkleTree'; import { IMerkleProof } from '@ulixee/specification'; import IAddressSettings, { diff --git a/shared/net/lib/EmittingTransportToClient.ts b/shared/net/lib/EmittingTransportToClient.ts index baf98e9ab..0d1fb24fd 100644 --- a/shared/net/lib/EmittingTransportToClient.ts +++ b/shared/net/lib/EmittingTransportToClient.ts @@ -1,6 +1,7 @@ import '@ulixee/commons/lib/SourceMapSupport'; import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import addGlobalInstance from '@ulixee/commons/lib/addGlobalInstance'; import ITransportToClient, { ITransportToClientEvents } from '../interfaces/ITransportToClient'; import IApiHandlers from '../interfaces/IApiHandlers'; import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; @@ -34,3 +35,5 @@ export default class EmittingTransportToClient< return Promise.resolve(); } } + +addGlobalInstance(EmittingTransportToClient); diff --git a/shared/net/lib/WsTransportToClient.ts b/shared/net/lib/WsTransportToClient.ts index 93e4a73ec..e63d3980b 100644 --- a/shared/net/lib/WsTransportToClient.ts +++ b/shared/net/lib/WsTransportToClient.ts @@ -1,5 +1,5 @@ import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; -import * as WebSocket from 'ws'; +import WebSocket = require('ws'); import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; diff --git a/shared/net/lib/WsTransportToCore.ts b/shared/net/lib/WsTransportToCore.ts index 6d167b172..110247619 100644 --- a/shared/net/lib/WsTransportToCore.ts +++ b/shared/net/lib/WsTransportToCore.ts @@ -1,10 +1,11 @@ import IResolvablePromise from '@ulixee/commons/interfaces/IResolvablePromise'; import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; -import * as WebSocket from 'ws'; +import WebSocket = require('ws'); import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; import Resolvable from '@ulixee/commons/lib/Resolvable'; import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import { toUrl } from '@ulixee/commons/lib/utils'; import DisconnectedError from '../errors/DisconnectedError'; import { isWsOpen, sendWsCloseUnexpectedError, wsSend } from './WsUtils'; import ITransportToCore, { ITransportToCoreEvents } from '../interfaces/ITransportToCore'; @@ -121,15 +122,7 @@ export default class WsTransportToCore< } private setHost(host: string): void { - if (!host.includes('://')) { - this.host = `ws://${host}`; - } else { - this.host = host; - } - if (!this.host.startsWith('ws') && !this.host.startsWith('http')) { - const url = new URL(this.host); - url.protocol = 'ws:'; - this.host = url.href; - } + const url = toUrl(host); + this.host = url.href; } } diff --git a/shared/net/lib/WsUtils.ts b/shared/net/lib/WsUtils.ts index c6e05812b..4070a026a 100644 --- a/shared/net/lib/WsUtils.ts +++ b/shared/net/lib/WsUtils.ts @@ -1,4 +1,4 @@ -import * as WebSocket from 'ws'; +import WebSocket = require('ws'); import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; const CLOSE_UNEXPECTED_ERROR = 1011; diff --git a/shared/package.json b/shared/package.json index c1a871932..badd5210e 100644 --- a/shared/package.json +++ b/shared/package.json @@ -23,7 +23,7 @@ "@commitlint/cli": "^12.0.1", "@commitlint/config-conventional": "^12.0.1", "@types/node": "^14.18.18", - "@ulixee/repo-tools": "^1.0.22", + "@ulixee/repo-tools": "^1.0.24", "cross-env": "^7.0.3", "@types/jest": "^28.1.0", "jest": "^28.1.0", diff --git a/shared/schema/lib/ArraySchema.ts b/shared/schema/lib/ArraySchema.ts index 55248a5b9..f18c802a5 100644 --- a/shared/schema/lib/ArraySchema.ts +++ b/shared/schema/lib/ArraySchema.ts @@ -1,4 +1,4 @@ -import * as assert from 'assert'; +import assert = require('assert'); import BaseSchema, { IBaseConfig } from './BaseSchema'; export interface IArraySchemaConfig, TOptional extends boolean = boolean> diff --git a/shared/schema/lib/BaseSchema.ts b/shared/schema/lib/BaseSchema.ts index dddc1a4e3..cc2343914 100644 --- a/shared/schema/lib/BaseSchema.ts +++ b/shared/schema/lib/BaseSchema.ts @@ -1,6 +1,5 @@ -import * as assert from 'assert'; +import assert = require('assert'); import IValidationResult, { IValidationError } from '../interfaces/IValidationResult'; -import { ObjectSchema } from '../index'; export interface IBaseConfig { optional?: TOptional; diff --git a/shared/schema/lib/BigintSchema.ts b/shared/schema/lib/BigintSchema.ts index ea37d54d1..68ac0e3a9 100644 --- a/shared/schema/lib/BigintSchema.ts +++ b/shared/schema/lib/BigintSchema.ts @@ -1,4 +1,4 @@ -import * as assert from 'assert'; +import assert = require('assert'); import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; export interface IBigintSchemaConfig diff --git a/shared/schema/lib/BufferSchema.ts b/shared/schema/lib/BufferSchema.ts index 06fc38449..01d778060 100644 --- a/shared/schema/lib/BufferSchema.ts +++ b/shared/schema/lib/BufferSchema.ts @@ -1,4 +1,4 @@ -import * as assert from 'assert'; +import assert = require('assert'); import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; const IBufferEncodingTypes = [ diff --git a/shared/schema/lib/DateSchema.ts b/shared/schema/lib/DateSchema.ts index 7ebf8c182..3da5a7da0 100644 --- a/shared/schema/lib/DateSchema.ts +++ b/shared/schema/lib/DateSchema.ts @@ -1,5 +1,5 @@ import moment = require('moment'); -import * as assert from 'assert'; +import assert = require('assert'); import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; export interface IDateSchemaConfig diff --git a/shared/schema/lib/DateUtilities.ts b/shared/schema/lib/DateUtilities.ts index 8d3e943a2..8e743708a 100644 --- a/shared/schema/lib/DateUtilities.ts +++ b/shared/schema/lib/DateUtilities.ts @@ -1,4 +1,4 @@ -import * as assert from 'assert'; +import assert = require('assert'); import moment = require('moment'); const Units = ['seconds', 'minutes', 'hours', 'days', 'months', 'years'] as const; diff --git a/shared/schema/lib/NumberSchema.ts b/shared/schema/lib/NumberSchema.ts index c16cb3ed7..b2b3dc1e6 100644 --- a/shared/schema/lib/NumberSchema.ts +++ b/shared/schema/lib/NumberSchema.ts @@ -1,4 +1,4 @@ -import * as assert from 'assert'; +import assert = require('assert'); import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; export interface INumberSchemaConfig diff --git a/shared/schema/lib/ObjectSchema.ts b/shared/schema/lib/ObjectSchema.ts index be7458382..b4cf3e4df 100644 --- a/shared/schema/lib/ObjectSchema.ts +++ b/shared/schema/lib/ObjectSchema.ts @@ -1,4 +1,4 @@ -import * as assert from 'assert'; +import assert = require('assert'); import BaseSchema, { IBaseConfig } from './BaseSchema'; import { ExtractSchemaType } from '../index'; diff --git a/shared/schema/lib/RecordSchema.ts b/shared/schema/lib/RecordSchema.ts index d16713736..aee1254e9 100644 --- a/shared/schema/lib/RecordSchema.ts +++ b/shared/schema/lib/RecordSchema.ts @@ -1,4 +1,4 @@ -import * as assert from 'assert'; +import assert = require('assert'); import BaseSchema, { IBaseConfig } from './BaseSchema'; import StringSchema from './StringSchema'; import { ExtractSchemaType } from '../index'; diff --git a/shared/schema/lib/StringSchema.ts b/shared/schema/lib/StringSchema.ts index 59dcde517..1228ca6d4 100644 --- a/shared/schema/lib/StringSchema.ts +++ b/shared/schema/lib/StringSchema.ts @@ -1,6 +1,6 @@ -import * as moment from 'moment'; +import moment = require('moment'); import { URL } from 'url'; -import * as assert from 'assert'; +import assert = require('assert'); import BaseSchema, { IBaseConfig, isDefined } from './BaseSchema'; export interface IStringSchemaConfig diff --git a/shared/schema/lib/jsonToSchemaCode.ts b/shared/schema/lib/jsonToSchemaCode.ts index fe286db89..75e2f25f4 100644 --- a/shared/schema/lib/jsonToSchemaCode.ts +++ b/shared/schema/lib/jsonToSchemaCode.ts @@ -18,6 +18,7 @@ export default function jsonToSchemaCode( } function parseField(json: IAnySchemaJson, schemaImports: Set, leadingSpaces = 0): string { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const { typeName, element, fields, values, keys, ...config } = json as any; if (config.optional !== true) delete config.optional; schemaImports.add(typeName); @@ -73,6 +74,7 @@ function parseObjectSchema( schemaImports: Set, leadingSpaces = 0, ): string { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const { typeName, fields, ...config } = json; if (config.optional !== true) delete config.optional; diff --git a/shared/schema/package.dist.json b/shared/schema/package.dist.json index 8315a6fff..ebd207993 100644 --- a/shared/schema/package.dist.json +++ b/shared/schema/package.dist.json @@ -1,5 +1,5 @@ { "devDependencies": { - "typescript": "^4.7.4" + "typescript": "^5.0.4" } } diff --git a/shared/schema/package.json b/shared/schema/package.json index 32485811b..4fbe3150b 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -7,6 +7,6 @@ "moment": "^2.29.4" }, "devDependencies": { - "typescript": "^4.7.4" + "typescript": "^5.0.4" } } diff --git a/shared/yarn.lock b/shared/yarn.lock index 23f79d5d1..92a70e34c 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -516,6 +516,18 @@ dependencies: chalk "^4.0.0" +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + "@eslint/eslintrc@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" @@ -781,6 +793,11 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + "@jridgewell/resolve-uri@^3.0.3": version "3.0.7" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" @@ -791,11 +808,24 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.13" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== +"@jridgewell/trace-mapping@^0.3.18": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" @@ -1724,10 +1754,10 @@ dependencies: "@babel/types" "^7.3.0" -"@types/better-sqlite3@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.3.tgz#117c3c182e300799b84d1b7e1781c27d8d536505" - integrity sha512-YS64N9SNDT/NAvou3QNdzAu3E2om/W/0dhORimtPGLef+zSK5l1vDzfsWb4xgXOgfhtOI5ZDTRxnvRPb22AIVQ== +"@types/better-sqlite3@^7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.4.tgz#102462611e67aadf950d3ccca10292de91e6f35b" + integrity sha512-dzrRZCYPXIXfSR1/surNbJ/grU3scTaygS0OMzjlGf71i9sc2fGyHPXXiXmEvNIoE0cGwsanEFMVJxPXmco9Eg== dependencies: "@types/node" "*" @@ -1810,6 +1840,11 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.1.tgz#76e72d8a775eef7ce649c63c8acae1a0824bbaed" integrity sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw== +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -1834,29 +1869,30 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.27.1": - version "5.27.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.1.tgz#fdf59c905354139046b41b3ed95d1609913d0758" - integrity sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw== +"@typescript-eslint/eslint-plugin@^5.59.2": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz#f156827610a3f8cefc56baeaa93cd4a5f32966b4" + integrity sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg== dependencies: - "@typescript-eslint/scope-manager" "5.27.1" - "@typescript-eslint/type-utils" "5.27.1" - "@typescript-eslint/utils" "5.27.1" + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.5" + "@typescript-eslint/type-utils" "5.59.5" + "@typescript-eslint/utils" "5.59.5" debug "^4.3.4" - functional-red-black-tree "^1.0.1" + grapheme-splitter "^1.0.4" ignore "^5.2.0" - regexpp "^3.2.0" + natural-compare-lite "^1.4.0" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.27.1": - version "5.27.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.27.1.tgz#3a4dcaa67e45e0427b6ca7bb7165122c8b569639" - integrity sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ== +"@typescript-eslint/parser@^5.59.2": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.5.tgz#63064f5eafbdbfb5f9dfbf5c4503cdf949852981" + integrity sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw== dependencies: - "@typescript-eslint/scope-manager" "5.27.1" - "@typescript-eslint/types" "5.27.1" - "@typescript-eslint/typescript-estree" "5.27.1" + "@typescript-eslint/scope-manager" "5.59.5" + "@typescript-eslint/types" "5.59.5" + "@typescript-eslint/typescript-estree" "5.59.5" debug "^4.3.4" "@typescript-eslint/scope-manager@5.27.1": @@ -1867,12 +1903,21 @@ "@typescript-eslint/types" "5.27.1" "@typescript-eslint/visitor-keys" "5.27.1" -"@typescript-eslint/type-utils@5.27.1": - version "5.27.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.27.1.tgz#369f695199f74c1876e395ebea202582eb1d4166" - integrity sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw== +"@typescript-eslint/scope-manager@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz#33ffc7e8663f42cfaac873de65ebf65d2bce674d" + integrity sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A== + dependencies: + "@typescript-eslint/types" "5.59.5" + "@typescript-eslint/visitor-keys" "5.59.5" + +"@typescript-eslint/type-utils@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz#485b0e2c5b923460bc2ea6b338c595343f06fc9b" + integrity sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg== dependencies: - "@typescript-eslint/utils" "5.27.1" + "@typescript-eslint/typescript-estree" "5.59.5" + "@typescript-eslint/utils" "5.59.5" debug "^4.3.4" tsutils "^3.21.0" @@ -1881,6 +1926,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.27.1.tgz#34e3e629501349d38be6ae97841298c03a6ffbf1" integrity sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg== +"@typescript-eslint/types@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.5.tgz#e63c5952532306d97c6ea432cee0981f6d2258c7" + integrity sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w== + "@typescript-eslint/typescript-estree@5.27.1": version "5.27.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.1.tgz#7621ee78607331821c16fffc21fc7a452d7bc808" @@ -1894,7 +1944,34 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.27.1", "@typescript-eslint/utils@^5.10.0": +"@typescript-eslint/typescript-estree@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz#9b252ce55dd765e972a7a2f99233c439c5101e42" + integrity sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg== + dependencies: + "@typescript-eslint/types" "5.59.5" + "@typescript-eslint/visitor-keys" "5.59.5" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.5.tgz#15b3eb619bb223302e60413adb0accd29c32bcae" + integrity sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.59.5" + "@typescript-eslint/types" "5.59.5" + "@typescript-eslint/typescript-estree" "5.59.5" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/utils@^5.10.0": version "5.27.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.27.1.tgz#b4678b68a94bc3b85bf08f243812a6868ac5128f" integrity sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w== @@ -1914,13 +1991,21 @@ "@typescript-eslint/types" "5.27.1" eslint-visitor-keys "^3.3.0" -"@ulixee/repo-tools@^1.0.22": - version "1.0.22" - resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.22.tgz#b906737cf464b5fc3ea0be5b2c958e0fedb76921" - integrity sha512-Qgocpy/bOCFfr5rIjAY+AHOonif/FgGcOuXUWpe8ucB402ujnIs/woyVzmj3INbu0K0fAop+sJcNvNkx4QhZew== +"@typescript-eslint/visitor-keys@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz#ba5b8d6791a13cf9fea6716af1e7626434b29b9b" + integrity sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA== + dependencies: + "@typescript-eslint/types" "5.59.5" + eslint-visitor-keys "^3.3.0" + +"@ulixee/repo-tools@^1.0.24": + version "1.0.24" + resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.24.tgz#04db40a9f23d18e99faa3a69d31d81364bd144ce" + integrity sha512-7C1/eHyknkGRDx0mIhhm3p/vxhwYT/U4YlYviZeuNdUk0f/GMvV/xtq6IgHkNbNSCmNkQw0qmryGPmR1YDDjPQ== dependencies: - "@typescript-eslint/eslint-plugin" "^5.27.1" - "@typescript-eslint/parser" "^5.27.1" + "@typescript-eslint/eslint-plugin" "^5.59.2" + "@typescript-eslint/parser" "^5.59.2" copyfiles "^2.4.1" eslint "^8.17.0" eslint-config-airbnb-base "^15.0.0" @@ -1936,7 +2021,7 @@ eslint-plugin-promise "^6.0.0" prettier "^2.6.2" pretty-quick "^3.1.0" - typescript "^4.7.2" + typescript "^5.0.4" JSONStream@^1.0.4: version "1.3.5" @@ -2916,10 +3001,10 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -devtools-protocol@^0.0.981744: - version "0.0.981744" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.981744.tgz#9960da0370284577d46c28979a0b32651022bacf" - integrity sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg== +devtools-protocol@^0.0.1137505: + version "0.0.1137505" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1137505.tgz#5424148a191f46ab722ebdc05387f1bed9983faf" + integrity sha512-etlSdcQy8DiTCw5oV/AaQiEqEDMCHTGRcMpsqzlKUQQdC/AKadVNbN7GTVAwFOKtMo4i907DczhNkXebiZe85g== dezalgo@^1.0.0: version "1.0.4" @@ -3809,6 +3894,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -5371,6 +5461,11 @@ mute-stream@0.0.8, mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -6618,7 +6713,7 @@ sort-keys@^4.0.0: dependencies: is-plain-obj "^2.0.0" -source-map-js@^1.0.1: +source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -7121,16 +7216,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^4.7.2, typescript@~4.7.3: +typescript@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + +typescript@~4.7.3: version "4.7.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== -typescript@^4.7.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== - uglify-js@^3.1.4: version "3.16.2" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.2.tgz#0481e1dbeed343ad1c2ddf3c6d42e89b7a6d4def" From 6d75305494093afff5733d8cc111e47f896658d9 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 11 May 2023 16:01:18 -0400 Subject: [PATCH 098/147] feat(commons): add shutdown handlers to always run --- shared/commons/lib/ShutdownHandler.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/shared/commons/lib/ShutdownHandler.ts b/shared/commons/lib/ShutdownHandler.ts index cc0dca5ca..4fd5ce9fd 100644 --- a/shared/commons/lib/ShutdownHandler.ts +++ b/shared/commons/lib/ShutdownHandler.ts @@ -14,12 +14,16 @@ export default class ShutdownHandler { private static readonly onShutdownFns: { fn: (signal?: ShutdownSignal) => Promise | any; callsite: string; + runWithDisabledSignals?: boolean; }[] = []; - public static register(onShutdownFn: (signal?: ShutdownSignal) => Promise | any): void { + public static register( + onShutdownFn: (signal?: ShutdownSignal) => Promise | any, + runWithDisabledSignals?: boolean, + ): void { this.registerSignals(); const callsite = new Error().stack.split(/\r?\n/).slice(2, 3).shift().trim(); - this.onShutdownFns.push({ fn: onShutdownFn, callsite }); + this.onShutdownFns.push({ fn: onShutdownFn, callsite, runWithDisabledSignals }); } public static unregister(onShutdownFn: (signal?: ShutdownSignal) => Promise | any): void { @@ -47,7 +51,6 @@ export default class ShutdownHandler { code?: number, isManual = false, ): Promise { - if (this.disableSignals && !isManual) return; if (this.hasRunHandlers) return; this.hasRunHandlers = true; @@ -56,8 +59,13 @@ export default class ShutdownHandler { sessionId: null, }); + const keepList = []; while (this.onShutdownFns.length) { const entry = this.onShutdownFns.shift(); + if (this.disableSignals && !isManual && !entry.runWithDisabledSignals) { + keepList.push(entry); + continue; + } log.stats('ShutdownHandler.execute', { signal, @@ -75,6 +83,7 @@ export default class ShutdownHandler { }); } } + this.onShutdownFns.push(...keepList); log.stats('ShutdownHandler.shutdownComplete', { signal, From 88808fb52c18400248981514eaabbdca4dfc904e Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 11 May 2023 16:01:48 -0400 Subject: [PATCH 099/147] fix(commons): change default settings to data dir --- shared/commons/config/hosts.ts | 4 ++-- shared/commons/config/index.ts | 4 ++-- shared/commons/lib/dirUtils.ts | 16 ++++++++++++++++ shared/commons/lib/envUtils.ts | 3 ++- shared/crypto/cli.ts | 2 +- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/shared/commons/config/hosts.ts b/shared/commons/config/hosts.ts index ccef03fa6..2177cc0c1 100644 --- a/shared/commons/config/hosts.ts +++ b/shared/commons/config/hosts.ts @@ -1,12 +1,12 @@ import * as Fs from 'fs'; import * as Path from 'path'; -import { getCacheDirectory } from '../lib/dirUtils'; +import { getDataDirectory } from '../lib/dirUtils'; import { isSemverSatisfied } from '../lib/VersionUtils'; import { isPortInUse } from '../lib/utils'; import { TypedEventEmitter } from '../lib/eventUtils'; export default class UlixeeHostsConfig extends TypedEventEmitter<{ change: void }> { - public static global = new UlixeeHostsConfig(Path.join(getCacheDirectory(), 'ulixee')); + public static global = new UlixeeHostsConfig(Path.join(getDataDirectory(), 'ulixee')); public hostByVersion: IUlixeeHostsConfig['hostByVersion'] = {}; #watchHandle: Fs.FSWatcher; diff --git a/shared/commons/config/index.ts b/shared/commons/config/index.ts index 3ea1753fa..5e526a0b6 100644 --- a/shared/commons/config/index.ts +++ b/shared/commons/config/index.ts @@ -1,6 +1,6 @@ import * as Fs from 'fs'; import * as Path from 'path'; -import { getCacheDirectory } from '../lib/dirUtils'; +import { getDataDirectory } from '../lib/dirUtils'; import { safeOverwriteFile } from '../lib/fileUtils'; import Callsite from '../lib/Callsite'; @@ -12,7 +12,7 @@ export default class UlixeeConfig { public static isCacheEnabled = process.env.NODE_END === 'production'; - private static globalConfigDirectory = Path.join(getCacheDirectory(), 'ulixee'); + private static globalConfigDirectory = Path.join(getDataDirectory(), 'ulixee'); private static globalConfig: UlixeeConfig; private static configDirectoryName = '.ulixee'; diff --git a/shared/commons/lib/dirUtils.ts b/shared/commons/lib/dirUtils.ts index 0e9ee0120..affff78f0 100644 --- a/shared/commons/lib/dirUtils.ts +++ b/shared/commons/lib/dirUtils.ts @@ -19,6 +19,22 @@ export function getCacheDirectory(): string { throw new Error(`Unsupported platform: ${process.platform}`); } +export function getDataDirectory(): string { + if (process.platform === 'linux') { + return process.env.XDG_DATA_HOME || Path.join(os.homedir(), '.local', 'share'); + } + + if (process.platform === 'darwin') { + return Path.join(os.homedir(), 'Library', 'Application Support'); + } + + if (process.platform === 'win32') { + return process.env.LOCALAPPDATA || Path.join(os.homedir(), 'AppData', 'Local'); + } + + throw new Error(`Unsupported platform: ${process.platform}`); +} + const homeDirReplace = new RegExp(os.homedir(), 'g'); export function cleanHomeDir(str: string): string { diff --git a/shared/commons/lib/envUtils.ts b/shared/commons/lib/envUtils.ts index d0bfb11b5..5e3adefb9 100644 --- a/shared/commons/lib/envUtils.ts +++ b/shared/commons/lib/envUtils.ts @@ -1,7 +1,7 @@ import * as Fs from 'fs'; import * as Path from 'path'; import * as Os from 'os'; -import { getCacheDirectory } from './dirUtils'; +import { getCacheDirectory, getDataDirectory } from './dirUtils'; /** * Will load env files with this precedence (.env.defaults, .env., .env) @@ -71,6 +71,7 @@ export function parseEnvPath(envvar: string, relativeTo?: string): string { if (!envvar) return undefined; if (envvar?.startsWith('~')) envvar = Path.join(Os.homedir(), envvar.slice(1)); if (envvar?.startsWith('')) envvar = envvar.replace('', getCacheDirectory()); + if (envvar?.startsWith('')) envvar = envvar.replace('', getDataDirectory()); if (envvar?.startsWith('')) envvar = envvar.replace('', Os.tmpdir()); if (Path.isAbsolute(envvar)) return envvar; return Path.resolve(relativeTo ?? process.cwd(), envvar); diff --git a/shared/crypto/cli.ts b/shared/crypto/cli.ts index a02134422..d2e51521c 100644 --- a/shared/crypto/cli.ts +++ b/shared/crypto/cli.ts @@ -143,7 +143,7 @@ export default function cliCommands(): Command { .option('-k, --privateKey ', 'The private key bytes') .option( '-f, --filename ', - 'Save this Identity to a filepath. If not specified, will be placed in /identities.', + 'Save this Identity to a filepath. If not specified, will be placed in /identities.', ) .option('-p, --passphrase ', 'Save identity to a file with a passphrase.') .option( From fd43acb4dcff0ab20f1b42d690da7900d2131684 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 11 May 2023 16:07:25 -0400 Subject: [PATCH 100/147] chore: update lint and test minimum node --- shared/.github/workflows/lint-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/.github/workflows/lint-and-test.yml b/shared/.github/workflows/lint-and-test.yml index 8799762f5..6d56634f5 100644 --- a/shared/.github/workflows/lint-and-test.yml +++ b/shared/.github/workflows/lint-and-test.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: os: [macos-latest, windows-latest, ubuntu-latest] - node-version: [14, 16] + node-version: [16, 18, 20] runs-on: ${{ matrix.os }} From 6e838834729c688aee31265b936e47ac05aca1e9 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 11 May 2023 16:10:03 -0400 Subject: [PATCH 101/147] chore: update lint to match new node version --- shared/.github/workflows/lint-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/.github/workflows/lint-and-test.yml b/shared/.github/workflows/lint-and-test.yml index 6d56634f5..b2ef956ba 100644 --- a/shared/.github/workflows/lint-and-test.yml +++ b/shared/.github/workflows/lint-and-test.yml @@ -33,7 +33,7 @@ jobs: run: yarn build - name: Run Lint - if: ${{ matrix.os == 'ubuntu-latest' && matrix.node-version == 14 }} + if: ${{ matrix.os == 'ubuntu-latest' && matrix.node-version == 18 }} run: NODE_OPTIONS=--max-old-space-size=4096 yarn lint - name: Run tests From 5cd55b4dd7a84958da5a923e679f7dfc9efc6597 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 11 May 2023 16:20:26 -0400 Subject: [PATCH 102/147] fix: souce map tests --- shared/commons/test/SourceLoader.test.ts | 2 +- shared/commons/test/SourceMapSupport.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/commons/test/SourceLoader.test.ts b/shared/commons/test/SourceLoader.test.ts index 9cfd93239..22391f0b1 100644 --- a/shared/commons/test/SourceLoader.test.ts +++ b/shared/commons/test/SourceLoader.test.ts @@ -10,6 +10,6 @@ it('can lookup source code', () => { return callsite; } const site = loadCallsite(); - expect(SourceLoader.getSource(site[0]).code).toBe(` callsite ??= Callsite.getSourceCodeLocation();`); + expect(SourceLoader.getSource(site[0]).code).toContain(`callsite ??= Callsite.getSourceCodeLocation();`); expect(SourceLoader.getSource(site[1]).code).toBe(` const site = loadCallsite();`); }); diff --git a/shared/commons/test/SourceMapSupport.test.ts b/shared/commons/test/SourceMapSupport.test.ts index be00efde7..8e42fdd6f 100644 --- a/shared/commons/test/SourceMapSupport.test.ts +++ b/shared/commons/test/SourceMapSupport.test.ts @@ -77,7 +77,7 @@ it('native function', () => { for (const stack of [full, inline]) { expect(stack[0]).toBe('Error: 1'); - expect(stack[1]).toMatch(/[/\\].original\.js/); + expect(stack[1]).toMatch(/\.original\.js/); expect(stack[2]).toMatch(/at Array\.map \((native|)\)/); } }); From c93ad1620369bad28e861c3c18c7dce6f410263c Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 11 May 2023 16:33:20 -0400 Subject: [PATCH 103/147] fix(commons): windows relative urls not working --- shared/commons/lib/SourceLoader.ts | 16 +++++----- shared/commons/lib/SourceMapSupport.ts | 40 ++++++++++++++++++------ shared/commons/test/SourceLoader.test.ts | 3 +- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/shared/commons/lib/SourceLoader.ts b/shared/commons/lib/SourceLoader.ts index 434a15e8f..7533c0795 100644 --- a/shared/commons/lib/SourceLoader.ts +++ b/shared/commons/lib/SourceLoader.ts @@ -1,5 +1,5 @@ -import { fileURLToPath } from 'url'; import * as fs from 'fs'; +import { URL } from 'url'; import ISourceCodeLocation from '../interfaces/ISourceCodeLocation'; import { SourceMapSupport } from './SourceMapSupport'; @@ -22,14 +22,14 @@ export default class SourceLoader { const sourcePosition = SourceMapSupport.getOriginalSourcePosition(codeLocation, true); const code = sourcePosition.content; - if (!this.sourceLines[sourcePosition.filename]) { - const file = code || this.getFileContents(sourcePosition.filename); + if (!this.sourceLines[sourcePosition.source]) { + const file = code || this.getFileContents(sourcePosition.source); if (!file) return null; - this.sourceLines[sourcePosition.filename] = file.split(/\r?\n/); + this.sourceLines[sourcePosition.source] = file.split(/\r?\n/); } (sourcePosition as any).code = - this.sourceLines[sourcePosition.filename][sourcePosition.line - 1]; + this.sourceLines[sourcePosition.source][sourcePosition.line - 1]; return sourcePosition as any; } @@ -38,14 +38,14 @@ export default class SourceLoader { if (cache && this.fileContentsCache[cacheKey]) return this.fileContentsCache[cacheKey]; // Trim the path to make sure there is no extra whitespace. - filepath = filepath.trim(); + let lookupFilepath: string | URL = filepath.trim(); if (filepath.startsWith('file://')) { - filepath = fileURLToPath(filepath); + lookupFilepath = new URL(filepath); } let data: string = null; try { - data = fs.readFileSync(filepath, 'utf8'); + data = fs.readFileSync(lookupFilepath, 'utf8'); } catch (err) { // couldn't read } diff --git a/shared/commons/lib/SourceMapSupport.ts b/shared/commons/lib/SourceMapSupport.ts index 495aca684..d96b5f7d4 100644 --- a/shared/commons/lib/SourceMapSupport.ts +++ b/shared/commons/lib/SourceMapSupport.ts @@ -31,6 +31,7 @@ export class SourceMapSupport { } = {}; private static resolvedPathCache: { [file_url: string]: string } = {}; + private static cacheKeys: { [file_url: string]: string } = {}; private static stackPathsToClear = new Set(); static clearStackPath(stackPath: string): void { @@ -39,6 +40,7 @@ export class SourceMapSupport { static resetCache(): void { this.sourceMapCache = {}; + this.cacheKeys = {}; this.resolvedPathCache = {}; } @@ -77,11 +79,7 @@ export class SourceMapSupport { position: ISourceCodeLocation, includeContent = false, ): ISourceCodeLocation & { name?: string; content?: string } { - const cacheKey = this.getCacheKey(position.filename); - let sourceMap = this.sourceMapCache[cacheKey]; - if (!sourceMap) { - sourceMap = this.retrieveSourceMap(position.filename); - } + const sourceMap = this.retrieveSourceMap(position.filename); // Resolve the source URL relative to the URL of the source map if (sourceMap && sourceMap.map) { @@ -163,6 +161,10 @@ export class SourceMapSupport { rawMap: sourceMapData, }; this.sourceMapCache[cacheKey] = sourceMap; + // Overwrite trace-mapping's resolutions, because they do not handle Windows paths the way we want. + sourceMap.map.resolvedSources = sourceMap.map.sources.map(s => + supportRelativeURL(sourceMap.url, s), + ); // Load all sources stored inline with the source map into the file cache // to pretend like they are already loaded. They may not exist on disk. @@ -190,7 +192,7 @@ export class SourceMapSupport { } public static getCacheKey(pathOrFileUrl): string { - if (this.resolvedPathCache[pathOrFileUrl]) return this.resolvedPathCache[pathOrFileUrl]; + if (this.cacheKeys[pathOrFileUrl]) return this.cacheKeys[pathOrFileUrl]; let result = pathOrFileUrl.trim(); @@ -204,10 +206,30 @@ export class SourceMapSupport { } catch { // keep original url } - this.resolvedPathCache[pathOrFileUrl] = result; + this.cacheKeys[pathOrFileUrl] = result; return result; } + private static resolvePath(base: string, relative: string): string { + if (!base) return relative; + const key = `${base}__${relative}`; + + if (!this.resolvedPathCache[key]) { + let protocol = base.startsWith(fileUrlPrefix) ? fileUrlPrefix : ''; + + let basePath = path.dirname(base).slice(protocol.length); + + // handle file:///C:/ paths + if (protocol && /^\/\w:/.test(basePath)) { + protocol += '/'; + basePath = basePath.slice(1); + } + + this.resolvedPathCache[key] = protocol + path.resolve(basePath, relative); + } + return this.resolvedPathCache[key]; + } + private static prepareStackTrace(error: Error, stack: NodeJS.CallSite[]): string { // node gives its own errors special treatment. Mimic that behavior // https://github.com/nodejs/node/blob/3cbaabc4622df1b4009b9d026a1a970bdbae6e89/lib/internal/errors.js#L118-L128 @@ -363,12 +385,12 @@ function CallSiteToString(): string { return line; } +// Matches the scheme of a URL, eg "http://" +const schemeRegex = /^[\w+.-]+:\/\//; function isAbsoluteUrl(input: string): boolean { return schemeRegex.test(input); } -// Matches the scheme of a URL, eg "http://" -const schemeRegex = /^[\w+.-]+:\/\//; function isSchemeRelativeUrl(input: string): boolean { return input.startsWith('//'); } diff --git a/shared/commons/test/SourceLoader.test.ts b/shared/commons/test/SourceLoader.test.ts index 22391f0b1..903410c44 100644 --- a/shared/commons/test/SourceLoader.test.ts +++ b/shared/commons/test/SourceLoader.test.ts @@ -10,6 +10,7 @@ it('can lookup source code', () => { return callsite; } const site = loadCallsite(); - expect(SourceLoader.getSource(site[0]).code).toContain(`callsite ??= Callsite.getSourceCodeLocation();`); + console.log(site); + expect(SourceLoader.getSource(site[0]).code).toBe(` callsite ??= Callsite.getSourceCodeLocation();`); expect(SourceLoader.getSource(site[1]).code).toBe(` const site = loadCallsite();`); }); From f4c7df16c957b8b465b01050fe9e2d3a4bf7e083 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 22 May 2023 13:37:36 -0400 Subject: [PATCH 104/147] chore: upgrade jest --- shared/commons/lib/Logger.ts | 3 + shared/jest.config.js | 2 +- shared/net/interfaces/ITransportToCore.ts | 4 +- shared/package.build.json | 4 +- shared/package.json | 16 +- shared/yarn.lock | 1703 ++++++++++++--------- 6 files changed, 992 insertions(+), 740 deletions(-) diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index e5bfbfd54..88b55a983 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -327,12 +327,15 @@ registerNamespaceMapping((ns, active, skip) => { /agent\/.*/, /plugins\/.*/, /net\/.*/, + /crypto\/.*/, + /commons\/.*/, /cloud\/.*/, /datastore[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, /ramps[/-].*/, /DevtoolsSessionLogger/, + /^lib\/.*/, ); } else if (ns === 'ulx') { active.push( diff --git a/shared/jest.config.js b/shared/jest.config.js index 8562b694a..4cf48002a 100644 --- a/shared/jest.config.js +++ b/shared/jest.config.js @@ -5,5 +5,5 @@ module.exports = {verbose: false, collectCoverage: false, transform: {}, testTimeout: 15e3, - reporters: ['default', 'jest-summary-reporter'] + reporters: ['default', ['github-actions', { silent: false }], 'summary'], }; diff --git a/shared/net/interfaces/ITransportToCore.ts b/shared/net/interfaces/ITransportToCore.ts index eb0613d51..68eb9af72 100644 --- a/shared/net/interfaces/ITransportToCore.ts +++ b/shared/net/interfaces/ITransportToCore.ts @@ -1,8 +1,8 @@ import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; +import IApiHandlers from './IApiHandlers'; +import ICoreEventPayload from './ICoreEventPayload'; import ICoreRequestPayload from './ICoreRequestPayload'; import ICoreResponsePayload from './ICoreResponsePayload'; -import ICoreEventPayload from './ICoreEventPayload'; -import IApiHandlers from './IApiHandlers'; export default interface ITransportToCore< ApiHandlers extends IApiHandlers = any, diff --git a/shared/package.build.json b/shared/package.build.json index d81643756..739eb8181 100644 --- a/shared/package.build.json +++ b/shared/package.build.json @@ -3,9 +3,7 @@ "test:build": "cross-env NODE_ENV=test jest" }, "devDependencies": { - "jest": "^28.1.0", - "jest-environment-node": "^28.1.0", - "jest-summary-reporter": "^0.0.2", + "jest": "^29.5.0", "cross-env": "^7.0.3" } } diff --git a/shared/package.json b/shared/package.json index badd5210e..b7d8f5603 100644 --- a/shared/package.json +++ b/shared/package.json @@ -20,18 +20,16 @@ "version:bump": "ulx-repo-version-bump" }, "devDependencies": { - "@commitlint/cli": "^12.0.1", - "@commitlint/config-conventional": "^12.0.1", - "@types/node": "^14.18.18", + "@commitlint/cli": "^17.6.3", + "@commitlint/config-conventional": "^17.6.3", + "@types/node": "^16.18.31", "@ulixee/repo-tools": "^1.0.24", "cross-env": "^7.0.3", - "@types/jest": "^28.1.0", - "jest": "^28.1.0", - "jest-environment-node": "^28.1.0", - "jest-summary-reporter": "^0.0.2", + "@types/jest": "^29.5.1", + "jest": "^29.5.0", "lerna": "^4.0.0", - "husky": "^7.0.1", - "lint-staged": "^10.5.2", + "husky": "^8.0.3", + "lint-staged": "^13.2.2", "shx": "^0.3.3", "typescript": "~4.7.3" }, diff --git a/shared/yarn.lock b/shared/yarn.lock index 92a70e34c..1277ffc33 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -155,6 +155,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== +"@babel/helper-plugin-utils@^7.20.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== + "@babel/helper-simple-access@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" @@ -246,6 +251,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": 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" @@ -379,142 +391,173 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@commitlint/cli@^12.0.1": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-12.1.4.tgz#af4d9dd3c0122c7b39a61fa1cd2abbad0422dbe0" - integrity sha512-ZR1WjXLvqEffYyBPT0XdnSxtt3Ty1TMoujEtseW5o3vPnkA1UNashAMjQVg/oELqfaiAMnDw8SERPMN0e/0kLg== +"@commitlint/cli@^17.6.3": + version "17.6.3" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.6.3.tgz#a02194a2bb6efe4e681eda2addd072a8d02c9497" + integrity sha512-ItSz2fd4F+CujgIbQOfNNerDF1eFlsBGEfp9QcCb1kxTYMuKTYZzA6Nu1YRRrIaaWwe2E7awUGpIMrPoZkOG3A== dependencies: - "@commitlint/format" "^12.1.4" - "@commitlint/lint" "^12.1.4" - "@commitlint/load" "^12.1.4" - "@commitlint/read" "^12.1.4" - "@commitlint/types" "^12.1.4" - lodash "^4.17.19" + "@commitlint/format" "^17.4.4" + "@commitlint/lint" "^17.6.3" + "@commitlint/load" "^17.5.0" + "@commitlint/read" "^17.5.1" + "@commitlint/types" "^17.4.4" + execa "^5.0.0" + lodash.isfunction "^3.0.9" resolve-from "5.0.0" resolve-global "1.0.0" - yargs "^16.2.0" - -"@commitlint/config-conventional@^12.0.1": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-12.1.4.tgz#95bbab622f117a8a3e49f95917b08655040c66a8" - integrity sha512-ZIdzmdy4o4WyqywMEpprRCrehjCSQrHkaRTVZV411GyLigFQHlEBSJITAihLAWe88Qy/8SyoIe5uKvAsV5vRqQ== - dependencies: - conventional-changelog-conventionalcommits "^4.3.1" - -"@commitlint/ensure@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-12.1.4.tgz#287ae2dcc5ccb086e749705b1bd9bdb99773056f" - integrity sha512-MxHIBuAG9M4xl33qUfIeMSasbv3ktK0W+iygldBxZOL4QSYC2Gn66pZAQMnV9o3V+sVFHoAK2XUKqBAYrgbEqw== - dependencies: - "@commitlint/types" "^12.1.4" - lodash "^4.17.19" - -"@commitlint/execute-rule@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-12.1.4.tgz#9973b02e9779adbf1522ae9ac207a4815ec73de1" - integrity sha512-h2S1j8SXyNeABb27q2Ok2vD1WfxJiXvOttKuRA9Or7LN6OQoC/KtT3844CIhhWNteNMu/wE0gkTqGxDVAnJiHg== - -"@commitlint/format@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-12.1.4.tgz#db2d46418a6ae57c90e5f7f65dff46f0265d9f24" - integrity sha512-h28ucMaoRjVvvgS6Bdf85fa/+ZZ/iu1aeWGCpURnQV7/rrVjkhNSjZwGlCOUd5kDV1EnZ5XdI7L18SUpRjs26g== - dependencies: - "@commitlint/types" "^12.1.4" - chalk "^4.0.0" - -"@commitlint/is-ignored@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-12.1.4.tgz#4c430bc3b361aa9be5cd4ddb252c1559870ea7bc" - integrity sha512-uTu2jQU2SKvtIRVLOzMQo3KxDtO+iJ1p0olmncwrqy4AfPLgwoyCP2CiULq5M7xpR3+dE3hBlZXbZTQbD7ycIw== - dependencies: - "@commitlint/types" "^12.1.4" - semver "7.3.5" - -"@commitlint/lint@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-12.1.4.tgz#856b7fd2b2e6367b836cb84a12f1c1b3c0e40d22" - integrity sha512-1kZ8YDp4to47oIPFELUFGLiLumtPNKJigPFDuHt2+f3Q3IKdQ0uk53n3CPl4uoyso/Og/EZvb1mXjFR/Yce4cA== - dependencies: - "@commitlint/is-ignored" "^12.1.4" - "@commitlint/parse" "^12.1.4" - "@commitlint/rules" "^12.1.4" - "@commitlint/types" "^12.1.4" + yargs "^17.0.0" + +"@commitlint/config-conventional@^17.6.3": + version "17.6.3" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.6.3.tgz#21f5835235493e386effeaa98b898124230b1000" + integrity sha512-bLyHEjjRWqlLQWIgYFHmUPbEFMOOLXeF3QbUinDIJev/u9e769tkoTH9YPknEywiuIrAgZaVo+OfzAIsJP0fsw== + dependencies: + conventional-changelog-conventionalcommits "^5.0.0" + +"@commitlint/config-validator@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.4.4.tgz#d0742705719559a101d2ee49c0c514044af6d64d" + integrity sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg== + dependencies: + "@commitlint/types" "^17.4.4" + ajv "^8.11.0" + +"@commitlint/ensure@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.4.4.tgz#a36e7719bdb9c2b86c8b8c2e852b463a7bfda5fa" + integrity sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g== + dependencies: + "@commitlint/types" "^17.4.4" + lodash.camelcase "^4.3.0" + lodash.kebabcase "^4.1.1" + lodash.snakecase "^4.1.1" + lodash.startcase "^4.4.0" + lodash.upperfirst "^4.3.1" + +"@commitlint/execute-rule@^17.4.0": + version "17.4.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz#4518e77958893d0a5835babe65bf87e2638f6939" + integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== + +"@commitlint/format@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.4.4.tgz#0f6e1b4d7a301c7b1dfd4b6334edd97fc050b9f5" + integrity sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ== + dependencies: + "@commitlint/types" "^17.4.4" + chalk "^4.1.0" -"@commitlint/load@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-12.1.4.tgz#e3c2dbc0e7d8d928f57a6878bd7219909fc0acab" - integrity sha512-Keszi0IOjRzKfxT+qES/n+KZyLrxy79RQz8wWgssCboYjKEp+wC+fLCgbiMCYjI5k31CIzIOq/16J7Ycr0C0EA== - dependencies: - "@commitlint/execute-rule" "^12.1.4" - "@commitlint/resolve-extends" "^12.1.4" - "@commitlint/types" "^12.1.4" - chalk "^4.0.0" - cosmiconfig "^7.0.0" - lodash "^4.17.19" +"@commitlint/is-ignored@^17.6.3": + version "17.6.3" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.6.3.tgz#8e21046558a0339fbf2a33ef0ad7d5a9ae7ff6bc" + integrity sha512-LQbNdnPbxrpbcrVKR5yf51SvquqktpyZJwqXx3lUMF6+nT9PHB8xn3wLy8pi2EQv5Zwba484JnUwDE1ygVYNQA== + dependencies: + "@commitlint/types" "^17.4.4" + semver "7.5.0" + +"@commitlint/lint@^17.6.3": + version "17.6.3" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.6.3.tgz#2d9a88b73c44be8b97508c980198a6f289251655" + integrity sha512-fBlXwt6SHJFgm3Tz+luuo3DkydAx9HNC5y4eBqcKuDuMVqHd2ugMNr+bQtx6riv9mXFiPoKp7nE4Xn/ls3iVDA== + dependencies: + "@commitlint/is-ignored" "^17.6.3" + "@commitlint/parse" "^17.4.4" + "@commitlint/rules" "^17.6.1" + "@commitlint/types" "^17.4.4" + +"@commitlint/load@^17.5.0": + version "17.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.5.0.tgz#be45dbbb50aaf5eb7e8e940e1e0d6171d1426bab" + integrity sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q== + dependencies: + "@commitlint/config-validator" "^17.4.4" + "@commitlint/execute-rule" "^17.4.0" + "@commitlint/resolve-extends" "^17.4.4" + "@commitlint/types" "^17.4.4" + "@types/node" "*" + chalk "^4.1.0" + cosmiconfig "^8.0.0" + cosmiconfig-typescript-loader "^4.0.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" resolve-from "^5.0.0" + ts-node "^10.8.1" + typescript "^4.6.4 || ^5.0.0" -"@commitlint/message@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-12.1.4.tgz#3895edcc0709deca5945f3d55f5ea95a9f1f446d" - integrity sha512-6QhalEKsKQ/Y16/cTk5NH4iByz26fqws2ub+AinHPtM7Io0jy4e3rym9iE+TkEqiqWZlUigZnTwbPvRJeSUBaA== +"@commitlint/message@^17.4.2": + version "17.4.2" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.4.2.tgz#f4753a79701ad6db6db21f69076e34de6580e22c" + integrity sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q== -"@commitlint/parse@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-12.1.4.tgz#ba03d54d24ef84f6fd2ff31c5e9998b22d7d0aa1" - integrity sha512-yqKSAsK2V4X/HaLb/yYdrzs6oD/G48Ilt0EJ2Mp6RJeWYxG14w/Out6JrneWnr/cpzemyN5hExOg6+TB19H/Lw== +"@commitlint/parse@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.4.4.tgz#8311b12f2b730de6ea0679ae2a37b386bcc5b04b" + integrity sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg== dependencies: - "@commitlint/types" "^12.1.4" + "@commitlint/types" "^17.4.4" conventional-changelog-angular "^5.0.11" - conventional-commits-parser "^3.0.0" + conventional-commits-parser "^3.2.2" -"@commitlint/read@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-12.1.4.tgz#552fda42ef185d5b578beb6f626a5f8b282de3a6" - integrity sha512-TnPQSJgD8Aod5Xeo9W4SaYKRZmIahukjcCWJ2s5zb3ZYSmj6C85YD9cR5vlRyrZjj78ItLUV/X4FMWWVIS38Jg== +"@commitlint/read@^17.5.1": + version "17.5.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.5.1.tgz#fec903b766e2c41e3cefa80630040fcaba4f786c" + integrity sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg== dependencies: - "@commitlint/top-level" "^12.1.4" - "@commitlint/types" "^12.1.4" - fs-extra "^9.0.0" - git-raw-commits "^2.0.0" + "@commitlint/top-level" "^17.4.0" + "@commitlint/types" "^17.4.4" + fs-extra "^11.0.0" + git-raw-commits "^2.0.11" + minimist "^1.2.6" -"@commitlint/resolve-extends@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-12.1.4.tgz#e758ed7dcdf942618b9f603a7c28a640f6a0802a" - integrity sha512-R9CoUtsXLd6KSCfsZly04grsH6JVnWFmVtWgWs1KdDpdV+G3TSs37tColMFqglpkx3dsWu8dsPD56+D9YnJfqg== +"@commitlint/resolve-extends@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz#8f931467dea8c43b9fe38373e303f7c220de6fdc" + integrity sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A== dependencies: + "@commitlint/config-validator" "^17.4.4" + "@commitlint/types" "^17.4.4" import-fresh "^3.0.0" - lodash "^4.17.19" + lodash.mergewith "^4.6.2" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-12.1.4.tgz#0e141b08caa3d7bdc48aa784baa8baff3efd64db" - integrity sha512-W8m6ZSjg7RuIsIfzQiFHa48X5mcPXeKT9yjBxVmjHvYfS2FDBf1VxCQ7vO0JTVIdV4ohjZ0eKg/wxxUuZHJAZg== +"@commitlint/rules@^17.6.1": + version "17.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.6.1.tgz#dff529b8d1e0455808fe7e3e1fa70617e4eb2759" + integrity sha512-lUdHw6lYQ1RywExXDdLOKxhpp6857/4c95Dc/1BikrHgdysVUXz26yV0vp1GL7Gv+avx9WqZWTIVB7pNouxlfw== dependencies: - "@commitlint/ensure" "^12.1.4" - "@commitlint/message" "^12.1.4" - "@commitlint/to-lines" "^12.1.4" - "@commitlint/types" "^12.1.4" + "@commitlint/ensure" "^17.4.4" + "@commitlint/message" "^17.4.2" + "@commitlint/to-lines" "^17.4.0" + "@commitlint/types" "^17.4.4" + execa "^5.0.0" -"@commitlint/to-lines@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-12.1.4.tgz#caa582dbf121f377a0588bb64e25c4854843cd25" - integrity sha512-TParumvbi8bdx3EdLXz2MaX+e15ZgoCqNUgqHsRLwyqLUTRbqCVkzrfadG1UcMQk8/d5aMbb327ZKG3Q4BRorw== +"@commitlint/to-lines@^17.4.0": + version "17.4.0" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.4.0.tgz#9bd02e911e7d4eab3fb4a50376c4c6d331e10d8d" + integrity sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg== -"@commitlint/top-level@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-12.1.4.tgz#96d5c715bfc1bdf86dfcf11b67fc2cf7658c7a6e" - integrity sha512-d4lTJrOT/dXlpY+NIt4CUl77ciEzYeNVc0VFgUQ6VA+b1rqYD2/VWFjBlWVOrklxtSDeKyuEhs36RGrppEFAvg== +"@commitlint/top-level@^17.4.0": + version "17.4.0" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.4.0.tgz#540cac8290044cf846fbdd99f5cc51e8ac5f27d6" + integrity sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g== dependencies: find-up "^5.0.0" -"@commitlint/types@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-12.1.4.tgz#9618a5dc8991fb58e6de6ed89d7bf712fa74ba7e" - integrity sha512-KRIjdnWNUx6ywz+SJvjmNCbQKcKP6KArhjZhY2l+CWKxak0d77SOjggkMwFTiSgLODOwmuLTbarR2ZfWPiPMlw== +"@commitlint/types@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.4.4.tgz#1416df936e9aad0d6a7bbc979ecc31e55dade662" + integrity sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ== dependencies: - chalk "^4.0.0" + chalk "^4.1.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -583,110 +626,110 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.1.tgz#305f8ca50b6e70413839f54c0e002b60a0f2fd7d" - integrity sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA== +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^28.1.1" - jest-util "^28.1.1" + jest-message-util "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" -"@jest/core@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.1.tgz#086830bec6267accf9af5ca76f794858e9f9f092" - integrity sha512-3pYsBoZZ42tXMdlcFeCc/0j9kOlK7MYuXs2B1QbvDgMoW1K9NJ4G/VYvIbMb26iqlkTfPHo7SC2JgjDOk/mxXw== +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== dependencies: - "@jest/console" "^28.1.1" - "@jest/reporters" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^28.0.2" - jest-config "^28.1.1" - jest-haste-map "^28.1.1" - jest-message-util "^28.1.1" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-resolve-dependencies "^28.1.1" - jest-runner "^28.1.1" - jest-runtime "^28.1.1" - jest-snapshot "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" - jest-watcher "^28.1.1" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" micromatch "^4.0.4" - pretty-format "^28.1.1" - rimraf "^3.0.0" + pretty-format "^29.5.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.1.tgz#c4cbf85283278d768f816ebd1a258ea6f9e39d4f" - integrity sha512-9auVQ2GzQ7nrU+lAr8KyY838YahElTX9HVjbQPPS2XjlxQ+na18G113OoBhyBGBtD6ZnO/SrUy5WR8EzOj1/Uw== +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== dependencies: - "@jest/fake-timers" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^28.1.1" + jest-mock "^29.5.0" -"@jest/expect-utils@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.1.tgz#d84c346025b9f6f3886d02c48a6177e2b0360587" - integrity sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw== +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: - jest-get-type "^28.0.2" + jest-get-type "^29.4.3" -"@jest/expect@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.1.tgz#ea4fcc8504b45835029221c0dc357c622a761326" - integrity sha512-/+tQprrFoT6lfkMj4mW/mUIfAmmk/+iQPmg7mLDIFOf2lyf7EBHaS+x3RbeR0VZVMe55IvX7QRoT/2aK3AuUXg== +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== dependencies: - expect "^28.1.1" - jest-snapshot "^28.1.1" + expect "^29.5.0" + jest-snapshot "^29.5.0" -"@jest/fake-timers@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.1.tgz#47ce33296ab9d680c76076d51ddbe65ceb3337f1" - integrity sha512-BY/3+TyLs5+q87rGWrGUY5f8e8uC3LsVHS9Diz8+FV3ARXL4sNnkLlIB8dvDvRrp+LUCGM+DLqlsYubizGUjIA== +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== dependencies: - "@jest/types" "^28.1.1" - "@sinonjs/fake-timers" "^9.1.1" + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^28.1.1" - jest-mock "^28.1.1" - jest-util "^28.1.1" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" -"@jest/globals@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.1.tgz#c0a7977f85e26279cc090d9adcdf82b8a34c4061" - integrity sha512-dEgl/6v7ToB4vXItdvcltJBgny0xBE6xy6IYQrPJAJggdEinGxCDMivNv7sFzPcTITGquXD6UJwYxfJ/5ZwDSg== +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== dependencies: - "@jest/environment" "^28.1.1" - "@jest/expect" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" -"@jest/reporters@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662" - integrity sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg== +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" - "@jridgewell/trace-mapping" "^0.3.7" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -698,78 +741,77 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^28.1.1" - jest-util "^28.1.1" - jest-worker "^28.1.1" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" - terminal-link "^2.0.0" - v8-to-istanbul "^9.0.0" + v8-to-istanbul "^9.0.1" -"@jest/schemas@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" - integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== dependencies: - "@sinclair/typebox" "^0.23.3" + "@sinclair/typebox" "^0.25.16" -"@jest/source-map@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90" - integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw== +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.15" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" - integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== dependencies: - "@jest/console" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.1.tgz#f594ee2331df75000afe0d1ae3237630ecec732e" - integrity sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA== +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== dependencies: - "@jest/test-result" "^28.1.1" + "@jest/test-result" "^29.5.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" + jest-haste-map "^29.5.0" slash "^3.0.0" -"@jest/transform@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.1.tgz#83541f2a3f612077c8501f49cc4e205d4e4a6b27" - integrity sha512-PkfaTUuvjUarl1EDr5ZQcCA++oXkFCP9QFUkG0yVKVmNObjhrqDy0kbMpMebfHWm3CCDHjYNem9eUSH8suVNHQ== +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^28.1.1" - "@jridgewell/trace-mapping" "^0.3.7" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" 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 "^28.1.1" - jest-regex-util "^28.0.2" - jest-util "^28.1.1" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^4.0.2" -"@jest/types@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.1.tgz#d059bbc80e6da6eda9f081f293299348bd78ee0b" - integrity sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw== +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== dependencies: - "@jest/schemas" "^28.0.2" + "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -818,7 +860,15 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== -"@jridgewell/trace-mapping@^0.3.18": +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.18": version "0.3.18" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== @@ -826,7 +876,7 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== @@ -1697,30 +1747,50 @@ dependencies: "@octokit/openapi-types" "^12.7.0" -"@sinclair/typebox@^0.23.3": - version "0.23.5" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" - integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.1": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/fake-timers@^10.0.2": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz#b3e322a34c5f26e3184e7f6115695f299c1b1194" + integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^3.0.0" "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" @@ -1787,13 +1857,13 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^28.1.0": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.1.tgz#8c9ba63702a11f8c386ee211280e8b68cb093cd1" - integrity sha512-C2p7yqleUKtCkVjlOur9BWVA4HgUQmEj/HWCt5WzZ5mLXrWnyIfl0wGuArc+kBXsy0ZZfLp+7dywB4HtSVYGVA== +"@types/jest@^29.5.1": + version "29.5.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47" + integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ== dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" "@types/json-schema@^7.0.9": version "7.0.11" @@ -1820,10 +1890,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.35.tgz#635b7586086d51fb40de0a2ec9d1014a5283ba4a" integrity sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg== -"@types/node@^14.18.18": - version "14.18.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.18.tgz#5c9503030df484ccffcbb935ea9a9e1d6fad1a20" - integrity sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig== +"@types/node@^16.18.31": + version "16.18.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.31.tgz#7de39c2b9363f0d95b129cc969fcbf98e870251c" + integrity sha512-KPXltf4z4g517OlVJO9XQ2357CYw7fvuJ3ZuBynjXC5Jos9i+K7LvFb7bUIwtJXSZj0vTp9Q6NJBSQpkwwO8Zw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2041,6 +2111,16 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + acorn@^8.7.1: version "8.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" @@ -2085,10 +2165,15 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== +ajv@^8.11.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" @@ -2107,6 +2192,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2126,6 +2216,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -2152,6 +2247,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2286,15 +2386,15 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-jest@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.1.tgz#2a3a4ae50964695b2d694ccffe4bec537c5a3586" - integrity sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw== +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== dependencies: - "@jest/transform" "^28.1.1" + "@jest/transform" "^29.5.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.1.1" + babel-preset-jest "^29.5.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -2310,10 +2410,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.1.tgz#5e055cdcc47894f28341f87f5e35aad2df680b11" - integrity sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw== +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -2338,12 +2438,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.1.tgz#5b6e5e69f963eb2d70f739c607b8f723c0ee75e4" - integrity sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g== +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== dependencies: - babel-plugin-jest-hoist "^28.1.1" + babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -2492,7 +2592,12 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^2.0.0, chalk@^2.4.1: +chalk@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2572,6 +2677,14 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -2586,6 +2699,15 @@ cliui@^7.0.2: 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" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -2646,10 +2768,10 @@ 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@^2.0.16: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== +colorette@^2.0.19: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== columnify@^1.5.4: version "1.6.0" @@ -2666,10 +2788,10 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^9.3.0: version "9.4.0" @@ -2725,10 +2847,10 @@ conventional-changelog-angular@^5.0.11, conventional-changelog-angular@^5.0.12: compare-func "^2.0.0" q "^1.5.1" -conventional-changelog-conventionalcommits@^4.3.1: - version "4.6.3" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" - integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== +conventional-changelog-conventionalcommits@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz#41bdce54eb65a848a4a3ffdca93e92fa22b64a86" + integrity sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw== dependencies: compare-func "^2.0.0" lodash "^4.17.15" @@ -2782,7 +2904,7 @@ conventional-commits-filter@^2.0.7: lodash.ismatch "^4.4.0" modify-values "^1.0.0" -conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.2.0: +conventional-commits-parser@^3.2.0, conventional-commits-parser@^3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== @@ -2808,13 +2930,18 @@ conventional-recommended-bump@^6.1.0: meow "^8.0.0" q "^1.5.1" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" +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" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + copyfiles@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" @@ -2843,6 +2970,11 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig-typescript-loader@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz#c4259ce474c9df0f32274ed162c0447c951ef073" + integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== + cosmiconfig@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" @@ -2854,6 +2986,21 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.0.0: + version "8.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" + integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-env@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" @@ -2892,7 +3039,7 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3014,15 +3161,15 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -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.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dir-glob@^3.0.1: version "3.0.1" @@ -3064,6 +3211,11 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -3077,10 +3229,10 @@ electron-to-chromium@^1.4.118: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f" integrity sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA== -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +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" @@ -3106,13 +3258,6 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -3448,7 +3593,7 @@ eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -execa@^4.0.0, execa@^4.1.0: +execa@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -3478,21 +3623,36 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.1.tgz#ca6fff65f6517cf7220c2e805a49c19aea30b420" - integrity sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w== +expect@^29.0.0, expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== dependencies: - "@jest/expect-utils" "^28.1.1" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.1" - jest-message-util "^28.1.1" - jest-util "^28.1.1" + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" extend@~3.0.2: version "3.0.2" @@ -3539,7 +3699,7 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +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== @@ -3639,7 +3799,16 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fs-extra@^9.0.0, fs-extra@^9.1.0: +fs-extra@^11.0.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -3731,11 +3900,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -3763,7 +3927,7 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -3783,7 +3947,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-raw-commits@^2.0.0, git-raw-commits@^2.0.8: +git-raw-commits@^2.0.11, git-raw-commits@^2.0.8: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== @@ -4033,6 +4197,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -4040,10 +4209,10 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -husky@^7.0.1: - version "7.0.4" - resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" - integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== iconv-lite@^0.4.24: version "0.4.24" @@ -4234,6 +4403,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -4268,11 +4442,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" @@ -4308,11 +4477,6 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -4332,6 +4496,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -4358,11 +4527,6 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -4437,395 +4601,366 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.0.2.tgz#7d7810660a5bd043af9e9cfbe4d58adb05e91531" - integrity sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA== +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== dependencies: execa "^5.0.0" - throat "^6.0.1" + p-limit "^3.1.0" -jest-circus@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.1.tgz#3d27da6a974d85a466dc0cdc6ddeb58daaa57bb4" - integrity sha512-75+BBVTsL4+p2w198DQpCeyh1RdaS2lhEG87HkaFX/UG0gJExVq2skG2pT7XZEGBubNj2CytcWSPan4QEPNosw== +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== dependencies: - "@jest/environment" "^28.1.1" - "@jest/expect" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^28.1.1" - jest-matcher-utils "^28.1.1" - jest-message-util "^28.1.1" - jest-runtime "^28.1.1" - jest-snapshot "^28.1.1" - jest-util "^28.1.1" - pretty-format "^28.1.1" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + p-limit "^3.1.0" + pretty-format "^29.5.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" - throat "^6.0.1" -jest-cli@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.1.tgz#23ddfde8940e1818585ae4a568877b33b0e51cfe" - integrity sha512-+sUfVbJqb1OjBZ0OdBbI6OWfYM1i7bSfzYy6gze1F1w3OKWq8ZTEKkZ8a7ZQPq6G/G1qMh/uKqpdWhgl11NFQQ== +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== dependencies: - "@jest/core" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.1.tgz#e90b97b984f14a6c24a221859e81b258990fce2f" - integrity sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA== +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.1" - "@jest/types" "^28.1.1" - babel-jest "^28.1.1" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^28.1.1" - jest-environment-node "^28.1.1" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-runner "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^28.1.1" + pretty-format "^29.5.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== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-diff@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.1.tgz#1a3eedfd81ae79810931c63a1d0f201b9120106c" - integrity sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg== +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== dependencies: chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.1" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== dependencies: detect-newline "^3.0.0" -jest-each@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.1.tgz#ba5238dacf4f31d9fe23ddc2c44c01e7c23885c4" - integrity sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw== +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^29.5.0" chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.1" - pretty-format "^28.1.1" - -jest-environment-node@^28.1.0, jest-environment-node@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.1.tgz#1c86c59003a7d319fa06ea3b1bbda6c193715c67" - integrity sha512-2aV/eeY/WNgUUJrrkDJ3cFEigjC5fqT1+fCclrY6paqJ5zVPoM//sHmfgUUp7WLYxIdbPwMiVIzejpN56MxnNA== - dependencies: - "@jest/environment" "^28.1.1" - "@jest/fake-timers" "^28.1.1" - "@jest/types" "^28.1.1" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^28.1.1" - jest-util "^28.1.1" + jest-mock "^29.5.0" + jest-util "^29.5.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.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== - -jest-haste-map@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.1.tgz#471685f1acd365a9394745bb97c8fc16289adca3" - integrity sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ== +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^29.5.0" "@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 "^28.0.2" - jest-util "^28.1.1" - jest-worker "^28.1.1" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.1.tgz#537f37afd610a4b3f4cab15e06baf60484548efb" - integrity sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw== - dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.1" - -jest-matcher-utils@^27.0.0: - 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-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-matcher-utils@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz#a7c4653c2b782ec96796eb3088060720f1e29304" - integrity sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw== +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: chalk "^4.0.0" - jest-diff "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.1" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-message-util@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.1.tgz#60aa0b475cfc08c8a9363ed2fb9108514dd9ab89" - integrity sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ== +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.1" + "@jest/types" "^29.5.0" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^28.1.1" + pretty-format "^29.5.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.1.tgz#37903d269427fa1ef5b2447be874e1c62a39a371" - integrity sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw== +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^29.5.0" "@types/node" "*" + jest-util "^29.5.0" jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== -jest-resolve-dependencies@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.1.tgz#3dffaaa56f4b41bc6b61053899d1756401763a27" - integrity sha512-p8Y150xYJth4EXhOuB8FzmS9r8IGLEioiaetgdNGb9VHka4fl0zqWlVe4v7mSkYOuEUg2uB61iE+zySDgrOmgQ== +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.1" + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" -jest-resolve@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5" - integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" + jest-haste-map "^29.5.0" jest-pnp-resolver "^1.2.2" - jest-util "^28.1.1" - jest-validate "^28.1.1" + jest-util "^29.5.0" + jest-validate "^29.5.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.1.tgz#9ecdb3f27a00059986797aa6b012ba8306aa436c" - integrity sha512-W5oFUiDBgTsCloTAj6q95wEvYDB0pxIhY6bc5F26OucnwBN+K58xGTGbliSMI4ChQal5eANDF+xvELaYkJxTmA== +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== dependencies: - "@jest/console" "^28.1.1" - "@jest/environment" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - emittery "^0.10.2" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.1" - jest-haste-map "^28.1.1" - jest-leak-detector "^28.1.1" - jest-message-util "^28.1.1" - jest-resolve "^28.1.1" - jest-runtime "^28.1.1" - jest-util "^28.1.1" - jest-watcher "^28.1.1" - jest-worker "^28.1.1" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" + p-limit "^3.1.0" source-map-support "0.5.13" - throat "^6.0.1" - -jest-runtime@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.1.tgz#569e1dc3c36c6c4c0b29516c1c49b6ad580abdaf" - integrity sha512-J89qEJWW0leOsqyi0D9zHpFEYHwwafFdS9xgvhFHtIdRghbadodI0eA+DrthK/1PebBv3Px8mFSMGKrtaVnleg== - dependencies: - "@jest/environment" "^28.1.1" - "@jest/fake-timers" "^28.1.1" - "@jest/globals" "^28.1.1" - "@jest/source-map" "^28.0.2" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" + +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@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 "^28.1.1" - jest-message-util "^28.1.1" - jest-mock "^28.1.1" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-snapshot "^28.1.1" - jest-util "^28.1.1" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.1.tgz#ab825c16c8d8b5e883bd57eee6ca8748c42ab848" - integrity sha512-1KjqHJ98adRcbIdMizjF5DipwZFbvxym/kFO4g4fVZCZRxH/dqV8TiBFCa6rqic3p0karsy8RWS1y4E07b7P0A== +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^28.1.1" + expect "^29.5.0" graceful-fs "^4.2.9" - jest-diff "^28.1.1" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.1" - jest-matcher-utils "^28.1.1" - jest-message-util "^28.1.1" - jest-util "^28.1.1" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" natural-compare "^1.4.0" - pretty-format "^28.1.1" + pretty-format "^29.5.0" semver "^7.3.5" -jest-summary-reporter@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/jest-summary-reporter/-/jest-summary-reporter-0.0.2.tgz#53b9997b56f343a0dd9af24199c68d371e01f534" - integrity sha512-rZ3ThO57l+ZJCxF74cXIGQU3cV9I7bSBe1ElBp0taE3x2JghgD69bNCKt0LvpVQX5azTRHG7LmcjIpwriVnTng== - dependencies: - chalk "^2.4.1" - -jest-util@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" - integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.1.tgz#59b7b339b3c85b5144bd0c06ad3600f503a4acc8" - integrity sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug== +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^29.5.0" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^28.0.2" + jest-get-type "^29.4.3" leven "^3.1.0" - pretty-format "^28.1.1" + pretty-format "^29.5.0" -jest-watcher@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.1.tgz#533597fb3bfefd52b5cd115cd916cffd237fb60c" - integrity sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug== +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== dependencies: - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.1" + emittery "^0.13.1" + jest-util "^29.5.0" string-length "^4.0.1" -jest-worker@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.1.tgz#3480c73247171dfd01eda77200f0063ab6a3bf28" - integrity sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ== +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== dependencies: "@types/node" "*" + jest-util "^29.5.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^28.1.0: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.1.tgz#3c39a3a09791e16e9ef283597d24ab19a0df701e" - integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA== +jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== dependencies: - "@jest/core" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" import-local "^3.0.2" - jest-cli "^28.1.1" + jest-cli "^29.5.0" js-tokens@^4.0.0: version "4.0.0" @@ -4872,6 +5007,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" @@ -5011,43 +5151,46 @@ libnpmpublish@^4.0.0: semver "^7.1.3" ssri "^8.0.1" +lilconfig@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@^10.5.2: - version "10.5.4" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" - integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== +lint-staged@^13.2.2: + version "13.2.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.2.tgz#5e711d3139c234f73402177be2f8dd312e6508ca" + integrity sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA== dependencies: - chalk "^4.1.0" - cli-truncate "^2.1.0" - commander "^6.2.0" - cosmiconfig "^7.0.0" - debug "^4.2.0" - dedent "^0.7.0" - enquirer "^2.3.6" - execa "^4.1.0" - listr2 "^3.2.2" - log-symbols "^4.0.0" - micromatch "^4.0.2" + chalk "5.2.0" + cli-truncate "^3.1.0" + commander "^10.0.0" + debug "^4.3.4" + execa "^7.0.0" + lilconfig "2.1.0" + listr2 "^5.0.7" + micromatch "^4.0.5" normalize-path "^3.0.0" - please-upgrade-node "^3.2.0" - string-argv "0.3.1" - stringify-object "^3.3.0" + object-inspect "^1.12.3" + pidtree "^0.6.0" + string-argv "^0.3.1" + yaml "^2.2.2" -listr2@^3.2.2: - version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" - integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== +listr2@^5.0.7: + version "5.0.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" + integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== dependencies: cli-truncate "^2.1.0" - colorette "^2.0.16" + colorette "^2.0.19" log-update "^4.0.0" p-map "^4.0.0" rfdc "^1.3.0" - rxjs "^7.5.1" + rxjs "^7.8.0" through "^2.3.8" wrap-ansi "^7.0.0" @@ -5098,16 +5241,51 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== + lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -5123,19 +5301,21 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.upperfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== + lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -5168,6 +5348,11 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + make-fetch-happen@^8.0.9: version "8.0.14" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" @@ -5255,7 +5440,7 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -5280,6 +5465,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -5679,6 +5869,13 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -5709,6 +5906,11 @@ object-inspect@^1.12.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-inspect@^1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -5766,6 +5968,13 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -5815,7 +6024,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== @@ -5987,6 +6196,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -6019,6 +6233,11 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -6051,13 +6270,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -please-upgrade-node@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" - integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== - dependencies: - semver-compare "^1.0.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -6075,22 +6287,12 @@ prettier@^2.6.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== -pretty-format@^27.0.0, 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== +pretty-format@^29.0.0, pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.1.tgz#f731530394e0f7fcd95aba6b43c50e02d86b95cb" - integrity sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw== - dependencies: - "@jest/schemas" "^28.0.2" - ansi-regex "^5.0.1" + "@jest/schemas" "^29.4.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -6172,6 +6374,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -6209,11 +6416,6 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -react-is@^17.0.1: - version "17.0.2" - 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.1.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" @@ -6430,6 +6632,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + requireindex@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" @@ -6459,10 +6666,10 @@ resolve-global@1.0.0, resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +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.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.0: version "1.22.0" @@ -6503,7 +6710,7 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" -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== @@ -6529,10 +6736,10 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" -rxjs@^7.5.1: - version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== +rxjs@^7.8.0: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" @@ -6551,20 +6758,15 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - "semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" @@ -6663,6 +6865,14 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -6815,10 +7025,10 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== -string-argv@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== +string-argv@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== string-length@^4.0.1: version "4.0.2" @@ -6846,6 +7056,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.trimend@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" @@ -6883,15 +7102,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -6906,6 +7116,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -6921,6 +7138,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -6949,7 +7171,7 @@ supports-color@^5.3.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== @@ -6963,14 +7185,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - 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" @@ -7017,14 +7231,6 @@ temp-write@^4.0.0: temp-dir "^1.0.0" uuid "^3.3.2" -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" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -7044,11 +7250,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - through2@^2.0.0, through2@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -7118,6 +7319,25 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +ts-node@^10.8.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -7216,15 +7436,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^5.0.4: +"typescript@^4.6.4 || ^5.0.0", typescript@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== typescript@~4.7.3: - version "4.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" - integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== + version "4.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== uglify-js@^3.1.4: version "3.16.2" @@ -7309,17 +7529,22 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache-lib@^3.0.1: + version "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-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz#be0dae58719fc53cb97e5c7ac1d7e6d4f5b19511" - integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw== +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -7472,10 +7697,10 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" - integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== +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" signal-exit "^3.0.7" @@ -7543,6 +7768,11 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.2.tgz#ec551ef37326e6d42872dad1970300f8eb83a073" + integrity sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -7558,6 +7788,11 @@ yargs-parser@^21.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== +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.1.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -7571,6 +7806,19 @@ yargs@^16.1.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.0.0: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yargs@^17.3.1: version "17.5.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" @@ -7584,6 +7832,11 @@ yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.0.0" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 954cffa90c54c2f0eab1063c8cd74ff35cafe977 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 22 May 2023 13:38:15 -0400 Subject: [PATCH 105/147] =?UTF-8?q?fix(commons):=20don=E2=80=99t=20retrans?= =?UTF-8?q?late=20source=20maps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/commons/lib/SourceLoader.ts | 14 +++++++++++--- shared/commons/lib/SourceMapSupport.ts | 6 ++++++ shared/commons/test/SourceLoader.test.ts | 1 - 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/shared/commons/lib/SourceLoader.ts b/shared/commons/lib/SourceLoader.ts index 7533c0795..76f497d39 100644 --- a/shared/commons/lib/SourceLoader.ts +++ b/shared/commons/lib/SourceLoader.ts @@ -28,14 +28,22 @@ export default class SourceLoader { this.sourceLines[sourcePosition.source] = file.split(/\r?\n/); } - (sourcePosition as any).code = - this.sourceLines[sourcePosition.source][sourcePosition.line - 1]; + (sourcePosition as any).code = this.sourceLines[sourcePosition.source][sourcePosition.line - 1]; return sourcePosition as any; } + static getSourceLines(codeLocation: ISourceCodeLocation): string[] { + if (!codeLocation) return []; + + const source = this.getSource(codeLocation); + if (source?.code) return this.sourceLines[source.source]; + return []; + } + static getFileContents(filepath: string, cache = true): string { + if (!filepath) return null; const cacheKey = SourceMapSupport.getCacheKey(filepath); - if (cache && this.fileContentsCache[cacheKey]) return this.fileContentsCache[cacheKey]; + if (cache && cacheKey in this.fileContentsCache) return this.fileContentsCache[cacheKey]; // Trim the path to make sure there is no extra whitespace. let lookupFilepath: string | URL = filepath.trim(); diff --git a/shared/commons/lib/SourceMapSupport.ts b/shared/commons/lib/SourceMapSupport.ts index d96b5f7d4..041ac12f1 100644 --- a/shared/commons/lib/SourceMapSupport.ts +++ b/shared/commons/lib/SourceMapSupport.ts @@ -79,6 +79,12 @@ export class SourceMapSupport { position: ISourceCodeLocation, includeContent = false, ): ISourceCodeLocation & { name?: string; content?: string } { + // already translated + if (position.source) { + if (includeContent && 'content' in position) + (position as any).content = SourceLoader.getFileContents(position.source); + return position; + } const sourceMap = this.retrieveSourceMap(position.filename); // Resolve the source URL relative to the URL of the source map diff --git a/shared/commons/test/SourceLoader.test.ts b/shared/commons/test/SourceLoader.test.ts index 903410c44..9cfd93239 100644 --- a/shared/commons/test/SourceLoader.test.ts +++ b/shared/commons/test/SourceLoader.test.ts @@ -10,7 +10,6 @@ it('can lookup source code', () => { return callsite; } const site = loadCallsite(); - console.log(site); expect(SourceLoader.getSource(site[0]).code).toBe(` callsite ??= Callsite.getSourceCodeLocation();`); expect(SourceLoader.getSource(site[1]).code).toBe(` const site = loadCallsite();`); }); From 85202bf552898a1c7bc6490ff0c7d6053318a1e3 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 22 May 2023 13:38:45 -0400 Subject: [PATCH 106/147] fix(net): clear out connection once connected --- shared/net/lib/ConnectionToCore.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/net/lib/ConnectionToCore.ts b/shared/net/lib/ConnectionToCore.ts index 71b708409..0fbfa8b83 100644 --- a/shared/net/lib/ConnectionToCore.ts +++ b/shared/net/lib/ConnectionToCore.ts @@ -128,6 +128,7 @@ export default class ConnectionToCore< host: this.transport.host, sessionId: null, }); + this.connectPromise = null; } finally { resolvable.resolve(); } From 41eafd50f034f01b55c8ca1a43643eeabb8c9be2 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 22 May 2023 13:39:18 -0400 Subject: [PATCH 107/147] feat(specification): allow configuring api context --- shared/specification/utils/IZodApi.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/specification/utils/IZodApi.ts b/shared/specification/utils/IZodApi.ts index 8043a5377..1b6295ff0 100644 --- a/shared/specification/utils/IZodApi.ts +++ b/shared/specification/utils/IZodApi.ts @@ -14,9 +14,9 @@ export type IZodApiTypes = { args: z.Schema; result: z.Schema }; export type IZodApiSpec = { [command: string]: IZodApiTypes }; -export type IZodHandlers = { +export type IZodHandlers = { [Api in keyof Spec]: ( args: z.infer, - context?: any, + context?: TContext, ) => Promise>; }; From 6b2ab428eadfeff32d6f7edb724fd3cc808703a7 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 1 Jun 2023 11:40:20 -0400 Subject: [PATCH 108/147] feat(net): add core response time logging --- shared/net/interfaces/IConnectionToClient.ts | 5 +++++ shared/net/lib/ApiRegistry.ts | 2 +- shared/net/lib/ConnectionToClient.ts | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/shared/net/interfaces/IConnectionToClient.ts b/shared/net/interfaces/IConnectionToClient.ts index 73f743e0f..501794cef 100644 --- a/shared/net/interfaces/IConnectionToClient.ts +++ b/shared/net/interfaces/IConnectionToClient.ts @@ -23,6 +23,11 @@ export interface IConnectionToClientEvents< response: { request: ICoreRequestPayload; response: ICoreResponsePayload; + metadata: { + milliseconds: number; + startTime: number; + messageId: string; + }; }; event: { event: ICoreEventPayload }; } diff --git a/shared/net/lib/ApiRegistry.ts b/shared/net/lib/ApiRegistry.ts index 741613286..04ea0c890 100644 --- a/shared/net/lib/ApiRegistry.ts +++ b/shared/net/lib/ApiRegistry.ts @@ -16,7 +16,7 @@ export default class ApiRegistry { logger: IBoundLog, ) => IHandlerMetadata; - private handlersByCommand: { [command: string]: IAsyncFunc } = {}; + public handlersByCommand: { [command: string]: IAsyncFunc } = {}; constructor(endpoints: IApiHandler[] = []) { this.register(...endpoints); diff --git a/shared/net/lib/ConnectionToClient.ts b/shared/net/lib/ConnectionToClient.ts index 33e868d2b..751d7b5c3 100644 --- a/shared/net/lib/ConnectionToClient.ts +++ b/shared/net/lib/ConnectionToClient.ts @@ -61,6 +61,7 @@ export default class ConnectionToClient< if (!Array.isArray(args)) args = [apiRequest.args]; if (this.handlerMetadata) args.push(this.handlerMetadata); + const startTime = Date.now(); let data: any; try { const handler = this.apiHandlers[command]; @@ -77,7 +78,11 @@ export default class ConnectionToClient< responseId: messageId, data, }; - this.emit('response', { request: apiRequest, response }); + this.emit('response', { + request: apiRequest, + response, + metadata: { milliseconds: Date.now() - startTime, startTime, messageId }, + }); this.sendMessage(response); } From 6d7392b397ea57bf39ab926317a0f8e6ce84d2e6 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 1 Jun 2023 11:41:25 -0400 Subject: [PATCH 109/147] feat(commons): add timestamps to logging --- shared/commons/interfaces/ILog.ts | 1 + shared/commons/lib/Logger.ts | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/shared/commons/interfaces/ILog.ts b/shared/commons/interfaces/ILog.ts index 2657380d6..f4a137698 100644 --- a/shared/commons/interfaces/ILog.ts +++ b/shared/commons/interfaces/ILog.ts @@ -4,6 +4,7 @@ export default interface ILog extends IBoundLog { } export interface IBoundLog { + boundContext: any; stats(action: string, data?: T): number; info(action: string, data?: T): number; warn(action: string, data?: T): number; diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index 88b55a983..f481bd582 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -18,8 +18,9 @@ class Log implements ILog { public useColors = process.env.NODE_DISABLE_COLORS !== 'true' && process.env.NODE_DISABLE_COLORS !== '1'; - protected readonly boundContext: any = {}; + public readonly boundContext: any = {}; private readonly module: string; + private logtimeById: { [parentId: number]: number } = {}; constructor(module: NodeModule, boundContext?: any) { this.module = module ? extractPathFromModule(module) : ''; @@ -69,11 +70,12 @@ class Log implements ILog { const params = Object.keys(printData).length ? [printData] : []; if (error) params.push(error); + const millisAddon = entry.millis ? ` ${entry.millis}ms` : ''; // eslint-disable-next-line no-console console.log( `${entry.timestamp.toISOString()} ${entry.level.toUpperCase()} [${printablePath}] ${ entry.action - }`, + }${millisAddon}`, ...params.map(x => inspect(x, false, null, this.useColors)), ); } @@ -95,11 +97,16 @@ class Log implements ILog { } logId += 1; const id = logId; + const timestamp = new Date(); + const now = timestamp.getTime(); + const startTime = parentId ? this.logtimeById[parentId] : now; + this.logtimeById[id] = now; const entry: ILogEntry = { id, sessionId, parentId, - timestamp: new Date(), + timestamp, + millis: now - startTime, action, data: logData, level, @@ -125,7 +132,7 @@ function translateValueToPrintable(value: any, depth = 0): any { return `${value.toString()}n`; } if (Buffer.isBuffer(value)) { - if ((value as Buffer).length <= 256) return `0x${value.toString('hex')}`; + if ((value as Buffer).length <= 256) return `b64\\${value.toString('base64')}`; return ``; } @@ -244,6 +251,7 @@ export interface ILogEntry { parentId?: number; data?: any; level: LogLevel; + millis?: number; } type LogLevel = keyof typeof logLevels; @@ -328,6 +336,7 @@ registerNamespaceMapping((ns, active, skip) => { /plugins\/.*/, /net\/.*/, /crypto\/.*/, + /kad\/.*/, /commons\/.*/, /cloud\/.*/, /datastore[/-].*/, @@ -344,6 +353,7 @@ registerNamespaceMapping((ns, active, skip) => { /plugins\/.*/, /net\/.*/, /cloud\/.*/, + /kad\/.*/, /datastore[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, From d65d24ec7e094ba2687e05a7d54b4f1d0e81dd84 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 1 Jun 2023 11:42:10 -0400 Subject: [PATCH 110/147] feat(commons): sql inserts with named keys --- shared/commons/lib/SqliteTable.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/shared/commons/lib/SqliteTable.ts b/shared/commons/lib/SqliteTable.ts index 209720c72..fc9742f53 100644 --- a/shared/commons/lib/SqliteTable.ts +++ b/shared/commons/lib/SqliteTable.ts @@ -6,6 +6,7 @@ type IRecord = (string | number | Buffer)[]; export default abstract class SqliteTable { protected readonly insertStatement: Statement; + protected readonly insertByKeyStatement: Statement; protected defaultSortOrder?: string; protected insertCallbackFn?: (records: T[]) => void; @@ -24,6 +25,7 @@ export default abstract class SqliteTable { if (!db.readonly) { this.db.exec(this.createTableStatement()); this.insertStatement = this.db.prepare(this.buildInsertStatement()); + this.insertByKeyStatement = this.db.prepare(this.buildInsertByKeyStatement()); } } @@ -61,6 +63,11 @@ export default abstract class SqliteTable { this.addRecordToPublish(record); } + public insertObject(record: T): void { + this.insertByKeyStatement.run(record); + this.addRecordToPublish(record); + } + public all(): T[] { const sort = this.defaultSortOrder ? ` ORDER BY ${this.defaultSortOrder}` : ''; return this.db.prepare(`select * from ${this.tableName}${sort}`).all() as T[]; @@ -88,9 +95,20 @@ export default abstract class SqliteTable { )}) VALUES (${params})`; } - private addRecordToPublish(record: IRecord): void { + protected buildInsertByKeyStatement(): string { + const keys = this.columns.map(x => x[0]); + const params = keys.map(x => `$${String(x)}`).join(', '); + const insertOrReplace = this.insertOrReplace ? ' OR REPLACE' : ''; + return `INSERT${insertOrReplace} INTO ${this.tableName} (${keys.join( + ', ', + )}) VALUES (${params})`; + } + + private addRecordToPublish(record: IRecord | T): void { if (!this.insertCallbackFn) return; - this.insertSubscriptionRecords.push(this.insertToObject(record)); + this.insertSubscriptionRecords.push( + Array.isArray(record) ? this.insertToObject(record) : record, + ); clearTimeout(this.subscriptionThrottle); if (Date.now() - this.lastSubscriptionPublishTime > 500) { From f94e4780886bd1ae788aba9f0de87ce36bffc979 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 1 Jun 2023 11:43:15 -0400 Subject: [PATCH 111/147] feat(commons): add priority to queue; lru cache --- shared/commons/lib/LruCache.ts | 33 +++++++++ shared/commons/lib/Queue.ts | 122 ++++++++++++++++++++++++++++++--- shared/commons/lib/errors.ts | 44 ++++++++++-- shared/crypto/cli.ts | 17 ++--- 4 files changed, 189 insertions(+), 27 deletions(-) create mode 100644 shared/commons/lib/LruCache.ts diff --git a/shared/commons/lib/LruCache.ts b/shared/commons/lib/LruCache.ts new file mode 100644 index 000000000..ad555e20b --- /dev/null +++ b/shared/commons/lib/LruCache.ts @@ -0,0 +1,33 @@ +export default class LruCache { + private cache: Map; + + constructor(private max = 10) { + this.cache = new Map(); + } + + public get(key: string): T { + const item = this.cache.get(key); + if (item) { + // refresh key + this.cache.delete(key); + this.cache.set(key, item); + } + return item; + } + + public remove(key: string): void { + this.cache.delete(key); + } + + public set(key: string, val: T): void { + // refresh key + if (this.cache.has(key)) this.cache.delete(key); + // evict oldest + else if (this.cache.size === this.max) this.cache.delete(this.first()); + this.cache.set(key, val); + } + + private first(): string { + return this.cache.keys().next().value; + } +} diff --git a/shared/commons/lib/Queue.ts b/shared/commons/lib/Queue.ts index e7f6af36a..2cc8faddc 100644 --- a/shared/commons/lib/Queue.ts +++ b/shared/commons/lib/Queue.ts @@ -1,12 +1,19 @@ -import IResolvablePromise from '../interfaces/IResolvablePromise'; import { CanceledPromiseError } from '../interfaces/IPendingWaitEvent'; -import { createPromise } from './utils'; +import IResolvablePromise from '../interfaces/IResolvablePromise'; +import { CodeError } from './errors'; import Resolvable from './Resolvable'; +import TypedEventEmitter from './TypedEventEmitter'; +import { createPromise } from './utils'; import getPrototypeOf = Reflect.getPrototypeOf; type AsyncCallback = (value?: any) => Promise; -export default class Queue { +export default class Queue extends TypedEventEmitter<{ + completed: TResult; + error: Error; + idle: void; + stopped: { error?: Error }; +}> { public concurrency = 1; public idletimeMillis = 500; public idlePromise = createPromise(); @@ -27,18 +34,40 @@ export default class Queue { private queue: IQueueEntry[] = []; - constructor(readonly stacktraceMarker = 'QUEUE', concurrency?: number) { + constructor( + readonly stacktraceMarker = 'QUEUE', + concurrency?: number, + abortSignal?: AbortSignal, + ) { + super(); if (concurrency) this.concurrency = concurrency; + if (abortSignal) { + // clear the queue and throw if the query is aborted + abortSignal.addEventListener('abort', () => { + this.stop(new CodeError('Query aborted', 'ERR_QUERY_ABORTED')); + }); + } + void this.idlePromise.then(() => this.emit('idle')); } - public run(cb: AsyncCallback, timeoutMillis?: number): Promise { - const promise = createPromise(timeoutMillis); - - this.queue.push({ + public run( + cb: AsyncCallback, + options?: { timeoutMillis?: number; priority?: number | bigint }, + ): Promise { + const priority = BigInt(options?.priority ?? 0); + const promise = createPromise(options?.timeoutMillis); + const entry: IQueueEntry = { promise, cb, + priority, startStack: new Error('').stack.slice(8), // "Error: \n" is 8 chars - }); + }; + if (!this.queue.length || this.queue[this.queue.length - 1].priority >= priority) { + this.queue.push(entry); + } else { + const index = this.getInsertionIndex(priority); + this.queue.splice(index, 0, entry); + } this.next().catch(() => null); return promise.promise; @@ -66,16 +95,77 @@ export default class Queue { next.promise.promise.catch(() => null); this.reject(next, canceledError); } + this.emit('stopped', { error }); } public canRunMoreConcurrently(): boolean { return this.activeCount < this.concurrency; } + public async *toGenerator( + events?: TypedEventEmitter<{ cleanup: void }>, + ): AsyncGenerator { + let resolvable = new Resolvable(); + let running = true; + const results: TResult[] = []; + + const cleanup = (): void => { + if (!running) return; + + running = false; + this.stop(); + results.length = 0; + }; + + this.on('completed', result => { + results.push(result); + resolvable.resolve(); + }); + this.on('error', err => { + cleanup(); + resolvable.reject(err); + }); + this.on('idle', () => { + running = false; + resolvable.resolve(); + }); + this.on('stopped', ({ error }) => { + running = false; + if (error) resolvable.reject(error); + else resolvable.resolve(); + }); + + // the user broke out of the loop early, ensure we resolve the resolvable result + // promise and clear the queue of any remaining jobs + events?.on('cleanup', () => { + cleanup(); + resolvable.resolve(); + }); + + while (running) { + await resolvable.promise; + resolvable = new Resolvable(); + + // yield all available results + while (results.length > 0) { + const result = results.shift(); + + if (result != null) { + yield result; + } + } + } + + // yield any remaining results + yield* results; + cleanup(); + } + private async next(): Promise { clearTimeout(this.idleTimout); if (!this.canRunMoreConcurrently()) return; + if (this.stopDequeuing) return; const next = this.queue.shift(); if (!next) { @@ -90,8 +180,8 @@ export default class Queue { const newPromise = createPromise(); this.idlePromise?.resolve(newPromise.promise); this.idlePromise = newPromise; + void newPromise.then(() => this.emit('idle')); } - if (this.stopDequeuing) next.promise.resolve(null); this.activeCount += 1; try { @@ -101,7 +191,9 @@ export default class Queue { } next.promise.resolve(res); + this.emit('completed', res); } catch (error) { + this.emit('error', error); this.reject(next, error); } finally { this.activeCount -= 1; @@ -116,13 +208,21 @@ export default class Queue { Object.assign(error, sourceError); const marker = `------${this.stacktraceMarker}`.padEnd(50, '-'); - error.stack = `${sourceError.stack}\n${marker}\n${entry.startStack}`; + error.stack = `${sourceError.stack}\n${marker}\n ${entry.startStack}`; entry.promise.reject(error); } + + private getInsertionIndex(priority: bigint): number { + for (let i = this.queue.length - 1; i >= 0; i -= 1) { + const entry = this.queue[i]; + if (entry.priority > priority) return i; + } + } } interface IQueueEntry { promise: IResolvablePromise; cb: AsyncCallback; startStack: string; + priority: bigint; } diff --git a/shared/commons/lib/errors.ts b/shared/commons/lib/errors.ts index 98e077953..141896ce8 100644 --- a/shared/commons/lib/errors.ts +++ b/shared/commons/lib/errors.ts @@ -1,5 +1,6 @@ // eslint-disable-next-line max-classes-per-file import addGlobalInstance from './addGlobalInstance'; +import { registerSerializableErrorType } from './TypeSerializer'; class UlixeeError extends Error { constructor(override message, public code, public data?: object) { @@ -25,12 +26,45 @@ class UlixeeError extends Error { } } -class APIError extends UlixeeError { - constructor(public status, json) { - super(json.message || 'Unexpected error', json.code, json); +/** + * When this error is thrown it means an operation was aborted, + * usually in response to the `abort` event being emitted by an + * AbortSignal. + */ +class AbortError extends Error { + public static readonly code = 'ABORT_ERR'; + + public readonly code: string; + + constructor(message = 'The operation was aborted') { + super(message); + this.code = AbortError.code; + } + + public override toString(): string { + return `${this.message} [${this.code}]`; + } +} + +class CodeError = Record> extends Error { + public readonly props: T; + + constructor(message: string, public readonly code: string, props?: T) { + super(message); + + this.name = props?.name ?? 'CodeError'; + this.props = props ?? ({} as T); + } + + public override toString(): string { + const extras = this.props ? `\n${JSON.stringify(this.props, null, 2)}` : ''; + return `${this.message} [${this.code}] ${extras}`; } } -addGlobalInstance(UlixeeError, APIError); +registerSerializableErrorType(CodeError); +registerSerializableErrorType(UlixeeError); +registerSerializableErrorType(AbortError); +addGlobalInstance(UlixeeError, CodeError); -export { APIError, UlixeeError }; +export { UlixeeError, CodeError, AbortError }; diff --git a/shared/crypto/cli.ts b/shared/crypto/cli.ts index d2e51521c..66370cbc0 100644 --- a/shared/crypto/cli.ts +++ b/shared/crypto/cli.ts @@ -1,21 +1,16 @@ -import { Command } from 'commander'; -import { APIError } from '@ulixee/commons/lib/errors'; +import UlixeeConfig from '@ulixee/commons/config/index'; +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; import { assert } from '@ulixee/commons/lib/utils'; -import { randomBytes } from 'crypto'; import Identity from '@ulixee/crypto/lib/Identity'; +import { Command } from 'commander'; +import { randomBytes } from 'crypto'; import * as Path from 'path'; -import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; -import UlixeeConfig from '@ulixee/commons/config/index'; -import Address from './lib/Address'; import IAddressSettings, { ISignerType } from './interfaces/IAddressSettings'; +import Address from './lib/Address'; import Ed25519 from './lib/Ed25519'; const logError = (err: Error): void => { - if (err instanceof APIError) { - console.log(`IDENTITIES API ERROR: ${err.toString()}`); // eslint-disable-line no-console - } else { - console.log(`\nIDENTITIES ERROR: ${err.message}\n`); // eslint-disable-line no-console - } + console.log(`\nIDENTITIES ERROR: ${err.message}\n`); // eslint-disable-line no-console }; const { version } = require('./package.json'); From 29b098ad982b93e7cf9a736e4f0e058423d2665f Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 1 Jun 2023 11:44:14 -0400 Subject: [PATCH 112/147] feat(commons): buffer xor, toBigInt feat(commons): async iterator utils feat(commons): abort signals utils --- shared/commons/lib/Signals.ts | 63 +++++++++++++++++++++++++++++++ shared/commons/lib/asyncUtils.ts | 40 ++++++++++++++++++++ shared/commons/lib/bufferUtils.ts | 20 +++++++++- shared/crypto/lib/Identity.ts | 8 +++- 4 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 shared/commons/lib/Signals.ts create mode 100644 shared/commons/lib/asyncUtils.ts diff --git a/shared/commons/lib/Signals.ts b/shared/commons/lib/Signals.ts new file mode 100644 index 000000000..767c47760 --- /dev/null +++ b/shared/commons/lib/Signals.ts @@ -0,0 +1,63 @@ +/** + * Copied from "any-signal@4.1.1" + * + * This module is dual licensed under MIT and Apache-2.0. + * + * MIT: https://www.opensource.org/licenses/mit + * Apache-2.0: https://www.apache.org/licenses/license-2.0 + */ +export interface IClearableSignal extends AbortSignal { + clear: () => void; +} + +export default class Signals { + /** + * Takes an array of AbortSignals and returns a single signal. + * If any signals are aborted, the returned signal will be aborted. + * + * + */ + static any(...signals: AbortSignal[]): IClearableSignal { + const controller = new globalThis.AbortController(); + + function onAbort(): void { + controller.abort(); + + for (const signal of signals) { + if (signal?.removeEventListener !== null) { + signal.removeEventListener('abort', onAbort); + } + } + } + + for (const signal of signals) { + if (signal?.aborted === true) { + onAbort(); + break; + } + + if (signal?.addEventListener !== null) { + signal.addEventListener('abort', onAbort); + } + } + + function clear(): void { + for (const signal of signals) { + if (signal?.removeEventListener !== null) { + signal.removeEventListener('abort', onAbort); + } + } + } + + const signal = controller.signal as IClearableSignal; + signal.clear = clear; + + return signal; + } + + static timeout(timeoutMillis: number): AbortSignal { + const controller = new AbortController(); + setTimeout(() => controller.abort(), timeoutMillis).unref(); + return controller.signal; + } +} diff --git a/shared/commons/lib/asyncUtils.ts b/shared/commons/lib/asyncUtils.ts new file mode 100644 index 000000000..0626c7486 --- /dev/null +++ b/shared/commons/lib/asyncUtils.ts @@ -0,0 +1,40 @@ +export function debounce(func: () => any, wait: number): () => void { + let timeout: NodeJS.Timeout; + + return function runLater() { + function later(): void { + timeout = undefined; + func(); + } + + clearTimeout(timeout); + timeout = setTimeout(later, wait).unref(); + }; +} + +export function length(source: AsyncIterable): Promise { + return (async () => { + let count = 0; + + for await (const _ of source) count++; + + return count; + })(); +} + +export function all(source: AsyncIterable): Promise { + return (async () => { + const results: T[] = []; + + for await (const x of source) results.push(x); + + return results; + })(); +} + +export function first(source: AsyncIterable): Promise { + return (async () => { + // eslint-disable-next-line no-unreachable-loop + for await (const entry of source) return entry; + })(); +} diff --git a/shared/commons/lib/bufferUtils.ts b/shared/commons/lib/bufferUtils.ts index 84b8d8510..f7846ae61 100644 --- a/shared/commons/lib/bufferUtils.ts +++ b/shared/commons/lib/bufferUtils.ts @@ -1,6 +1,6 @@ import { bech32m } from 'bech32'; -import * as zlib from 'zlib'; import { promisify } from 'util'; +import * as zlib from 'zlib'; const inflateAsync = promisify(zlib.inflate); const inflateRawAsync = promisify(zlib.inflateRaw); @@ -19,6 +19,24 @@ export function concatAsBuffer(...items: (string | number | Buffer)[]): Buffer { ); } +export function bufferToBigInt(buffer: Buffer): bigint { + return BigInt(`0x${buffer.toString('hex')}`); +} + +export function xor(a: Buffer, b: Buffer): Buffer { + if (a.length !== b.length) { + throw new Error('Inputs should have the same length'); + } + + const result = Buffer.allocUnsafe(a.length); + + for (let i = 0; i < a.length; i++) { + result[i] = a[i] ^ b[i]; + } + + return result; +} + export function bufferReplacer(key: string, value: any): any { if (value && Buffer.isBuffer(value)) { return value.toString('hex'); diff --git a/shared/crypto/lib/Identity.ts b/shared/crypto/lib/Identity.ts index 8bdeccb8d..35484eb8e 100644 --- a/shared/crypto/lib/Identity.ts +++ b/shared/crypto/lib/Identity.ts @@ -105,7 +105,7 @@ export default class Identity { filepath = path.join(options?.relativeToPath ?? process.cwd(), filepath); } const data = readFileSync(filepath, 'utf8'); - return this.loadFromPem(data, options); + return Identity.loadFromPem(data, options); } public static loadFromPem(data: string, options?: { keyPassphrase?: string }): Identity { @@ -127,6 +127,10 @@ export default class Identity { return identity; } + public static getBytes(encoded: string): Buffer { + return decodeBuffer(encoded, Identity.encodingPrefix); + } + public static async create(): Promise { const key = await Ed25519.create(); const pair = new Identity(key.privateKey); @@ -136,7 +140,7 @@ export default class Identity { public static verify(identityBech32: string, hashedMessage: Buffer, signature: Buffer): boolean { if (!identityBech32) return false; - const publicKeyBytes = decodeBuffer(identityBech32, this.encodingPrefix); + const publicKeyBytes = Identity.getBytes(identityBech32); const publicKey = Ed25519.createPublicKeyFromBytes(publicKeyBytes); const isValid = Ed25519.verify(publicKey, hashedMessage, signature); From d5067de4961b2a47ff962c8073154bf39765e335 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 2 Jun 2023 09:28:20 -0400 Subject: [PATCH 113/147] =?UTF-8?q?chore(net):=20remove=20types=20from=20?= =?UTF-8?q?=E2=80=9Cblind=E2=80=9D=20transports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/commons/lib/Logger.ts | 55 ++++++++---------- shared/commons/lib/Queue.ts | 12 ++-- shared/net/errors/DisconnectedError.ts | 4 +- shared/net/interfaces/IConnectionToClient.ts | 16 ++++-- shared/net/interfaces/ITransport.ts | 16 ++++++ shared/net/interfaces/ITransportToClient.ts | 22 ------- shared/net/interfaces/ITransportToCore.ts | 28 --------- shared/net/lib/ApiRegistry.ts | 4 +- shared/net/lib/ConnectionToClient.ts | 25 ++++---- shared/net/lib/ConnectionToCore.ts | 60 ++++++++++---------- shared/net/lib/Duplexer.ts | 18 ++++++ shared/net/lib/EmittingTransportToClient.ts | 37 ++++-------- shared/net/lib/EmittingTransportToCore.ts | 20 +++---- shared/net/lib/HttpTransportToClient.ts | 22 +++---- shared/net/lib/HttpTransportToCore.ts | 26 ++++----- shared/net/lib/TransportBridge.ts | 15 +++-- shared/net/lib/WsTransportToClient.ts | 17 +++--- shared/net/lib/WsTransportToCore.ts | 27 +++------ shared/net/test/ConnectionToClient.test.ts | 9 ++- shared/net/test/basic.test.ts | 2 +- 20 files changed, 191 insertions(+), 244 deletions(-) create mode 100644 shared/net/interfaces/ITransport.ts delete mode 100644 shared/net/interfaces/ITransportToClient.ts delete mode 100644 shared/net/interfaces/ITransportToCore.ts create mode 100644 shared/net/lib/Duplexer.ts diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index f481bd582..2b8648c7b 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -260,15 +260,19 @@ interface ILogBuilder { log: ILog; } +const moduleNamesByPath: { [fullPath: string]: string } = {}; function extractPathFromModule(module: NodeModule): string { const fullPath = typeof module === 'string' ? module : module.filename || module.id || ''; - return fullPath - .replace(/^(.*)[/\\]unblocked[/\\](.+)$/, '$2') - .replace(/^(.*)[/\\]ulixee[/\\](.+)$/, '$2') - .replace(/^(.*)[/\\]payments[/\\](.+)$/, '$2') - .replace(/^(.*)[/\\]@ulixee[/\\](.+)$/, '$2') - .replace(/^(.*)[/\\]commons[/\\](.+)$/, '$2') - .replace(/^.*[/\\]packages[/\\](.+)$/, '$1'); + if (!moduleNamesByPath[fullPath]) { + moduleNamesByPath[fullPath] = fullPath + .replace(/^(.*)[/\\]unblocked[/\\](.+)$/, '$2') + .replace(/^(.*)[/\\]ulixee[/\\](.+)$/, '$2') + .replace(/^(.*)[/\\]payments[/\\](.+)$/, '$2') + .replace(/^(.*)[/\\]@ulixee[/\\](.+)$/, '$2') + .replace(/^(.*)[/\\]commons[/\\](.+)$/, '$2') + .replace(/^.*[/\\]packages[/\\](.+)$/, '$1'); + } + return fullPath; } /// LOG FILTERING ////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -283,12 +287,15 @@ export function registerNamespaceMapping( } function isEnabled(modulePath: string): boolean { - if (process.env.ULX_DEBUG === '1' || process.env.ULX_DEBUG === 'true') return true; + if ( + process.env.ULX_DEBUG === '1' || + process.env.ULX_DEBUG === 'true' || + process.env.ULX_DEBUG === '*' + ) + return true; + if (modulePath in logFilters.enabledNamesCache) return logFilters.enabledNamesCache[modulePath]; - if (modulePath[modulePath.length - 1] === '*') { - return true; - } if (logFilters.namespaces.active.has('*')) return true; for (const ns of logFilters.skip) { @@ -323,29 +330,14 @@ function loadNamespaces(namespaces: string): void { logFilters.namespaces.inactive.add(part.slice(1)); } else { logFilters.namespaces.active.add(part); + if (part === 'ulx*' || part === 'ulx:*') logFilters.namespaces.active.add('*'); } } } registerNamespaceMapping((ns, active, skip) => { if (ns.includes('ulx:*') || ns.includes('ulx*') || ns === '*') { - active.push( - /desktop[/-]?.*/, - /hero[/-].*/, - /agent\/.*/, - /plugins\/.*/, - /net\/.*/, - /crypto\/.*/, - /kad\/.*/, - /commons\/.*/, - /cloud\/.*/, - /datastore[/-].*/, - /mainchain[/-].*/, - /sidechain[/-].*/, - /ramps[/-].*/, - /DevtoolsSessionLogger/, - /^lib\/.*/, - ); + active.push(/.*/); } else if (ns === 'ulx') { active.push( /hero[/-].*/, @@ -353,18 +345,17 @@ registerNamespaceMapping((ns, active, skip) => { /plugins\/.*/, /net\/.*/, /cloud\/.*/, - /kad\/.*/, /datastore[/-].*/, /mainchain[/-].*/, /sidechain[/-].*/, /ramps[/-].*/, ); - skip.push(/desktop[/-]?.*/, /DevtoolsSessionLogger/); + skip.push(/desktop[/-]?.*/, /DevtoolsSessionLogger/, /kad\/.*/); } else if (ns.includes('ulx:desktop')) { active.push(/desktop[/-]?.*/); - } else if (ns === 'ulx:mitm') { + } else if (ns.includes('ulx:mitm')) { active.push(/agent[/-]mitm.*/); - } else if (ns.includes('ulx:devtools') || ns === '*') { + } else if (ns.includes('ulx:devtools')) { active.push(/DevtoolsSessionLogger/); } else if (ns.includes('hero')) { active.push(/^hero[/-].*/, /net\/.*/); diff --git a/shared/commons/lib/Queue.ts b/shared/commons/lib/Queue.ts index 2cc8faddc..8578c9e02 100644 --- a/shared/commons/lib/Queue.ts +++ b/shared/commons/lib/Queue.ts @@ -9,8 +9,8 @@ import getPrototypeOf = Reflect.getPrototypeOf; type AsyncCallback = (value?: any) => Promise; export default class Queue extends TypedEventEmitter<{ - completed: TResult; - error: Error; + 'run-completed': TResult; + 'run-error': Error; idle: void; stopped: { error?: Error }; }> { @@ -117,11 +117,11 @@ export default class Queue extends TypedEventEmitter<{ results.length = 0; }; - this.on('completed', result => { + this.on('run-completed', result => { results.push(result); resolvable.resolve(); }); - this.on('error', err => { + this.on('run-error', err => { cleanup(); resolvable.reject(err); }); @@ -191,9 +191,9 @@ export default class Queue extends TypedEventEmitter<{ } next.promise.resolve(res); - this.emit('completed', res); + this.emit('run-completed', res); } catch (error) { - this.emit('error', error); + this.emit('run-error', error); this.reject(next, error); } finally { this.activeCount -= 1; diff --git a/shared/net/errors/DisconnectedError.ts b/shared/net/errors/DisconnectedError.ts index 7b91fe875..2c173802e 100644 --- a/shared/net/errors/DisconnectedError.ts +++ b/shared/net/errors/DisconnectedError.ts @@ -4,8 +4,8 @@ import addGlobalInstance from '@ulixee/commons/lib/addGlobalInstance'; export default class DisconnectedError extends CanceledPromiseError { public code = 'DisconnectedError'; - constructor(readonly host: string) { - super(`This transport has been disconnected (host: ${host})`); + constructor(readonly host: string, message?: string) { + super(message ?? `This transport has been disconnected (host: ${host})`); this.name = 'DisconnectedError'; } } diff --git a/shared/net/interfaces/IConnectionToClient.ts b/shared/net/interfaces/IConnectionToClient.ts index 501794cef..93a5bd45b 100644 --- a/shared/net/interfaces/IConnectionToClient.ts +++ b/shared/net/interfaces/IConnectionToClient.ts @@ -1,13 +1,16 @@ import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; -import ICoreEventPayload from './ICoreEventPayload'; import IApiHandlers from './IApiHandlers'; -import ITransportToClient from './ITransportToClient'; +import ICoreEventPayload from './ICoreEventPayload'; import ICoreRequestPayload from './ICoreRequestPayload'; import ICoreResponsePayload from './ICoreResponsePayload'; +import ITransport from './ITransport'; -export default interface IConnectionToClient - extends ITypedEventEmitter { - transport: ITransportToClient; +export default interface IConnectionToClient< + IClientApiSpec extends IApiHandlers = IApiHandlers, + IEventSpec = any, +> extends ITypedEventEmitter { + apiHandlers?: IClientApiSpec; + transport: ITransport; disconnectPromise: Promise; disconnect(error?: Error): Promise; sendEvent(event: ICoreEventPayload): void; @@ -16,6 +19,7 @@ export default interface IConnectionToClient { 'send-error': Error; disconnected: Error | null; @@ -29,5 +33,5 @@ export interface IConnectionToClientEvents< messageId: string; }; }; - event: { event: ICoreEventPayload }; + event: { event: ICoreEventPayload }; } diff --git a/shared/net/interfaces/ITransport.ts b/shared/net/interfaces/ITransport.ts new file mode 100644 index 000000000..a6337299c --- /dev/null +++ b/shared/net/interfaces/ITransport.ts @@ -0,0 +1,16 @@ +import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; + +export default interface ITransport extends ITypedEventEmitter { + host?: string; + remoteId?: string; + isConnected: boolean; + connect?(timeoutMs?: number): Promise; + disconnect?(fatalError?: Error): Promise | void; + send(message: any): Promise; +} + +export interface ITransportEvents { + message: any; + disconnected: Error | null; + connected: void; +} diff --git a/shared/net/interfaces/ITransportToClient.ts b/shared/net/interfaces/ITransportToClient.ts deleted file mode 100644 index e03c1dd77..000000000 --- a/shared/net/interfaces/ITransportToClient.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; -import IApiHandlers from './IApiHandlers'; -import ICoreRequestPayload from './ICoreRequestPayload'; -import ICoreResponsePayload from './ICoreResponsePayload'; -import ICoreEventPayload from './ICoreEventPayload'; - -export default interface ITransportToClient< - IClientApiHandlers extends IApiHandlers, - IEventSpec = any, - OutMessagePayload = - | ICoreResponsePayload - | ICoreEventPayload, -> extends ITypedEventEmitter> { - remoteId: string; - send(message: OutMessagePayload): Promise; - disconnect?(fatalError?: Error): Promise | void; -} - -export interface ITransportToClientEvents { - message: ICoreRequestPayload; - disconnected: Error | null; -} diff --git a/shared/net/interfaces/ITransportToCore.ts b/shared/net/interfaces/ITransportToCore.ts deleted file mode 100644 index 68eb9af72..000000000 --- a/shared/net/interfaces/ITransportToCore.ts +++ /dev/null @@ -1,28 +0,0 @@ -import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; -import IApiHandlers from './IApiHandlers'; -import ICoreEventPayload from './ICoreEventPayload'; -import ICoreRequestPayload from './ICoreRequestPayload'; -import ICoreResponsePayload from './ICoreResponsePayload'; - -export default interface ITransportToCore< - ApiHandlers extends IApiHandlers = any, - EventSpec = any, - RequestPayload = ICoreRequestPayload, - ResponsePayload = ICoreResponsePayload | ICoreEventPayload, -> extends ITypedEventEmitter> { - host: string; - isConnected: boolean; - connect?(timeoutMs?: number): Promise; - disconnect?(): Promise; - send(message: RequestPayload): Promise; -} - -export interface ITransportToCoreEvents< - ApiHandlers extends IApiHandlers, - EventSpec = any, - ResponsePayload = ICoreResponsePayload | ICoreEventPayload, -> { - message: ResponsePayload; - disconnected: void; - connected: void; -} diff --git a/shared/net/lib/ApiRegistry.ts b/shared/net/lib/ApiRegistry.ts index 04ea0c890..de56fd0af 100644 --- a/shared/net/lib/ApiRegistry.ts +++ b/shared/net/lib/ApiRegistry.ts @@ -2,7 +2,7 @@ import Logger from '@ulixee/commons/lib/Logger'; import { IncomingMessage, ServerResponse } from 'http'; import { IBoundLog } from '@ulixee/commons/interfaces/ILog'; import HttpTransportToClient from './HttpTransportToClient'; -import ITransportToClient from '../interfaces/ITransportToClient'; +import ITransport from '../interfaces/ITransport'; import ConnectionToClient from './ConnectionToClient'; import { IAsyncFunc } from '../interfaces/IApiHandlers'; import IApiHandler from '../interfaces/IApiHandler'; @@ -33,7 +33,7 @@ export default class ApiRegistry { } public createConnection( - transport: ITransportToClient, + transport: ITransport, handlerMetadata?: IHandlerMetadata, ): ConnectionToClient { const connection = new ConnectionToClient(transport, this.handlersByCommand); diff --git a/shared/net/lib/ConnectionToClient.ts b/shared/net/lib/ConnectionToClient.ts index 751d7b5c3..4ee650f1e 100644 --- a/shared/net/lib/ConnectionToClient.ts +++ b/shared/net/lib/ConnectionToClient.ts @@ -1,12 +1,12 @@ -import Log from '@ulixee/commons/lib/Logger'; -import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; -import ICoreEventPayload from '../interfaces/ICoreEventPayload'; -import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import Log from '@ulixee/commons/lib/Logger'; import IApiHandlers from '../interfaces/IApiHandlers'; -import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; -import ITransportToClient from '../interfaces/ITransportToClient'; import IConnectionToClient, { IConnectionToClientEvents } from '../interfaces/IConnectionToClient'; +import ICoreEventPayload from '../interfaces/ICoreEventPayload'; +import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; +import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; +import ITransport from '../interfaces/ITransport'; const { log } = Log(module); @@ -22,14 +22,13 @@ export default class ConnectionToClient< public handlerMetadata?: IHandlerMetadata; private events = new EventSubscriber(); - constructor( - readonly transport: ITransportToClient, - readonly apiHandlers: IClientApiHandlers, - ) { + constructor(readonly transport: ITransport, readonly apiHandlers: IClientApiHandlers) { super(); - this.events.on(transport, 'message', message => this.handleRequest(message)); - this.events.once(transport, 'disconnected', error => this.disconnect(error)); + if (transport) { + this.events.on(transport, 'message', message => this.handleRequest(message)); + this.events.once(transport, 'disconnected', error => this.disconnect(error)); + } } public disconnect(error?: Error): Promise { @@ -56,6 +55,8 @@ export default class ConnectionToClient< protected async handleRequest( apiRequest: ICoreRequestPayload, ): Promise { + if (!('messageId' in apiRequest) && !('command' in apiRequest)) return; + const { command, messageId } = apiRequest; let args: any[] = apiRequest.args ?? []; if (!Array.isArray(args)) args = [apiRequest.args]; diff --git a/shared/net/lib/ConnectionToCore.ts b/shared/net/lib/ConnectionToCore.ts index 0fbfa8b83..ef81048ed 100644 --- a/shared/net/lib/ConnectionToCore.ts +++ b/shared/net/lib/ConnectionToCore.ts @@ -1,32 +1,33 @@ -import { bindFunctions } from '@ulixee/commons/lib/utils'; -import IResolvablePromise from '@ulixee/commons/interfaces/IResolvablePromise'; -import Log from '@ulixee/commons/lib/Logger'; import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; -import SessionClosedOrMissingError from '@ulixee/commons/lib/SessionClosedOrMissingError'; -import Resolvable from '@ulixee/commons/lib/Resolvable'; +import IResolvablePromise from '@ulixee/commons/interfaces/IResolvablePromise'; import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; -import ICoreEventPayload from '../interfaces/ICoreEventPayload'; -import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; -import ITransportToCore from '../interfaces/ITransportToCore'; -import PendingMessages from './PendingMessages'; +import Log from '@ulixee/commons/lib/Logger'; +import Resolvable from '@ulixee/commons/lib/Resolvable'; +import SessionClosedOrMissingError from '@ulixee/commons/lib/SessionClosedOrMissingError'; +import { bindFunctions } from '@ulixee/commons/lib/utils'; import DisconnectedError from '../errors/DisconnectedError'; -import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; import IApiHandlers, { IApiSpec } from '../interfaces/IApiHandlers'; +import ICoreEventPayload from '../interfaces/ICoreEventPayload'; +import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; +import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; +import ITransport from '../interfaces/ITransport'; import IUnixTime from '../interfaces/IUnixTime'; +import PendingMessages from './PendingMessages'; const { log } = Log(module); export interface IConnectionToCoreEvents { - disconnected: void; + disconnected: Error | null; connected: void; - event: ICoreEventPayload; + event: { event: ICoreEventPayload }; } + export default class ConnectionToCore< TCoreApiHandlers extends IApiHandlers, TEventSpec, > extends TypedEventEmitter> { - public connectPromise: IResolvablePromise; + public connectPromise: IResolvablePromise; public disconnectPromise: Promise; public connectStartTime: IUnixTime; @@ -56,25 +57,33 @@ export default class ConnectionToCore< private isSendingConnect = false; private isSendingDisconnect = false; - constructor(public transport: ITransportToCore) { + constructor(public transport: ITransport, skipConnect = false) { super(); bindFunctions(this); + this.events.once(transport, 'disconnected', this.onConnectionTerminated.bind(this)); this.events.on(transport, 'message', this.onMessage.bind(this)); + + if (transport.isConnected && skipConnect) { + this.connectPromise = new Resolvable(); + this.connectPromise.resolve(); + } } - public async connect(isAutoConnect = false, timeoutMs = 30e3): Promise { + public async connect(isAutoConnect = false, timeoutMs = 30e3): Promise { if (!this.connectPromise) { this.didAutoConnect = isAutoConnect; this.connectStartTime = Date.now(); this.connectPromise = new Resolvable(); try { - const connectError = await this.transport.connect?.(timeoutMs); - if (connectError) throw connectError; + await this.transport.connect?.(timeoutMs); // disconnected during connect - if (this.hasActiveSessions() && this.disconnectPromise && !this.didAutoConnect) { - throw new DisconnectedError(this.transport.host); + if (this.hasActiveSessions() && !!this.disconnectPromise && !this.didAutoConnect) { + throw new DisconnectedError( + this.transport.host, + `Disconnecting during initial connection handshake to ${this.transport.host}`, + ); } // can be resolved if canceled by a disconnect @@ -89,11 +98,7 @@ export default class ConnectionToCore< this.transport.isConnected = true; this.transport.emit('connected'); } catch (err) { - if (this.didAutoConnect) { - this.connectPromise.resolve(err); - } else { - this.connectPromise.reject(err, true); - } + this.connectPromise.reject(err, true); } } @@ -147,8 +152,7 @@ export default class ConnectionToCore< const isConnect = this.isSendingConnect; const isDisconnect = this.isSendingDisconnect; if (!isConnect && !isDisconnect) { - const result = await this.connect(); - if (result) throw result; + await this.connect(); } const { promise, id } = this.pendingMessages.create(timeoutMs, isConnect || isDisconnect); @@ -191,8 +195,6 @@ export default class ConnectionToCore< this.onResponse(payload); } else if ('listenerId' in payload || 'eventType' in payload) { this.onEvent(payload); - } else { - throw new Error(`message could not be processed: ${JSON.stringify(payload)}`); } } @@ -216,7 +218,7 @@ export default class ConnectionToCore< } protected onEvent(event: ICoreEventPayload): void { - this.emit('event', event); + this.emit('event', { event }); } protected async onConnectionTerminated(): Promise { diff --git a/shared/net/lib/Duplexer.ts b/shared/net/lib/Duplexer.ts new file mode 100644 index 000000000..ce5be93fd --- /dev/null +++ b/shared/net/lib/Duplexer.ts @@ -0,0 +1,18 @@ +import { ConnectionToClient } from '../index'; +import IApiHandlers from '../interfaces/IApiHandlers'; +import ConnectionToCore from './ConnectionToCore'; + +export default class Duplexer { + public static fromCore( + connectionToCore: ConnectionToCore, + handlers: TApiHandlers, + ): ConnectionToClient { + return new ConnectionToClient(connectionToCore.transport, handlers); + } + + public static fromClient( + connectionToClient: ConnectionToClient, + ): ConnectionToCore { + return new ConnectionToCore(connectionToClient.transport); + } +} diff --git a/shared/net/lib/EmittingTransportToClient.ts b/shared/net/lib/EmittingTransportToClient.ts index 0d1fb24fd..afce4aa49 100644 --- a/shared/net/lib/EmittingTransportToClient.ts +++ b/shared/net/lib/EmittingTransportToClient.ts @@ -1,36 +1,23 @@ -import '@ulixee/commons/lib/SourceMapSupport'; import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; -import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; import addGlobalInstance from '@ulixee/commons/lib/addGlobalInstance'; -import ITransportToClient, { ITransportToClientEvents } from '../interfaces/ITransportToClient'; -import IApiHandlers from '../interfaces/IApiHandlers'; -import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; -import ICoreEventPayload from '../interfaces/ICoreEventPayload'; +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import '@ulixee/commons/lib/SourceMapSupport'; +import ITransport, { ITransportEvents } from '../interfaces/ITransport'; let counter = 0; -export default class EmittingTransportToClient< - IClientApiSpec extends IApiHandlers, - IEventSpec = any, - > - extends TypedEventEmitter< - ITransportToClientEvents & { - outbound: ICoreResponsePayload | ICoreEventPayload; - } - > - implements - ITransportToClient, - ITypedEventEmitter< - ITransportToClientEvents & { - outbound: ICoreResponsePayload | ICoreEventPayload; - } - > +type TEvents = ITransportEvents & { + outbound: any; +}; + +export default class EmittingTransportToClient + extends TypedEventEmitter + implements ITransport, ITypedEventEmitter { remoteId = String((counter += 1)); + isConnected = true; - send( - message: ICoreResponsePayload | ICoreEventPayload, - ): Promise { + send(message: any): Promise { this.emit('outbound', message); return Promise.resolve(); } diff --git a/shared/net/lib/EmittingTransportToCore.ts b/shared/net/lib/EmittingTransportToCore.ts index 37138c006..4be082ec4 100644 --- a/shared/net/lib/EmittingTransportToCore.ts +++ b/shared/net/lib/EmittingTransportToCore.ts @@ -1,28 +1,26 @@ -import '@ulixee/commons/lib/SourceMapSupport'; import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; -import ITransportToCore, { ITransportToCoreEvents } from '../interfaces/ITransportToCore'; -import IApiHandlers from '../interfaces/IApiHandlers'; -import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; +import '@ulixee/commons/lib/SourceMapSupport'; +import ITransport, { ITransportEvents } from '../interfaces/ITransport'; -export default class EmittingTransportToCore +export default class EmittingTransportToCore extends TypedEventEmitter< - ITransportToCoreEvents & { - outbound: ICoreRequestPayload; + ITransportEvents & { + outbound: any; } > implements - ITransportToCore, + ITransport, ITypedEventEmitter< - ITransportToCoreEvents & { - outbound: ICoreRequestPayload; + ITransportEvents & { + outbound: any; } > { host = 'direct'; isConnected = true; - send(message: ICoreRequestPayload): Promise { + send(message: any): Promise { this.emit('outbound', message); return Promise.resolve(); } diff --git a/shared/net/lib/HttpTransportToClient.ts b/shared/net/lib/HttpTransportToClient.ts index 037defe2d..69064f887 100644 --- a/shared/net/lib/HttpTransportToClient.ts +++ b/shared/net/lib/HttpTransportToClient.ts @@ -1,33 +1,29 @@ +import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; +import '@ulixee/commons/lib/SourceMapSupport'; import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; import { IncomingMessage, ServerResponse } from 'http'; -import { URL } from 'url'; -import '@ulixee/commons/lib/SourceMapSupport'; import * as QueryString from 'querystring'; -import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; -import ITransportToClient, { ITransportToClientEvents } from '../interfaces/ITransportToClient'; -import IApiHandlers from '../interfaces/IApiHandlers'; +import { URL } from 'url'; import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; -import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; -import ICoreEventPayload from '../interfaces/ICoreEventPayload'; +import ITransport, { ITransportEvents } from '../interfaces/ITransport'; const Kb = 1e3; -export default class HttpTransportToClient - extends TypedEventEmitter> - implements ITransportToClient +export default class HttpTransportToClient + extends TypedEventEmitter + implements ITransport { private static requestCounter = 1; public remoteId: string; + public isConnected = true; constructor(public request: IncomingMessage, private response: ServerResponse) { super(); this.remoteId = `${request.socket.remoteAddress}:${request.socket.remotePort}`; } - public send( - message: ICoreResponsePayload | ICoreEventPayload, - ): Promise { + public send(message: any): Promise { const res = this.response; try { diff --git a/shared/net/lib/HttpTransportToCore.ts b/shared/net/lib/HttpTransportToCore.ts index 6b3da16ad..70fb97e71 100644 --- a/shared/net/lib/HttpTransportToCore.ts +++ b/shared/net/lib/HttpTransportToCore.ts @@ -1,24 +1,18 @@ -import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; +import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; -import * as https from 'https'; +import Resolvable from '@ulixee/commons/lib/Resolvable'; +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; import * as http from 'http'; import { ClientRequest, IncomingHttpHeaders } from 'http'; -import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; -import Resolvable from '@ulixee/commons/lib/Resolvable'; -import ITransportToCore, { ITransportToCoreEvents } from '../interfaces/ITransportToCore'; +import * as https from 'https'; +import RemoteError from '../errors/RemoteError'; import IApiHandlers from '../interfaces/IApiHandlers'; -import ICoreRequestPayload from '../interfaces/ICoreRequestPayload'; import ICoreResponsePayload from '../interfaces/ICoreResponsePayload'; -import ICoreEventPayload from '../interfaces/ICoreEventPayload'; -import RemoteError from '../errors/RemoteError'; +import ITransport, { ITransportEvents } from '../interfaces/ITransport'; -export default class HttpTransportToCore< - ApiHandlers extends IApiHandlers = any, - RequestPayload = ICoreRequestPayload, - ResponsePayload = ICoreResponsePayload | ICoreEventPayload, - > - extends TypedEventEmitter> - implements ITransportToCore +export default class HttpTransportToCore + extends TypedEventEmitter + implements ITransport { public readonly host: string; @@ -43,7 +37,7 @@ export default class HttpTransportToCore< this.disconnect = this.disconnect.bind(this); } - public async send(payload: RequestPayload): Promise { + public async send(payload: any): Promise { await this.connect(); const message = Buffer.from(TypeSerializer.stringify(payload)); diff --git a/shared/net/lib/TransportBridge.ts b/shared/net/lib/TransportBridge.ts index 43c4c77ee..1354b4ec6 100644 --- a/shared/net/lib/TransportBridge.ts +++ b/shared/net/lib/TransportBridge.ts @@ -1,16 +1,15 @@ -import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; import ITypedEventEmitter from '@ulixee/commons/interfaces/ITypedEventEmitter'; -import EmittingTransportToCore from './EmittingTransportToCore'; +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; import EmittingTransportToClient from './EmittingTransportToClient'; -import IApiHandlers from '../interfaces/IApiHandlers'; +import EmittingTransportToCore from './EmittingTransportToCore'; -export default class TransportBridge { - public transportToClient = new EmittingTransportToClient(); - public transportToCore = new EmittingTransportToCore(); +export default class TransportBridge { + public transportToClient = new EmittingTransportToClient(); + public transportToCore = new EmittingTransportToCore(); constructor(public shouldSerialize = false, private serializationMarker: string = 'DIRECT') { - this.transportToClient.on('outbound', (msg) => this.sendToTransport(msg, this.transportToCore)); - this.transportToCore.on('outbound', (msg) => this.sendToTransport(msg, this.transportToClient)); + this.transportToClient.on('outbound', msg => this.sendToTransport(msg, this.transportToCore)); + this.transportToCore.on('outbound', msg => this.sendToTransport(msg, this.transportToClient)); } private async sendToTransport( diff --git a/shared/net/lib/WsTransportToClient.ts b/shared/net/lib/WsTransportToClient.ts index e63d3980b..c8ca3d5fa 100644 --- a/shared/net/lib/WsTransportToClient.ts +++ b/shared/net/lib/WsTransportToClient.ts @@ -1,19 +1,19 @@ -import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; -import WebSocket = require('ws'); import { CanceledPromiseError } from '@ulixee/commons/interfaces/IPendingWaitEvent'; import EventSubscriber from '@ulixee/commons/lib/EventSubscriber'; import { TypedEventEmitter } from '@ulixee/commons/lib/eventUtils'; -import { IncomingMessage } from 'http'; +import TypeSerializer from '@ulixee/commons/lib/TypeSerializer'; import { bindFunctions } from '@ulixee/commons/lib/utils'; -import ITransportToClient, { ITransportToClientEvents } from '../interfaces/ITransportToClient'; +import { IncomingMessage } from 'http'; +import WebSocket = require('ws'); +import ITransport, { ITransportEvents } from '../interfaces/ITransport'; import { sendWsCloseUnexpectedError, wsSend } from './WsUtils'; -import IApiHandlers from '../interfaces/IApiHandlers'; -export default class WsTransportToClient - extends TypedEventEmitter> - implements ITransportToClient +export default class WsTransportToClient + extends TypedEventEmitter + implements ITransport { public remoteId: string; + public isConnected = true; private events = new EventSubscriber(); constructor(private webSocket: WebSocket, private request: IncomingMessage) { super(); @@ -37,6 +37,7 @@ export default class WsTransportToClient, - ResponsePayload = ICoreResponsePayload | ICoreEventPayload, - > - extends TypedEventEmitter> - implements ITransportToCore +export default class WsTransportToCore + extends TypedEventEmitter + implements ITransport { public host: string; @@ -45,7 +36,7 @@ export default class WsTransportToCore< this.hostPromise = Promise.resolve(host).then(this.setHost); } - public async send(payload: RequestPayload): Promise { + public async send(payload: any): Promise { await this.connect(); const message = TypeSerializer.stringify(payload); diff --git a/shared/net/test/ConnectionToClient.test.ts b/shared/net/test/ConnectionToClient.test.ts index 3bf578258..7e61e3369 100644 --- a/shared/net/test/ConnectionToClient.test.ts +++ b/shared/net/test/ConnectionToClient.test.ts @@ -1,11 +1,10 @@ -import EmittingTransportToClient from '../lib/EmittingTransportToClient'; +import ITransport from '../interfaces/ITransport'; import ConnectionToClient from '../lib/ConnectionToClient'; -import IApiHandlers from '../interfaces/IApiHandlers'; -import ITransportToClient from '../interfaces/ITransportToClient'; +import EmittingTransportToClient from '../lib/EmittingTransportToClient'; test('should route messages from client to the right API', () => { const apis = { 'Api.test': jest.fn() }; - const clientTransport = new EmittingTransportToClient(); + const clientTransport = new EmittingTransportToClient(); const connection = new ConnectionToClient(clientTransport, apis); connection.transport.emit('message', { @@ -18,7 +17,7 @@ test('should route messages from client to the right API', () => { }); test('should call disconnect once on a connection', async () => { - const clientTransport: ITransportToClient = new EmittingTransportToClient(); + const clientTransport: ITransport = new EmittingTransportToClient(); const connection = new ConnectionToClient(clientTransport, {}); clientTransport.disconnect = jest.fn(); diff --git a/shared/net/test/basic.test.ts b/shared/net/test/basic.test.ts index ed459399a..04615ff9b 100644 --- a/shared/net/test/basic.test.ts +++ b/shared/net/test/basic.test.ts @@ -18,7 +18,7 @@ beforeEach(() => { }); test('it can transport over a direct connection (bridge)', async () => { - const bridge = new TransportBridge(); + const bridge = new TransportBridge(); new ConnectionToClient(bridge.transportToClient, apiSpec); const connectionToCore = new ConnectionToCore(bridge.transportToCore); await expect( From ba038d82fa7e259dfc91ae2231377a754f06ff86 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 2 Jun 2023 15:32:16 -0400 Subject: [PATCH 114/147] chore: update repo-tools --- shared/commons/lib/Logger.ts | 2 +- shared/package.json | 2 +- shared/yarn.lock | 2262 +++++++++++++++++++--------------- 3 files changed, 1248 insertions(+), 1018 deletions(-) diff --git a/shared/commons/lib/Logger.ts b/shared/commons/lib/Logger.ts index 2b8648c7b..3f663931b 100644 --- a/shared/commons/lib/Logger.ts +++ b/shared/commons/lib/Logger.ts @@ -272,7 +272,7 @@ function extractPathFromModule(module: NodeModule): string { .replace(/^(.*)[/\\]commons[/\\](.+)$/, '$2') .replace(/^.*[/\\]packages[/\\](.+)$/, '$1'); } - return fullPath; + return moduleNamesByPath[fullPath]; } /// LOG FILTERING ////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/shared/package.json b/shared/package.json index b7d8f5603..b8dfcd5ec 100644 --- a/shared/package.json +++ b/shared/package.json @@ -23,7 +23,7 @@ "@commitlint/cli": "^17.6.3", "@commitlint/config-conventional": "^17.6.3", "@types/node": "^16.18.31", - "@ulixee/repo-tools": "^1.0.24", + "@ulixee/repo-tools": "^1.0.25", "cross-env": "^7.0.3", "@types/jest": "^29.5.1", "jest": "^29.5.0", diff --git a/shared/yarn.lock b/shared/yarn.lock index 1277ffc33..302d3a121 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -2,219 +2,165 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" - integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== - -"@babel/core@^7.11.6": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.2.tgz#87b2fcd7cce9becaa7f5acebdc4f09f3dd19d876" - integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helpers" "^7.18.2" - "@babel/parser" "^7.18.0" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/core@^7.12.3": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.0.tgz#c58d04d7c6fbfb58ea7681e2b9145cfb62726756" - integrity sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.0" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helpers" "^7.18.0" - "@babel/parser" "^7.18.0" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.0" - "@babel/types" "^7.18.0" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" + integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" + integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.0" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helpers" "^7.22.0" + "@babel/parser" "^7.22.0" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.18.0", "@babel/generator@^7.7.2": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.0.tgz#46d28e8a18fc737b028efb25ab105d74473af43f" - integrity sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg== +"@babel/generator@^7.22.0", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== dependencies: - "@babel/types" "^7.18.0" - "@jridgewell/gen-mapping" "^0.3.0" - jsesc "^2.5.1" - -"@babel/generator@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== - dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" + "@babel/types" "^7.22.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" - integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== +"@babel/helper-compilation-targets@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" + integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.20.2" + "@babel/compat-data" "^7.22.0" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" - integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== - dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-environment-visitor@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" - integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== - -"@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" +"@babel/helper-environment-visitor@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" + integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/types" "^7.16.7" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" - integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.0" - "@babel/types" "^7.18.0" - -"@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.17.12", "@babel/helper-plugin-utils@^7.8.0": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" - integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== - -"@babel/helper-plugin-utils@^7.20.2": +"@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== + dependencies: + "@babel/types" "^7.21.4" + +"@babel/helper-module-transforms@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" + integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + +"@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.20.2", "@babel/helper-plugin-utils@^7.8.0": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== -"@babel/helper-simple-access@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" - integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== - dependencies: - "@babel/types" "^7.17.0" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helpers@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.0.tgz#aff37c3590de42102b54842446146d0205946370" - integrity sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg== +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.0" - "@babel/types" "^7.18.0" + "@babel/types" "^7.21.5" -"@babel/helpers@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" - integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" + "@babel/types" "^7.18.6" -"@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helpers@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" + integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== + dependencies: + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.3" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112" - integrity sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -308,82 +254,51 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b" - integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/runtime-corejs3@^7.10.2": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.0.tgz#eed03023c5226b1e2b2ba32b8b6af5cb0518a6c7" - integrity sha512-G5FaGZOWORq9zthDjIrjib5XlcddeqLbIiDO3YQsut6j7aGf76xn0umUC/pA6+nApk3hQJF4JzLzg5PCl6ewJg== - dependencies: - core-js-pure "^3.20.2" - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.10.2", "@babel/runtime@^7.16.3": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.0.tgz#6d77142a19cb6088f0af662af1ada37a604d34ae" - integrity sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.18.0", "@babel/traverse@^7.7.2": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.0.tgz#0e5ec6db098660b2372dd63d096bf484e32d27ba" - integrity sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.0" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.0" - "@babel/types" "^7.18.0" - debug "^4.1.0" - globals "^11.1.0" + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" + integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/traverse@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8" - integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.0" - "@babel/types" "^7.18.2" +"@babel/runtime@^7.20.7": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" + integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.20.7", "@babel/template@^7.21.9", "@babel/template@^7.3.3": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" + integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/parser" "^7.21.9" + "@babel/types" "^7.21.5" + +"@babel/traverse@^7.22.1", "@babel/traverse@^7.7.2": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.0.tgz#ef523ea349722849cb4bf806e9342ede4d071553" - integrity sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.2": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" - integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.3.3": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" + integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-string-parser" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -392,12 +307,12 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@commitlint/cli@^17.6.3": - version "17.6.3" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.6.3.tgz#a02194a2bb6efe4e681eda2addd072a8d02c9497" - integrity sha512-ItSz2fd4F+CujgIbQOfNNerDF1eFlsBGEfp9QcCb1kxTYMuKTYZzA6Nu1YRRrIaaWwe2E7awUGpIMrPoZkOG3A== + version "17.6.5" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.6.5.tgz#3a8abd6499f9d4aeafe3bf9201338ccb868a14b9" + integrity sha512-3PQrWr/uo6lzF5k7n5QuosCYnzaxP9qGBp3jhWP0Vmsa7XA6wrl9ccPqfQyXpSbQE3zBROVO3TDqgPKe4tfmLQ== dependencies: "@commitlint/format" "^17.4.4" - "@commitlint/lint" "^17.6.3" + "@commitlint/lint" "^17.6.5" "@commitlint/load" "^17.5.0" "@commitlint/read" "^17.5.1" "@commitlint/types" "^17.4.4" @@ -408,9 +323,9 @@ yargs "^17.0.0" "@commitlint/config-conventional@^17.6.3": - version "17.6.3" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.6.3.tgz#21f5835235493e386effeaa98b898124230b1000" - integrity sha512-bLyHEjjRWqlLQWIgYFHmUPbEFMOOLXeF3QbUinDIJev/u9e769tkoTH9YPknEywiuIrAgZaVo+OfzAIsJP0fsw== + version "17.6.5" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.6.5.tgz#a8ec286e634a071329fe45dc4955032c2176aeb5" + integrity sha512-Xl9H9KLl86NZm5CYNTNF9dcz1xelE/EbvhWIWcYxG/rn3UWYWdWmmnX2q6ZduNdLFSGbOxzUpIx61j5zxbeXxg== dependencies: conventional-changelog-conventionalcommits "^5.0.0" @@ -447,22 +362,22 @@ "@commitlint/types" "^17.4.4" chalk "^4.1.0" -"@commitlint/is-ignored@^17.6.3": - version "17.6.3" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.6.3.tgz#8e21046558a0339fbf2a33ef0ad7d5a9ae7ff6bc" - integrity sha512-LQbNdnPbxrpbcrVKR5yf51SvquqktpyZJwqXx3lUMF6+nT9PHB8xn3wLy8pi2EQv5Zwba484JnUwDE1ygVYNQA== +"@commitlint/is-ignored@^17.6.5": + version "17.6.5" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.6.5.tgz#cea24cd2031fe7d242590b91fab3352750887194" + integrity sha512-CQvAPt9gX7cuUbMrIaIMKczfWJqqr6m8IlJs0F2zYwyyMTQ87QMHIj5jJ5HhOaOkaj6dvTMVGx8Dd1I4xgUuoQ== dependencies: "@commitlint/types" "^17.4.4" semver "7.5.0" -"@commitlint/lint@^17.6.3": - version "17.6.3" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.6.3.tgz#2d9a88b73c44be8b97508c980198a6f289251655" - integrity sha512-fBlXwt6SHJFgm3Tz+luuo3DkydAx9HNC5y4eBqcKuDuMVqHd2ugMNr+bQtx6riv9mXFiPoKp7nE4Xn/ls3iVDA== +"@commitlint/lint@^17.6.5": + version "17.6.5" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.6.5.tgz#dfa437f14430c9874d6b1a3ba8a2d44b79780c02" + integrity sha512-BSJMwkE4LWXrOsiP9KoHG+/heSDfvOL/Nd16+ojTS/DX8HZr8dNl8l3TfVr/d/9maWD8fSegRGtBtsyGuugFrw== dependencies: - "@commitlint/is-ignored" "^17.6.3" - "@commitlint/parse" "^17.4.4" - "@commitlint/rules" "^17.6.1" + "@commitlint/is-ignored" "^17.6.5" + "@commitlint/parse" "^17.6.5" + "@commitlint/rules" "^17.6.5" "@commitlint/types" "^17.4.4" "@commitlint/load@^17.5.0": @@ -490,10 +405,10 @@ resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.4.2.tgz#f4753a79701ad6db6db21f69076e34de6580e22c" integrity sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q== -"@commitlint/parse@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.4.4.tgz#8311b12f2b730de6ea0679ae2a37b386bcc5b04b" - integrity sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg== +"@commitlint/parse@^17.6.5": + version "17.6.5" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.6.5.tgz#7b84b328a6a94ca08ab7c98c491d9d3dab68f09d" + integrity sha512-0zle3bcn1Hevw5Jqpz/FzEWNo2KIzUbc1XyGg6WrWEoa6GH3A1pbqNF6MvE6rjuy6OY23c8stWnb4ETRZyN+Yw== dependencies: "@commitlint/types" "^17.4.4" conventional-changelog-angular "^5.0.11" @@ -522,10 +437,10 @@ resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^17.6.1": - version "17.6.1" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.6.1.tgz#dff529b8d1e0455808fe7e3e1fa70617e4eb2759" - integrity sha512-lUdHw6lYQ1RywExXDdLOKxhpp6857/4c95Dc/1BikrHgdysVUXz26yV0vp1GL7Gv+avx9WqZWTIVB7pNouxlfw== +"@commitlint/rules@^17.6.5": + version "17.6.5" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.6.5.tgz#fabcacdde923e26ac5ef90d4b3f8fc05526bbaa1" + integrity sha512-uTB3zSmnPyW2qQQH+Dbq2rekjlWRtyrjDo4aLFe63uteandgkI+cc0NhhbBAzcXShzVk0qqp8SlkQMu0mgHg/A== dependencies: "@commitlint/ensure" "^17.4.4" "@commitlint/message" "^17.4.2" @@ -571,34 +486,44 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== -"@eslint/eslintrc@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" - integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.3.2" - globals "^13.15.0" + espree "^9.5.2" + globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" + integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== + "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.9.2": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" - integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== +"@humanwhocodes/config-array@^0.11.8": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" - minimatch "^3.0.4" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" @@ -818,20 +743,12 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" @@ -841,14 +758,14 @@ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/resolve-uri@^3.0.3": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" - integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" @@ -856,9 +773,9 @@ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.13" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" - integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -868,7 +785,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.18": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== @@ -876,14 +793,6 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@lerna/add@4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" @@ -1568,7 +1477,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1679,10 +1588,10 @@ "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^12.7.0": - version "12.8.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.8.0.tgz#f4708cf948724d6e8f7d878cfd91584c1c5c0523" - integrity sha512-ydcKLs2KKcxlhpdWLzJxEBDEk/U5MUeqtqkXlrtAUXXFPs6vLl1PEGghFC/BbpleosB7iXs0Z4P2DGe7ZT5ZNg== +"@octokit/openapi-types@^12.11.0": + version "12.11.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" + integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" @@ -1690,11 +1599,11 @@ integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== "@octokit/plugin-paginate-rest@^2.16.8": - version "2.21.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.2.tgz#070be9bb18cb78e52b471ddc3551d28355e2d5e2" - integrity sha512-S24H0a6bBVreJtoTaRHT/gnVASbOHVTRMOVIqd9zrJBP3JozsxJB56TDuTUmd1xLI4/rAE2HNmThvVKtIdLLEw== + version "2.21.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz#7f12532797775640dbb8224da577da7dc210c87e" + integrity sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw== dependencies: - "@octokit/types" "^6.39.0" + "@octokit/types" "^6.40.0" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" @@ -1740,12 +1649,24 @@ "@octokit/plugin-request-log" "^1.0.4" "@octokit/plugin-rest-endpoint-methods" "^5.12.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0": - version "6.39.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.39.0.tgz#46ce28ca59a3d4bac0e487015949008302e78eee" - integrity sha512-Mq4N9sOAYCitTsBtDdRVrBE80lIrMBhL9Jbrw0d+j96BAzlq4V+GLHFJbHokEsVvO/9tQupQdoFdgVYhD2C8UQ== +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0": + version "6.41.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" + integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== dependencies: - "@octokit/openapi-types" "^12.7.0" + "@octokit/openapi-types" "^12.11.0" + +"@pkgr/utils@^2.3.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.1.tgz#adf291d0357834c410ce80af16e711b56c7b1cd3" + integrity sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w== + dependencies: + cross-spawn "^7.0.3" + fast-glob "^3.2.12" + is-glob "^4.0.3" + open "^9.1.0" + picocolors "^1.0.0" + tslib "^2.5.0" "@sinclair/typebox@^0.25.16": version "0.25.24" @@ -1792,12 +1713,12 @@ integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" @@ -1818,11 +1739,11 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" - integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.20.7" "@types/better-sqlite3@^7.6.4": version "7.6.4" @@ -1832,9 +1753,9 @@ "@types/node" "*" "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" @@ -1858,17 +1779,17 @@ "@types/istanbul-lib-report" "*" "@types/jest@^29.5.1": - version "29.5.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47" - integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ== + version "29.5.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" + integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" @@ -1886,14 +1807,14 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "17.0.35" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.35.tgz#635b7586086d51fb40de0a2ec9d1014a5283ba4a" - integrity sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg== + version "20.2.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== "@types/node@^16.18.31": - version "16.18.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.31.tgz#7de39c2b9363f0d95b129cc969fcbf98e870251c" - integrity sha512-KPXltf4z4g517OlVJO9XQ2357CYw7fvuJ3ZuBynjXC5Jos9i+K7LvFb7bUIwtJXSZj0vTp9Q6NJBSQpkwwO8Zw== + version "16.18.34" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.34.tgz#62d2099b30339dec4b1b04a14c96266459d7c8b2" + integrity sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -1906,9 +1827,9 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.1.5": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.1.tgz#76e72d8a775eef7ce649c63c8acae1a0824bbaed" - integrity sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw== + 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/semver@^7.3.12": version "7.5.0" @@ -1933,21 +1854,21 @@ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": - version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" - integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.59.2": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz#f156827610a3f8cefc56baeaa93cd4a5f32966b4" - integrity sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg== +"@typescript-eslint/eslint-plugin@^5.59.6": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz#1e7a3e5318ece22251dfbc5c9c6feeb4793cc509" + integrity sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.5" - "@typescript-eslint/type-utils" "5.59.5" - "@typescript-eslint/utils" "5.59.5" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/type-utils" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -1955,140 +1876,94 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.59.2": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.5.tgz#63064f5eafbdbfb5f9dfbf5c4503cdf949852981" - integrity sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw== +"@typescript-eslint/parser@^5.59.6": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.8.tgz#60cbb00671d86cf746044ab797900b1448188567" + integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== dependencies: - "@typescript-eslint/scope-manager" "5.59.5" - "@typescript-eslint/types" "5.59.5" - "@typescript-eslint/typescript-estree" "5.59.5" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.27.1": - version "5.27.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.27.1.tgz#4d1504392d01fe5f76f4a5825991ec78b7b7894d" - integrity sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg== +"@typescript-eslint/scope-manager@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8" + integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== dependencies: - "@typescript-eslint/types" "5.27.1" - "@typescript-eslint/visitor-keys" "5.27.1" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" -"@typescript-eslint/scope-manager@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz#33ffc7e8663f42cfaac873de65ebf65d2bce674d" - integrity sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A== +"@typescript-eslint/type-utils@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz#aa6c029a9d7706d26bbd25eb4666398781df6ea2" + integrity sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA== dependencies: - "@typescript-eslint/types" "5.59.5" - "@typescript-eslint/visitor-keys" "5.59.5" - -"@typescript-eslint/type-utils@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz#485b0e2c5b923460bc2ea6b338c595343f06fc9b" - integrity sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg== - dependencies: - "@typescript-eslint/typescript-estree" "5.59.5" - "@typescript-eslint/utils" "5.59.5" + "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.27.1": - version "5.27.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.27.1.tgz#34e3e629501349d38be6ae97841298c03a6ffbf1" - integrity sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg== - -"@typescript-eslint/types@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.5.tgz#e63c5952532306d97c6ea432cee0981f6d2258c7" - integrity sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w== +"@typescript-eslint/types@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8" + integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== -"@typescript-eslint/typescript-estree@5.27.1": - version "5.27.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.1.tgz#7621ee78607331821c16fffc21fc7a452d7bc808" - integrity sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw== +"@typescript-eslint/typescript-estree@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7" + integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== dependencies: - "@typescript-eslint/types" "5.27.1" - "@typescript-eslint/visitor-keys" "5.27.1" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz#9b252ce55dd765e972a7a2f99233c439c5101e42" - integrity sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg== - dependencies: - "@typescript-eslint/types" "5.59.5" - "@typescript-eslint/visitor-keys" "5.59.5" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.5.tgz#15b3eb619bb223302e60413adb0accd29c32bcae" - integrity sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA== +"@typescript-eslint/utils@5.59.8", "@typescript-eslint/utils@^5.10.0": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b" + integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.5" - "@typescript-eslint/types" "5.59.5" - "@typescript-eslint/typescript-estree" "5.59.5" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@^5.10.0": - version "5.27.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.27.1.tgz#b4678b68a94bc3b85bf08f243812a6868ac5128f" - integrity sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w== +"@typescript-eslint/visitor-keys@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40" + integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.27.1" - "@typescript-eslint/types" "5.27.1" - "@typescript-eslint/typescript-estree" "5.27.1" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/visitor-keys@5.27.1": - version "5.27.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.1.tgz#05a62666f2a89769dac2e6baa48f74e8472983af" - integrity sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ== - dependencies: - "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.59.5": - version "5.59.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz#ba5b8d6791a13cf9fea6716af1e7626434b29b9b" - integrity sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA== +"@ulixee/repo-tools@^1.0.25": + version "1.0.25" + resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.25.tgz#f82a57b27e6bcefbe1012686ca9ccf9b82e0ca20" + integrity sha512-+DaiOr8vMu5oBY4vpe2CXAiIrmOAwLyNAQTgKVoyoTb489OP0RQ4YQ/zPoW8SdqSmoGXWOZuO3OsUyQ/py0+0w== dependencies: - "@typescript-eslint/types" "5.59.5" - eslint-visitor-keys "^3.3.0" - -"@ulixee/repo-tools@^1.0.24": - version "1.0.24" - resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.24.tgz#04db40a9f23d18e99faa3a69d31d81364bd144ce" - integrity sha512-7C1/eHyknkGRDx0mIhhm3p/vxhwYT/U4YlYviZeuNdUk0f/GMvV/xtq6IgHkNbNSCmNkQw0qmryGPmR1YDDjPQ== - dependencies: - "@typescript-eslint/eslint-plugin" "^5.59.2" - "@typescript-eslint/parser" "^5.59.2" + "@typescript-eslint/eslint-plugin" "^5.59.6" + "@typescript-eslint/parser" "^5.59.6" copyfiles "^2.4.1" eslint "^8.17.0" eslint-config-airbnb-base "^15.0.0" eslint-config-airbnb-typescript "^17.0.0" eslint-config-prettier "^8.5.0" - eslint-import-resolver-typescript "^2.7.1" + eslint-import-resolver-typescript "^3.5.5" eslint-plugin-eslint-comments "^3.2.0" - eslint-plugin-import "^2.26.0" - eslint-plugin-jest "^26.5.3" + eslint-plugin-import "^2.27.5" + eslint-plugin-jest "^27.2.1" eslint-plugin-jsx-a11y "^6.5.1" eslint-plugin-monorepo-cop "^1.0.2" - eslint-plugin-prettier "^4.0.0" - eslint-plugin-promise "^6.0.0" + eslint-plugin-prettier "^4.2.1" + eslint-plugin-promise "^6.1.1" prettier "^2.6.2" pretty-quick "^3.1.0" typescript "^5.0.4" @@ -2116,16 +1991,11 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.4.1: +acorn@^8.4.1, acorn@^8.8.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -acorn@^8.7.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" @@ -2139,12 +2009,12 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.1.3: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== dependencies: debug "^4.1.0" - depd "^1.1.2" + depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -2222,9 +2092,9 @@ ansi-styles@^6.0.0: integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== anymatch@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -2264,13 +2134,20 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" - integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== +aria-query@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" + deep-equal "^2.0.5" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" array-differ@^3.0.0: version "3.0.0" @@ -2282,15 +2159,15 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-union@^2.1.0: @@ -2298,24 +2175,34 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" @@ -2366,25 +2253,32 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axe-core@^4.3.5: - version "4.4.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.2.tgz#dcf7fb6dea866166c3eab33d68208afe4d5f670c" - integrity sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA== +axe-core@^4.6.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" babel-jest@^29.5.0: version "29.5.0" @@ -2464,14 +2358,26 @@ bech32@^2.0.0: integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== before-after-hook@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" - integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + +big-integer@^1.6.44: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== bignumber.js@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" brace-expansion@^1.1.7: version "1.1.11" @@ -2488,16 +2394,15 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.20.2: - version "4.20.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" - integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== +browserslist@^4.21.3: + version "4.21.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" + integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== dependencies: - caniuse-lite "^1.0.30001332" - electron-to-chromium "^1.4.118" - escalade "^3.1.1" - node-releases "^2.0.3" - picocolors "^1.0.0" + caniuse-lite "^1.0.30001489" + electron-to-chromium "^1.4.411" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" bser@2.1.1: version "2.1.1" @@ -2516,6 +2421,13 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -2582,10 +2494,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001332: - version "1.0.30001341" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz#59590c8ffa8b5939cf4161f00827b8873ad72498" - integrity sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA== +caniuse-lite@^1.0.30001489: + version "1.0.30001492" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz#4a06861788a52b4c81fd3344573b68cc87fe062b" + integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw== caseless@~0.12.0: version "0.12.0" @@ -2648,9 +2560,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.1.tgz#58331f6f472a25fe3a50a351ae3052936c2c7f32" - integrity sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg== + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: version "1.2.2" @@ -2732,7 +2644,7 @@ cmd-shim@^4.1.0: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== code-point-at@^1.0.0: version "1.1.0" @@ -2761,7 +2673,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" @@ -2794,9 +2706,9 @@ commander@^10.0.0: integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^9.3.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c" - integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw== + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== compare-func@^2.0.0: version "2.0.0" @@ -2809,7 +2721,7 @@ compare-func@^2.0.0: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^2.0.0: version "2.0.0" @@ -2931,11 +2843,9 @@ conventional-recommended-bump@^6.1.0: q "^1.5.1" convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + 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" @@ -2955,11 +2865,6 @@ copyfiles@^2.4.1: untildify "^4.0.0" yargs "^16.1.0" -core-js-pure@^3.20.2: - version "3.22.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.5.tgz#bdee0ed2f9b78f2862cda4338a07b13a49b6c9a9" - integrity sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA== - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2976,9 +2881,9 @@ cosmiconfig-typescript-loader@^4.0.0: integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -3017,7 +2922,7 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -damerau-levenshtein@^1.0.7: +damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== @@ -3046,13 +2951,6 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: dependencies: ms "2.1.2" -debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -3066,9 +2964,9 @@ debuglog@^1.0.1: integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -3076,17 +2974,41 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-equal@^2.0.5: + version "2.2.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" + integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.0" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" deep-is@^0.1.3: version "0.1.4" @@ -3094,21 +3016,44 @@ deep-is@^0.1.3: integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -3123,10 +3068,10 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" @@ -3224,10 +3169,10 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.4.118: - version "1.4.137" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f" - integrity sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA== +electron-to-chromium@^1.4.411: + version "1.4.418" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.418.tgz#9092aca12db25acf02a2ddf9de59f0e4363c9928" + integrity sha512-1KnpDTS9onwAfMzW50LcpNtyOkMyjd/OLoD2Kx/DDITZqgNYixY71XNszPHNxyQQ/Brh+FDcUnf4BaM041sdWg== emittery@^0.13.1: version "0.13.1" @@ -3258,6 +3203,14 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +enhanced-resolve@^5.12.0: + version "5.14.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" + integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -3280,40 +3233,75 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== +es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" + get-intrinsic "^1.2.0" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.0" + object-inspect "^1.12.3" object-keys "^1.1.1" - object.assign "^4.1.2" + object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -3338,7 +3326,7 @@ escalade@^3.1.1: escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" @@ -3368,36 +3356,39 @@ eslint-config-airbnb-typescript@^17.0.0: eslint-config-airbnb-base "^15.0.0" eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-import-resolver-typescript@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" - integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== +eslint-import-resolver-typescript@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" + integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== dependencies: debug "^4.3.4" - glob "^7.2.0" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + get-tsconfig "^4.5.0" + globby "^13.1.3" + is-core-module "^2.11.0" is-glob "^4.0.3" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" + synckit "^0.8.5" -eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" - find-up "^2.1.0" eslint-plugin-eslint-comments@^3.2.0: version "3.2.0" @@ -3407,49 +3398,55 @@ eslint-plugin-eslint-comments@^3.2.0: escape-string-regexp "^1.0.5" ignore "^5.0.5" -eslint-plugin-import@^2.26.0: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== +eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.1" + is-core-module "^2.11.0" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" tsconfig-paths "^3.14.1" -eslint-plugin-jest@^26.5.3: - version "26.5.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.5.3.tgz#a3ceeaf4a757878342b8b00eca92379b246e5505" - integrity sha512-sICclUqJQnR1bFRZGLN2jnSVsYOsmPYYnroGCIMVSvTS3y8XR3yjzy1EcTQmk6typ5pRgyIWzbjqxK6cZHEZuQ== +eslint-plugin-jest@^27.2.1: + version "27.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz#b85b4adf41c682ea29f1f01c8b11ccc39b5c672c" + integrity sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg== dependencies: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-jsx-a11y@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" - integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== - dependencies: - "@babel/runtime" "^7.16.3" - aria-query "^4.2.2" - array-includes "^3.1.4" + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" ast-types-flow "^0.0.7" - axe-core "^4.3.5" - axobject-query "^2.2.0" - damerau-levenshtein "^1.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.2.1" - language-tags "^1.0.5" - minimatch "^3.0.4" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" eslint-plugin-monorepo-cop@^1.0.2: version "1.0.2" @@ -3459,17 +3456,17 @@ eslint-plugin-monorepo-cop@^1.0.2: read-pkg-up "^6.0.0" requireindex "~1.1.0" -eslint-plugin-prettier@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" - integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-promise@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" - integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== +eslint-plugin-promise@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" + integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== eslint-scope@^5.1.1: version "5.1.1" @@ -3479,59 +3476,53 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== eslint@^8.17.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.17.0.tgz#1cfc4b6b6912f77d24b874ca1506b0fe09328c21" - integrity sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw== + version "8.41.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" + integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== dependencies: - "@eslint/eslintrc" "^1.3.0" - "@humanwhocodes/config-array" "^0.9.2" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.41.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.3.2" - esquery "^1.4.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.15.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" + is-path-inside "^3.0.3" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" @@ -3539,30 +3530,28 @@ eslint@^8.17.0: minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - regexpp "^3.2.0" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" - integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== dependencies: - acorn "^8.7.1" + acorn "^8.8.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -3623,7 +3612,7 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^7.0.0: +execa@^7.0.0, execa@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== @@ -3641,7 +3630,7 @@ execa@^7.0.0: exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expect@^29.0.0, expect@^29.5.0: version "29.5.0" @@ -3684,14 +3673,14 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== +fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3707,19 +3696,19 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" @@ -3749,10 +3738,10 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" @@ -3781,9 +3770,16 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" forever-agent@~0.6.1: version "0.6.1" @@ -3835,7 +3831,7 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2: version "2.3.2" @@ -3857,12 +3853,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -3891,14 +3882,15 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-proto "^1.0.1" + has-symbols "^1.0.3" get-package-type@^0.1.0: version "0.1.0" @@ -3940,6 +3932,13 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-tsconfig@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.6.0.tgz#e977690993a42f3e320e932427502a40f7af6d05" + integrity sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg== + dependencies: + resolve-pkg-maps "^1.0.0" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -4003,14 +4002,14 @@ glob-parent@^5.1.1, glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" -glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4025,7 +4024,7 @@ glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, gl global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== dependencies: ini "^1.3.4" @@ -4034,13 +4033,20 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.15.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" - integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@^11.0.2, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -4053,16 +4059,39 @@ globby@^11.0.2, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +globby@^13.1.3: + version "13.1.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -4101,7 +4130,7 @@ has-bigints@^1.0.1, has-bigints@^1.0.2: has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" @@ -4115,7 +4144,12 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -4157,9 +4191,9 @@ html-escaper@^2.0.0: integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-proxy-agent@^4.0.1: version "4.0.1" @@ -4236,9 +4270,9 @@ ignore-walk@^3.0.3: minimatch "^3.0.4" ignore@^5.0.5, ignore@^5.1.4, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -4259,7 +4293,7 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -4274,7 +4308,7 @@ infer-owner@^1.0.4: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -4321,12 +4355,12 @@ inquirer@^7.3.3: strip-ansi "^6.0.0" through "^2.3.6" -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -4335,15 +4369,32 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" @@ -4360,10 +4411,10 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^2.0.0: version "2.0.0" @@ -4372,24 +4423,34 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== +is-core-module@^2.11.0, is-core-module@^2.5.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -4420,11 +4481,23 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -4447,10 +4520,15 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-plain-obj@^2.0.0: version "2.1.0" @@ -4477,6 +4555,11 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -4518,15 +4601,31 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typedarray@^1.0.0, 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-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -4534,20 +4633,40 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" @@ -4565,9 +4684,9 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + 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== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -4594,9 +4713,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -4788,9 +4907,9 @@ jest-mock@^29.5.0: jest-util "^29.5.0" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + 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@^29.4.3: version "29.4.3" @@ -5020,24 +5139,24 @@ json-schema@0.4.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" @@ -5051,7 +5170,7 @@ jsonfile@^6.0.1: jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== jsprim@^1.2.2: version "1.4.2" @@ -5063,13 +5182,13 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -jsx-ast-utils@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" - integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== +jsx-ast-utils@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== dependencies: - array-includes "^3.1.4" - object.assign "^4.1.2" + array-includes "^3.1.5" + object.assign "^4.1.3" kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" @@ -5082,14 +5201,14 @@ kleur@^3.0.3: integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== language-subtag-registry@~0.3.2: - version "0.3.21" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" - integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== -language-tags@^1.0.5: +language-tags@=1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== dependencies: language-subtag-registry "~0.3.2" @@ -5217,7 +5336,7 @@ load-json-file@^6.2.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -5326,6 +5445,13 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -5406,7 +5532,7 @@ makeerror@1.0.12: map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" @@ -5475,7 +5601,7 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -5492,9 +5618,9 @@ minimist-options@4.1.0: kind-of "^6.0.3" minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -5552,12 +5678,17 @@ minipass@^2.6.0, minipass@^2.9.0: yallist "^3.0.0" minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" - integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -5609,11 +5740,6 @@ mri@^1.1.5: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -5659,7 +5785,7 @@ natural-compare-lite@^1.4.0: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@^0.6.2: version "0.6.3" @@ -5672,9 +5798,9 @@ neo-async@^2.6.0: integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + version "2.6.11" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" + integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== dependencies: whatwg-url "^5.0.0" @@ -5714,17 +5840,17 @@ node-gyp@^7.1.0: node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" - integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== noms@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" - integrity sha1-2o69nzr51nYJGbJ9nNyAkqczKFk= + integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== dependencies: inherits "^2.0.1" readable-stream "~1.0.31" @@ -5901,63 +6027,76 @@ object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - -object-inspect@^1.12.3: +object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== +object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== +object.entries@^1.1.5, object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.getownpropertydescriptors@^2.0.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: - array.prototype.reduce "^1.0.4" call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.20.1" + es-abstract "^1.20.4" -object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.getownpropertydescriptors@^2.0.3: + version "2.1.6" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== dependencies: + array.prototype.reduce "^1.0.5" call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -5975,6 +6114,16 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +open@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== + dependencies: + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^2.2.0" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -6034,7 +6183,7 @@ p-limit@^3.0.2, p-limit@^3.1.0: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" @@ -6092,7 +6241,7 @@ p-timeout@^3.2.0: p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" @@ -6156,7 +6305,7 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-path@^4.0.4: +parse-path@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.4.tgz#4bf424e6b743fb080831f03b536af9fc43f0ffea" integrity sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw== @@ -6167,19 +6316,19 @@ parse-path@^4.0.4: query-string "^6.13.8" parse-url@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.2.tgz#4a30b057bfc452af64512dfb1a7755c103db3ea1" - integrity sha512-uCSjOvD3T+6B/sPWhR+QowAZcU/o4bjPrVBQBGFxcDF6J6FraCGIaDBsdoQawiaaAVdHvtqBe3w3vKlfBKySOQ== + version "6.0.5" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.5.tgz#4acab8982cef1846a0f8675fa686cef24b2f6f9b" + integrity sha512-e35AeLTSIlkw/5GFq70IN7po8fmDUjpDPY1rIK+VubRfsUvBonjQ+PBZG+vWMACnQSmNlvl524IucoDmcioMxA== dependencies: is-ssh "^1.3.0" normalize-url "^6.1.0" - parse-path "^4.0.4" + parse-path "^4.0.0" protocols "^1.4.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -6189,7 +6338,7 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" @@ -6283,9 +6432,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-format@^29.0.0, pretty-format@^29.5.0: version "29.5.0" @@ -6370,9 +6519,9 @@ pump@^3.0.0: once "^1.3.1" punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== pure-rand@^6.0.0: version "6.0.2" @@ -6382,12 +6531,12 @@ pure-rand@^6.0.0: q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== qs@^6.9.4: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" @@ -6417,9 +6566,9 @@ quick-lru@^4.0.1: integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== react-is@^18.0.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" - integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== read-cmd-shim@^2.0.0: version "2.0.0" @@ -6526,18 +6675,18 @@ read@1, read@~1.0.1: mute-stream "~0.0.4" readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readable-stream@^2.0.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -6550,7 +6699,7 @@ readable-stream@^2.0.6, readable-stream@~2.3.6: readable-stream@~1.0.31: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -6570,7 +6719,7 @@ readdir-scoped-modules@^1.0.0: rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" @@ -6582,24 +6731,19 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + define-properties "^1.2.0" + functions-have-names "^1.2.3" request@^2.88.0, request@^2.88.2: version "2.88.2" @@ -6630,7 +6774,7 @@ request@^2.88.0, request@^2.88.2: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" @@ -6640,7 +6784,7 @@ require-from-string@^2.0.2: requireindex@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= + integrity sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg== resolve-cwd@^3.0.0: version "3.0.0" @@ -6666,17 +6810,22 @@ resolve-global@1.0.0, resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + 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.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -6717,6 +6866,13 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -6743,6 +6899,16 @@ rxjs@^7.8.0: dependencies: tslib "^2.1.0" +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -6753,6 +6919,15 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -6776,9 +6951,9 @@ semver@^6.0.0, semver@^6.3.0: integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== dependencies: lru-cache "^6.0.0" @@ -6847,6 +7022,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -6902,11 +7082,11 @@ socks-proxy-agent@^6.0.0: socks "^2.6.2" socks@^2.3.3, socks@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" - integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: - ip "^1.1.5" + ip "^2.0.0" smart-buffer "^4.2.0" sort-keys@^2.0.0: @@ -6942,9 +7122,9 @@ source-map@^0.6.0, source-map@^0.6.1: integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -6963,9 +7143,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== split-on-first@^1.0.0: version "1.1.0" @@ -6989,7 +7169,7 @@ split@^1.0.0: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: version "1.17.0" @@ -7014,12 +7194,19 @@ ssri@^8.0.0, ssri@^8.0.1: minipass "^3.1.1" stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -7065,23 +7252,32 @@ string-width@^5.0.0: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" string_decoder@^1.1.1: version "1.3.0" @@ -7093,7 +7289,7 @@ string_decoder@^1.1.1: string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@~1.1.1: version "1.1.1" @@ -7117,16 +7313,16 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" @@ -7190,6 +7386,19 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +synckit@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.5.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + tar@^4.4.12: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" @@ -7204,13 +7413,13 @@ tar@^4.4.12: yallist "^3.1.1" tar@^6.0.2, tar@^6.1.0: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -7248,7 +7457,7 @@ text-extensions@^1.0.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== through2@^2.0.0, through2@^2.0.1: version "2.0.5" @@ -7268,7 +7477,12 @@ through2@^4.0.0: through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== tmp@^0.0.33: version "0.0.33" @@ -7285,7 +7499,7 @@ tmpl@1.0.5: 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 sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" @@ -7339,12 +7553,12 @@ ts-node@^10.8.1: yn "3.1.1" tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -7353,10 +7567,10 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.1.0, tslib@^2.5.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" + integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== tsutils@^3.21.0: version "3.21.0" @@ -7424,6 +7638,15 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + 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" @@ -7437,9 +7660,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== "typescript@^4.6.4 || ^5.0.0", typescript@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + version "5.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" + integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== typescript@~4.7.3: version "4.7.4" @@ -7447,9 +7670,9 @@ typescript@~4.7.3: integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== uglify-js@^3.1.4: - version "3.16.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.2.tgz#0481e1dbeed343ad1c2ddf3c6d42e89b7a6d4def" - integrity sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg== + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== uid-number@0.0.6: version "0.0.6" @@ -7505,6 +7728,14 @@ upath@^2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -7515,7 +7746,7 @@ uri-js@^4.2.2: util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util-promisify@^2.1.0: version "2.1.0" @@ -7534,11 +7765,6 @@ 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-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - v8-to-istanbul@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" @@ -7624,6 +7850,28 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -7676,7 +7924,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^2.4.2: version "2.4.3" @@ -7739,9 +7987,9 @@ write-pkg@^4.0.0: write-json-file "^3.2.0" ws@^7.4.6: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xtend@~4.0.1: version "4.0.2" @@ -7753,7 +8001,7 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.0, yallist@^3.1.1: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -7769,9 +8017,9 @@ yaml@^1.10.0: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.2.tgz#ec551ef37326e6d42872dad1970300f8eb83a073" - integrity sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== yargs-parser@20.2.4: version "20.2.4" @@ -7783,11 +8031,6 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3: 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.0: - version "21.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" - integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -7806,7 +8049,7 @@ yargs@^16.1.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.0: +yargs@^17.0.0, 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== @@ -7819,19 +8062,6 @@ yargs@^17.0.0: y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@^17.3.1: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" @@ -7843,6 +8073,6 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zod@^3.20.2: - version "3.20.2" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.2.tgz#068606642c8f51b3333981f91c0a8ab37dfc2807" - integrity sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ== + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== From 34cfbf29cfd5920709bfa67b40f252f1c9be405b Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 12 Jun 2023 16:32:42 -0400 Subject: [PATCH 115/147] v2.0.0-alpha.22 --- shared/CHANGELOG.md | 27 +++++++++++++++++++++++++++ shared/commons/CHANGELOG.md | 24 ++++++++++++++++++++++++ shared/commons/package.json | 6 +++--- shared/crypto/CHANGELOG.md | 18 ++++++++++++++++++ shared/crypto/package.json | 8 ++++---- shared/net/CHANGELOG.md | 17 +++++++++++++++++ shared/net/package.json | 4 ++-- shared/package.json | 2 +- shared/schema/CHANGELOG.md | 11 +++++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 11 +++++++++++ shared/specification/package.json | 2 +- shared/yarn.lock | 8 ++++---- 13 files changed, 124 insertions(+), 16 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index f619c7ec1..77baeede1 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,33 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) + + +### Bug Fixes + +* **commons:** change default settings to data dir ([c6d5a34](https://github.com/ulixee/shared/commit/c6d5a3412e6876448e17734013ee76222d4c4e43)) +* **commons:** don’t retranslate source maps ([7d7ddf3](https://github.com/ulixee/shared/commit/7d7ddf3584e7d6ca48a66530ad2c94e15b366ab7)) +* **commons:** handle relative source map content ([2fa4cbc](https://github.com/ulixee/shared/commit/2fa4cbc6304c7547f98d0d64c68d62c827ddc921)) +* **commons:** windows relative urls not working ([d575fce](https://github.com/ulixee/shared/commit/d575fcef6b9cf953f562811d1adc7f7e323c3993)) +* **net:** clear out connection once connected ([6969a48](https://github.com/ulixee/shared/commit/6969a489eae0fdf5efe5d7784885062fde9aa94b)) +* souce map tests ([675602b](https://github.com/ulixee/shared/commit/675602b9c24b04a002ecb1939cee08276288799e)) + + +### Features + +* **commons:** add priority to queue; lru cache ([f25caad](https://github.com/ulixee/shared/commit/f25caad300260aee6724f6daecc3dec110c28cce)) +* **commons:** add shutdown handlers to always run ([a6c6609](https://github.com/ulixee/shared/commit/a6c660964939cdbc65951f2857e13c4405256242)) +* **commons:** add timestamps to logging ([a953f70](https://github.com/ulixee/shared/commit/a953f70c8d37e7b41d0d885d65ab93a23d7830e0)) +* **commons:** buffer xor, toBigInt ([3d3c18a](https://github.com/ulixee/shared/commit/3d3c18af6cdb0dffa413b15c440a588b768f1ff2)) +* **commons:** sql inserts with named keys ([21b1ac8](https://github.com/ulixee/shared/commit/21b1ac86f4e071f00127c7277eb653cc1ec63553)) +* **net:** add core response time logging ([3d0d894](https://github.com/ulixee/shared/commit/3d0d8941addc132b4eba8dcdd8067c1d95e8437c)) +* **specification:** allow configuring api context ([e41e409](https://github.com/ulixee/shared/commit/e41e40991db595abf75bd80635ae4e958965a425)) + + + + + # [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) **Note:** Version bump only for package @ulixee/shared-monorepo diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 36e53391f..dfeaa4dbb 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) + + +### Bug Fixes + +* **commons:** change default settings to data dir ([c6d5a34](https://github.com/ulixee/shared/commit/c6d5a3412e6876448e17734013ee76222d4c4e43)) +* **commons:** don’t retranslate source maps ([7d7ddf3](https://github.com/ulixee/shared/commit/7d7ddf3584e7d6ca48a66530ad2c94e15b366ab7)) +* **commons:** handle relative source map content ([2fa4cbc](https://github.com/ulixee/shared/commit/2fa4cbc6304c7547f98d0d64c68d62c827ddc921)) +* **commons:** windows relative urls not working ([d575fce](https://github.com/ulixee/shared/commit/d575fcef6b9cf953f562811d1adc7f7e323c3993)) +* souce map tests ([675602b](https://github.com/ulixee/shared/commit/675602b9c24b04a002ecb1939cee08276288799e)) + + +### Features + +* **commons:** add priority to queue; lru cache ([f25caad](https://github.com/ulixee/shared/commit/f25caad300260aee6724f6daecc3dec110c28cce)) +* **commons:** add shutdown handlers to always run ([a6c6609](https://github.com/ulixee/shared/commit/a6c660964939cdbc65951f2857e13c4405256242)) +* **commons:** add timestamps to logging ([a953f70](https://github.com/ulixee/shared/commit/a953f70c8d37e7b41d0d885d65ab93a23d7830e0)) +* **commons:** buffer xor, toBigInt ([3d3c18a](https://github.com/ulixee/shared/commit/3d3c18af6cdb0dffa413b15c440a588b768f1ff2)) +* **commons:** sql inserts with named keys ([21b1ac8](https://github.com/ulixee/shared/commit/21b1ac86f4e071f00127c7277eb653cc1ec63553)) + + + + + # [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) **Note:** Version bump only for package @ulixee/commons diff --git a/shared/commons/package.json b/shared/commons/package.json index fb7dc03dd..09f7703e6 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,15 +1,15 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.21", + "version": "2.0.0-alpha.22", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", "bech32": "^2.0.0", "devtools-protocol": "^0.0.1137505", "https-proxy-agent": "^5.0.0", - "semver": "^7.3.7", - "@jridgewell/trace-mapping": "^0.3.18" + "semver": "^7.3.7" }, "devDependencies": { "@types/better-sqlite3": "^7.6.4", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index b60f01036..d30f3da46 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) + + +### Bug Fixes + +* **commons:** change default settings to data dir ([c6d5a34](https://github.com/ulixee/shared/commit/c6d5a3412e6876448e17734013ee76222d4c4e43)) +* **commons:** handle relative source map content ([2fa4cbc](https://github.com/ulixee/shared/commit/2fa4cbc6304c7547f98d0d64c68d62c827ddc921)) + + +### Features + +* **commons:** add priority to queue; lru cache ([f25caad](https://github.com/ulixee/shared/commit/f25caad300260aee6724f6daecc3dec110c28cce)) +* **commons:** buffer xor, toBigInt ([3d3c18a](https://github.com/ulixee/shared/commit/3d3c18af6cdb0dffa413b15c440a588b768f1ff2)) + + + + + # [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) **Note:** Version bump only for package @ulixee/crypto diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 0bf915f76..d4f186b17 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.21", + "version": "2.0.0-alpha.22", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.21", - "@ulixee/crypto": "2.0.0-alpha.21", - "@ulixee/specification": "2.0.0-alpha.21", + "@ulixee/commons": "2.0.0-alpha.22", + "@ulixee/crypto": "2.0.0-alpha.22", + "@ulixee/specification": "2.0.0-alpha.22", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index daa7d4c66..53c941773 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,23 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) + + +### Bug Fixes + +* **commons:** handle relative source map content ([2fa4cbc](https://github.com/ulixee/shared/commit/2fa4cbc6304c7547f98d0d64c68d62c827ddc921)) +* **net:** clear out connection once connected ([6969a48](https://github.com/ulixee/shared/commit/6969a489eae0fdf5efe5d7784885062fde9aa94b)) + + +### Features + +* **net:** add core response time logging ([3d0d894](https://github.com/ulixee/shared/commit/3d0d8941addc132b4eba8dcdd8067c1d95e8437c)) + + + + + # [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index 1900b1961..05a991189 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.21", + "version": "2.0.0-alpha.22", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.21", + "@ulixee/commons": "2.0.0-alpha.22", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/package.json b/shared/package.json index b8dfcd5ec..20c85b177 100644 --- a/shared/package.json +++ b/shared/package.json @@ -23,7 +23,7 @@ "@commitlint/cli": "^17.6.3", "@commitlint/config-conventional": "^17.6.3", "@types/node": "^16.18.31", - "@ulixee/repo-tools": "^1.0.25", + "@ulixee/repo-tools": "^1.0.26", "cross-env": "^7.0.3", "@types/jest": "^29.5.1", "jest": "^29.5.0", diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index 4bd0beb70..b74feaaa1 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) + + +### Bug Fixes + +* **commons:** handle relative source map content ([2fa4cbc](https://github.com/ulixee/shared/commit/2fa4cbc6304c7547f98d0d64c68d62c827ddc921)) + + + + + # [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) **Note:** Version bump only for package @ulixee/schema diff --git a/shared/schema/package.json b/shared/schema/package.json index 4fbe3150b..e9f1c383c 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.21", + "version": "2.0.0-alpha.22", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 876a9e418..ab008fa51 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) + + +### Features + +* **specification:** allow configuring api context ([e41e409](https://github.com/ulixee/shared/commit/e41e40991db595abf75bd80635ae4e958965a425)) + + + + + # [2.0.0-alpha.21](https://github.com/ulixee/shared/compare/v2.0.0-alpha.20...v2.0.0-alpha.21) (2023-04-24) **Note:** Version bump only for package @ulixee/specification diff --git a/shared/specification/package.json b/shared/specification/package.json index 217d103ee..9ece3d32a 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.21", + "version": "2.0.0-alpha.22", "description": "", "main": "./index.js", "license": "MIT", diff --git a/shared/yarn.lock b/shared/yarn.lock index 302d3a121..105467354 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -1944,10 +1944,10 @@ "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" -"@ulixee/repo-tools@^1.0.25": - version "1.0.25" - resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.25.tgz#f82a57b27e6bcefbe1012686ca9ccf9b82e0ca20" - integrity sha512-+DaiOr8vMu5oBY4vpe2CXAiIrmOAwLyNAQTgKVoyoTb489OP0RQ4YQ/zPoW8SdqSmoGXWOZuO3OsUyQ/py0+0w== +"@ulixee/repo-tools@^1.0.26": + version "1.0.26" + resolved "https://registry.yarnpkg.com/@ulixee/repo-tools/-/repo-tools-1.0.26.tgz#c664401802fadb795ca759330e73a601332d51c6" + integrity sha512-tK8dMp8gS+cV4ubqYFYeUU/vaOUwoozdKXTCkpqcImdOYU34jXoZyOJaaLjudH0Y3L+w3DoMdakLb/6TdIujtQ== dependencies: "@typescript-eslint/eslint-plugin" "^5.59.6" "@typescript-eslint/parser" "^5.59.6" From 5c1f8b54eb8775dd8526ff60406137a4989b9022 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 6 Jul 2023 17:56:48 -0400 Subject: [PATCH 116/147] feat(commons): add async iterator last function --- shared/commons/lib/asyncUtils.ts | 8 ++++++++ shared/crypto/lib/Ed25519.ts | 4 ++++ shared/specification/common.ts | 2 +- shared/specification/types/ISchema.ts | 24 ------------------------ 4 files changed, 13 insertions(+), 25 deletions(-) delete mode 100644 shared/specification/types/ISchema.ts diff --git a/shared/commons/lib/asyncUtils.ts b/shared/commons/lib/asyncUtils.ts index 0626c7486..ea6ba5494 100644 --- a/shared/commons/lib/asyncUtils.ts +++ b/shared/commons/lib/asyncUtils.ts @@ -38,3 +38,11 @@ export function first(source: AsyncIterable): Promise { for await (const entry of source) return entry; })(); } + +export function last(source: AsyncIterable): Promise { + return (async () => { + let item: T; + for await (const entry of source) item = entry; + return item; + })(); +} diff --git a/shared/crypto/lib/Ed25519.ts b/shared/crypto/lib/Ed25519.ts index 228977df9..3c7320e30 100644 --- a/shared/crypto/lib/Ed25519.ts +++ b/shared/crypto/lib/Ed25519.ts @@ -62,6 +62,10 @@ export default class Ed25519 { } static sign(keyObject: KeyObject, hashedMessage: Buffer): Buffer { + if (hashedMessage.byteLength !== 32) + throw new Error( + 'Attempting to sign a non 256 bit value. Only provide hashed values to sign!!', + ); return sign(null, hashedMessage, keyObject); } } diff --git a/shared/specification/common.ts b/shared/specification/common.ts index 66eede8f6..920c56050 100644 --- a/shared/specification/common.ts +++ b/shared/specification/common.ts @@ -13,7 +13,7 @@ export const identityValidation = z .length(61) .regex( /^id1[ac-hj-np-z02-9]{58}/, - 'This is not a Ulixee identity (Bech32 encoded hash starting with "id1").', + 'This is not a Ulixee identity (Bech32 encoded public key starting with "id1").', ); export const hashValidation = z diff --git a/shared/specification/types/ISchema.ts b/shared/specification/types/ISchema.ts deleted file mode 100644 index 032a13f47..000000000 --- a/shared/specification/types/ISchema.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { z } from 'zod'; - -export const schemaVersionHashValidation = z - .string() - .length(62) - .regex( - /^sch1[ac-hj-np-z02-9]{58}/, - 'This is not a Schema versionHash (Bech32 encoded hash starting with "sch1").', - ); - - -// These are things we need to track, but not totally sure where yet -export const SchemaManifest = z.object({ - schemaCoreHash: schemaVersionHashValidation.describe( - 'A hash of the main attributes of the schema to avoid changes for minor description changes', - ), - baseSchemaHash: schemaVersionHashValidation, - previousVersionHash: schemaVersionHashValidation, -}); - -type ISchemaManifest = z.infer; - -export default ISchemaManifest; -export { z }; From a8eb51cf2c1828abe3eea5c169cdfb7f242d306a Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 7 Jul 2023 17:09:38 -0400 Subject: [PATCH 117/147] chore: fix lerna file --- shared/lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/lerna.json b/shared/lerna.json index 1af65ff89..8c9acb563 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.21", + "version": "2.0.0-alpha.22", "npmClient": "yarn", "useWorkspaces": true } From 38f3936423b7452638748de1665159657b0a72bd Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Fri, 7 Jul 2023 17:09:48 -0400 Subject: [PATCH 118/147] v2.0.0-alpha.23 --- shared/CHANGELOG.md | 11 +++++++++++ shared/commons/CHANGELOG.md | 11 +++++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 11 +++++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 8 ++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 11 +++++++++++ shared/specification/package.json | 2 +- 12 files changed, 70 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 77baeede1..8abbd3ac1 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) + + +### Features + +* **commons:** add async iterator last function ([f4dd911](https://github.com/ulixee/shared/commit/f4dd9113341e37ce193455e5a55b30f99436daa9)) + + + + + # [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index dfeaa4dbb..68908ec4f 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) + + +### Features + +* **commons:** add async iterator last function ([f4dd911](https://github.com/ulixee/shared/commit/f4dd9113341e37ce193455e5a55b30f99436daa9)) + + + + + # [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) diff --git a/shared/commons/package.json b/shared/commons/package.json index 09f7703e6..324ef723d 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.22", + "version": "2.0.0-alpha.23", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index d30f3da46..6beb3508d 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) + + +### Features + +* **commons:** add async iterator last function ([f4dd911](https://github.com/ulixee/shared/commit/f4dd9113341e37ce193455e5a55b30f99436daa9)) + + + + + # [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) diff --git a/shared/crypto/package.json b/shared/crypto/package.json index d4f186b17..98d874ffa 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.22", + "version": "2.0.0-alpha.23", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.22", - "@ulixee/crypto": "2.0.0-alpha.22", - "@ulixee/specification": "2.0.0-alpha.22", + "@ulixee/commons": "2.0.0-alpha.23", + "@ulixee/crypto": "2.0.0-alpha.23", + "@ulixee/specification": "2.0.0-alpha.23", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index 8c9acb563..2ec82ba90 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.22", + "version": "2.0.0-alpha.23", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index 53c941773..f5c2c775b 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) diff --git a/shared/net/package.json b/shared/net/package.json index 05a991189..f463c56fe 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.22", + "version": "2.0.0-alpha.23", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.22", + "@ulixee/commons": "2.0.0-alpha.23", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index b74feaaa1..5c86a9a7b 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) + +**Note:** Version bump only for package @ulixee/schema + + + + + # [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) diff --git a/shared/schema/package.json b/shared/schema/package.json index e9f1c383c..88a8ee05e 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.22", + "version": "2.0.0-alpha.23", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index ab008fa51..6f6111057 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) + + +### Features + +* **commons:** add async iterator last function ([f4dd911](https://github.com/ulixee/shared/commit/f4dd9113341e37ce193455e5a55b30f99436daa9)) + + + + + # [2.0.0-alpha.22](https://github.com/ulixee/shared/compare/v2.0.0-alpha.21...v2.0.0-alpha.22) (2023-06-12) diff --git a/shared/specification/package.json b/shared/specification/package.json index 9ece3d32a..4f222a03d 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.22", + "version": "2.0.0-alpha.23", "description": "", "main": "./index.js", "license": "MIT", From 6cfa5d848d9cea878841f9d40cbcac7b2db5687e Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Wed, 9 Aug 2023 09:55:09 -0400 Subject: [PATCH 119/147] v2.0.0-alpha.24 --- shared/CHANGELOG.md | 8 ++++++++ shared/commons/CHANGELOG.md | 8 ++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 8 ++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 8 ++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 8 ++++++++ shared/specification/package.json | 2 +- 12 files changed, 58 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 8abbd3ac1..28a596c30 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) + +**Note:** Version bump only for package @ulixee/shared-monorepo + + + + + # [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 68908ec4f..3a5ad9629 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) + +**Note:** Version bump only for package @ulixee/commons + + + + + # [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) diff --git a/shared/commons/package.json b/shared/commons/package.json index 324ef723d..ac1917f34 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.23", + "version": "2.0.0-alpha.24", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 6beb3508d..987358df0 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) + +**Note:** Version bump only for package @ulixee/crypto + + + + + # [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 98d874ffa..709ec408c 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.23", + "version": "2.0.0-alpha.24", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.23", - "@ulixee/crypto": "2.0.0-alpha.23", - "@ulixee/specification": "2.0.0-alpha.23", + "@ulixee/commons": "2.0.0-alpha.24", + "@ulixee/crypto": "2.0.0-alpha.24", + "@ulixee/specification": "2.0.0-alpha.24", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index 2ec82ba90..4242b4a23 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.23", + "version": "2.0.0-alpha.24", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index f5c2c775b..ab8bd4fd5 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index f463c56fe..95cca66a6 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.23", + "version": "2.0.0-alpha.24", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.23", + "@ulixee/commons": "2.0.0-alpha.24", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index 5c86a9a7b..9b0dfc99e 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) + +**Note:** Version bump only for package @ulixee/schema + + + + + # [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) **Note:** Version bump only for package @ulixee/schema diff --git a/shared/schema/package.json b/shared/schema/package.json index 88a8ee05e..1a5ac9a87 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.23", + "version": "2.0.0-alpha.24", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index 6f6111057..cdd8f1262 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) + +**Note:** Version bump only for package @ulixee/specification + + + + + # [2.0.0-alpha.23](https://github.com/ulixee/shared/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2023-07-07) diff --git a/shared/specification/package.json b/shared/specification/package.json index 4f222a03d..718c53095 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.23", + "version": "2.0.0-alpha.24", "description": "", "main": "./index.js", "license": "MIT", From c94d72e34da49f921b3d782fde3ca29a3d2d7770 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 28 Sep 2023 14:42:57 -0400 Subject: [PATCH 120/147] chore: update sqlite bindings --- shared/commons/package.json | 2 +- shared/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/shared/commons/package.json b/shared/commons/package.json index ac1917f34..8b35812a2 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -12,7 +12,7 @@ "semver": "^7.3.7" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.4", + "@types/better-sqlite3": "^7.6.5", "source-map-js": "^1.0.2" } } diff --git a/shared/yarn.lock b/shared/yarn.lock index 105467354..d81a638db 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -1745,10 +1745,10 @@ dependencies: "@babel/types" "^7.20.7" -"@types/better-sqlite3@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.4.tgz#102462611e67aadf950d3ccca10292de91e6f35b" - integrity sha512-dzrRZCYPXIXfSR1/surNbJ/grU3scTaygS0OMzjlGf71i9sc2fGyHPXXiXmEvNIoE0cGwsanEFMVJxPXmco9Eg== +"@types/better-sqlite3@^7.6.5": + version "7.6.5" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.5.tgz#4b64b47467b4bf0572bc7df4614a524c4bd365eb" + integrity sha512-H3ZUx89KiPhYa9nalUXVVStSUFHuzYxt4yoazufpTTYW9rVUCzhh02V8CH2C8nE4libnK0UgFq5DFIe0DOhqow== dependencies: "@types/node" "*" From bb020c5e1e721ddf535d5ac39d218ba654ed80a9 Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Thu, 28 Sep 2023 14:57:48 -0400 Subject: [PATCH 121/147] v2.0.0-alpha.25 --- shared/CHANGELOG.md | 8 ++++++++ shared/commons/CHANGELOG.md | 8 ++++++++ shared/commons/package.json | 2 +- shared/crypto/CHANGELOG.md | 8 ++++++++ shared/crypto/package.json | 8 ++++---- shared/lerna.json | 2 +- shared/net/CHANGELOG.md | 8 ++++++++ shared/net/package.json | 4 ++-- shared/schema/CHANGELOG.md | 8 ++++++++ shared/schema/package.json | 2 +- shared/specification/CHANGELOG.md | 8 ++++++++ shared/specification/package.json | 2 +- 12 files changed, 58 insertions(+), 10 deletions(-) diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 28a596c30..760e7fc05 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.25](https://github.com/ulixee/shared/compare/v2.0.0-alpha.24...v2.0.0-alpha.25) (2023-09-28) + +**Note:** Version bump only for package @ulixee/shared-monorepo + + + + + # [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) **Note:** Version bump only for package @ulixee/shared-monorepo diff --git a/shared/commons/CHANGELOG.md b/shared/commons/CHANGELOG.md index 3a5ad9629..7c248a23d 100644 --- a/shared/commons/CHANGELOG.md +++ b/shared/commons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.25](https://github.com/ulixee/shared/compare/v2.0.0-alpha.24...v2.0.0-alpha.25) (2023-09-28) + +**Note:** Version bump only for package @ulixee/commons + + + + + # [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) **Note:** Version bump only for package @ulixee/commons diff --git a/shared/commons/package.json b/shared/commons/package.json index 8b35812a2..40357273b 100644 --- a/shared/commons/package.json +++ b/shared/commons/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/commons", - "version": "2.0.0-alpha.24", + "version": "2.0.0-alpha.25", "private": true, "description": "Common utilities for Ulixee", "license": "MIT", diff --git a/shared/crypto/CHANGELOG.md b/shared/crypto/CHANGELOG.md index 987358df0..4b9b60715 100644 --- a/shared/crypto/CHANGELOG.md +++ b/shared/crypto/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.25](https://github.com/ulixee/shared/compare/v2.0.0-alpha.24...v2.0.0-alpha.25) (2023-09-28) + +**Note:** Version bump only for package @ulixee/crypto + + + + + # [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) **Note:** Version bump only for package @ulixee/crypto diff --git a/shared/crypto/package.json b/shared/crypto/package.json index 709ec408c..8b3b90b66 100644 --- a/shared/crypto/package.json +++ b/shared/crypto/package.json @@ -1,13 +1,13 @@ { "name": "@ulixee/crypto", - "version": "2.0.0-alpha.24", + "version": "2.0.0-alpha.25", "description": "Common crypto tools for Ulixee", "license": "MIT", "bin": "./bin/cli.js", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.24", - "@ulixee/crypto": "2.0.0-alpha.24", - "@ulixee/specification": "2.0.0-alpha.24", + "@ulixee/commons": "2.0.0-alpha.25", + "@ulixee/crypto": "2.0.0-alpha.25", + "@ulixee/specification": "2.0.0-alpha.25", "bignumber.js": "^9.0.2", "commander": "^9.3.0" } diff --git a/shared/lerna.json b/shared/lerna.json index 4242b4a23..96de6bbd0 100644 --- a/shared/lerna.json +++ b/shared/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha.24", + "version": "2.0.0-alpha.25", "npmClient": "yarn", "useWorkspaces": true } diff --git a/shared/net/CHANGELOG.md b/shared/net/CHANGELOG.md index ab8bd4fd5..621e57528 100644 --- a/shared/net/CHANGELOG.md +++ b/shared/net/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.25](https://github.com/ulixee/shared/compare/v2.0.0-alpha.24...v2.0.0-alpha.25) (2023-09-28) + +**Note:** Version bump only for package @ulixee/net + + + + + # [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) **Note:** Version bump only for package @ulixee/net diff --git a/shared/net/package.json b/shared/net/package.json index 95cca66a6..aa0b66601 100644 --- a/shared/net/package.json +++ b/shared/net/package.json @@ -1,11 +1,11 @@ { "name": "@ulixee/net", - "version": "2.0.0-alpha.24", + "version": "2.0.0-alpha.25", "private": true, "description": "Common networking for the Ulixee projects", "license": "MIT", "dependencies": { - "@ulixee/commons": "2.0.0-alpha.24", + "@ulixee/commons": "2.0.0-alpha.25", "ws": "^7.4.6" }, "devDependencies": { diff --git a/shared/schema/CHANGELOG.md b/shared/schema/CHANGELOG.md index 9b0dfc99e..b08f9cf91 100644 --- a/shared/schema/CHANGELOG.md +++ b/shared/schema/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.25](https://github.com/ulixee/shared/compare/v2.0.0-alpha.24...v2.0.0-alpha.25) (2023-09-28) + +**Note:** Version bump only for package @ulixee/schema + + + + + # [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) **Note:** Version bump only for package @ulixee/schema diff --git a/shared/schema/package.json b/shared/schema/package.json index 1a5ac9a87..1c64dbf69 100644 --- a/shared/schema/package.json +++ b/shared/schema/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/schema", - "version": "2.0.0-alpha.24", + "version": "2.0.0-alpha.25", "description": "A basic schema utility with static constraints to support secure type checking.", "license": "MIT", "dependencies": { diff --git a/shared/specification/CHANGELOG.md b/shared/specification/CHANGELOG.md index cdd8f1262..177b713ce 100644 --- a/shared/specification/CHANGELOG.md +++ b/shared/specification/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0-alpha.25](https://github.com/ulixee/shared/compare/v2.0.0-alpha.24...v2.0.0-alpha.25) (2023-09-28) + +**Note:** Version bump only for package @ulixee/specification + + + + + # [2.0.0-alpha.24](https://github.com/ulixee/shared/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2023-08-09) **Note:** Version bump only for package @ulixee/specification diff --git a/shared/specification/package.json b/shared/specification/package.json index 718c53095..53161d0b1 100644 --- a/shared/specification/package.json +++ b/shared/specification/package.json @@ -1,6 +1,6 @@ { "name": "@ulixee/specification", - "version": "2.0.0-alpha.24", + "version": "2.0.0-alpha.25", "description": "", "main": "./index.js", "license": "MIT", From de8797ff2f3b99f70ad48007cc58b0edcfd6b6cf Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 29 Jan 2024 10:55:16 -0500 Subject: [PATCH 122/147] chore: update to yarn 4 chore: update github actions --- shared/.github/workflows/js-branch.yml | 4 +- shared/.github/workflows/lint-and-test.yml | 4 +- shared/.yarn/install-state.gz | Bin 0 -> 1043810 bytes shared/.yarnrc.yml | 1 + shared/commons/package.json | 2 +- shared/package.json | 4 +- shared/yarn.lock | 19092 +++++++++++-------- 7 files changed, 11022 insertions(+), 8085 deletions(-) create mode 100644 shared/.yarn/install-state.gz create mode 100644 shared/.yarnrc.yml diff --git a/shared/.github/workflows/js-branch.yml b/shared/.github/workflows/js-branch.yml index 27c9b756e..53032355f 100644 --- a/shared/.github/workflows/js-branch.yml +++ b/shared/.github/workflows/js-branch.yml @@ -10,9 +10,9 @@ jobs: name: Build Javascript runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 18 cache: yarn diff --git a/shared/.github/workflows/lint-and-test.yml b/shared/.github/workflows/lint-and-test.yml index b2ef956ba..2b5c35e03 100644 --- a/shared/.github/workflows/lint-and-test.yml +++ b/shared/.github/workflows/lint-and-test.yml @@ -20,11 +20,11 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: 'true' - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'yarn' diff --git a/shared/.yarn/install-state.gz b/shared/.yarn/install-state.gz new file mode 100644 index 0000000000000000000000000000000000000000..f9a4013f77837b1f76e5a813804309812aef0d2c GIT binary patch literal 1043810 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
Tu>cHp1PN^ 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𝔱@2l}qUc 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 (9#>H#nnqQT`{adY#pa0!|{mcHx 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�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

P%n%e=R7D7T74 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

L58HY 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%0AFu&F?|Gda(g;ba{1r5}zt`FVjq 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⪙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

|82MaSUdZb+#ckHd0@9 zidi!f(G|g3=`-&w=KwE5LCY$bjHbzx=swks-&Gq^^R*_)t$P@*gU82*f&1A9?>{&R zx$)4w{3PUy>@Phv`G^G_4a_*%%wBQ+R7>Jv9Z07u7`WBw*Eq=G*)-!NlvH<{OXP%bA6F zps4@cSHE*+G1~y`0sNATDnqE*v>3=ey<0QcH?AL1tI;NSc#$^JHq!r!7Wzk8W!Qrw zw5WR2s;lE2a$DcAA%8=zy8Uq*E$f9)l4i~ za%N)yY*dn~!j9EdLn#p>@N@!zNZCS)g&82{w{Q$2%T)40#QY`sJLZ1@sf{;`vRBcj znc9*%g7#!uc1kgo{0t`JP2;uTJG+K)JcT6c2%pLKl5(+<77c>rM#fJT8Xjia>%cs> zYhwe3t$GvHU8SP_96?ssa*@g+zhj6|v zDZ4<7930i2`rNCwNmhWIIav_xrPP%J- zF;dd8T>J93=qYAjsgMJT+4Ayr!4p1rX9QSJAXZ@N_F#++Fg!KjQsQW`R7z&3a?4lV zOviq@8zbmWD|HM~4L`A2^ewQ)PRsoyudphJ*_##4_$N2!%T77)S)K#- zkR==qu{ZKci$OiSpoSjRNjsqOjFZ@WhxeKw5>^3GjC^W38B$$RgOrCzT6Nc%g76!l z7*3t$5-8dP7Lq-YV9g{qz>rFiS6-0RToN)P0x6O93FrsN$gNE((T%?)AUKs!sunMV zQMXmw|F)61#mXSO6Xp}BfaN3c=vf{bf_?by{qB1Yi?(k)ZjWO}_lauy^VspZuYTv5 zf+alz@p%B3*r}=x_T&l>`(Ut%YNU)UGgNj6Se{)toQht%zRjs(adr?PFl>qZxx72k zEL!$G8>E%Jnu?n@8EMH3v!tZ)A$Qn1LF<>l{bUNF9VoQeD8oJVjBWU<>Of!}GGgvi zC#+ev5QHL`QU-~m^RT5bmO-ZkhWH!Y=5ta4uo2z?eTgY()ptS`IgP|-a?B8mv6s=c zgH#wyy8IodP2TdH61W1c7*Mn-!=?IA8`(-_p;7Jkz9d3bQPJtDB@xziEx(pDBCIa; z3BY4DAdB1z-;8UdPg_U4Hw?ntjX+$sr}gr#Fm^+*h(F$dLKR&T^(haL4xT3n5ub7u7GR6oy2|v zA>q--QQgvlbFc-;apfh>a{0TTyassp^7p*TO!0ga{PaJ;pyN27eEY3$@z3Y}=H9pi zo>j8+%g&je${D3s99bOONnbb-J|s;QS7;MXMp%QqxzeRQ-U4$i6>^<%6EZ-dSq=O{ z){4^nFor?muT3I~uBf9*Nf%qA5=j$t`ciU`TaVexI7qs8^S)MDd+zJs1svq>eH}Q+ zwYA5MALnY>e((BdwD;Phic@Cj0$x?=%o>T#?lH=l4BZ7~C(W14ygDMb=gHC>b2s%@ zfPH0x3fBoS#@^Kd0kZ;ZJ07gSnA=gOA%6@&lmyG2v~eoHVotN!V~op-S3&-5`?ft- zLAT~}*AVx{k8?GnKlt_a&8N)id+XU#h406j4P1axsg%$eS0IsnvpSYeMxAR?wgN8! zlhV$iSeXnp6|{CDVhQ|&tgN?u8&?|y-Ug;pDhI1?z9%c1NlM14qZS^dHVHmM_YA6E zuJy5QGk1R;8t;0HZ_Spk=J?i+bKM;9Z2jVIz58rEo%~}kvEP1Vmf2z1iU-Nvda0NJ zaw`*w4LSpjE}01N5Jx19_W)x<(I7HX7V}b*8sshmvz@?v1Eht~)K0Vl7=ptjEtHt) zrIK{p!C(aAG^HybTXgrbS-z{Mxtrx%pGN$Bufu7?)mppt<6Nz^@AEw-Kq@N|j z@+@(}xaBZy2xid0YdBNj!7NUubnAAB5VygtvJ)b_@fcF%(zy>nfRw13p(xO;szj67 z@63SedH~#xoEKzV0fMvqzzkt1(vXe@7{vDq`wn@?C%CigA&T8zE!IDEeWY$X>7ws< zzy7qn`>cPXKYh7l<*i5av+f8U+**J2g|EMYdPJ4JVpM5T*(4GvTuG-7>Nx9roT&=A>2!sp=LO-- zHIBOV<6JGJAAfWy9XpnX!H|RrfAp4KD+S?7cB;u0CnAGdd}MrPKz3a|q3opl9%O%&-`LelPtIk%7d_kZG#KTz4m zyRxa5IdeIJ^IANZ}rsnk)GMRxLWgk*1Yvg6MFPH`?tM5}5DoDdDGSt6aO zTDJYsBU#lD++`fFW;a#>j#VZcet?>G3DyG;)m?wxdw=W4c~pk?NAIWq!}q@R^>@GV z^xgO6YV=qdgv1zGpdSP2Fo}akrZg_8W%3AU_NG+~iDKPO(^XeVwrFvzm5&-zkH%Lm zh%SwaIi;TpQd3O@W3yGZCRZXS1h+F8-pM~`4|%m+`Ewn20isvj@W@SoDyBOaSgeHM z1twCYorJ5vI<*pT^e{ETR+d~A@i&`3nmYMpXJofgs&*=WXyTtPhdO!?7hSy&o4tRY&KsX(%kxS9-Z2++)eGHMaFGL##U7%KK4-oOHODw`&qX-riVDqfOqdAOCe&3 z)Lg3+&dE=#E-NAEq#Df*?+dESfEH&7`OKvPN1oAGezMEnOI~|kam!e__+3q=spFVa z$h}OL3D&A0zj~dV!X;S=5-J;;6xqfcr336_ZP>;lAO>P7L6BIf6L1&1Ojvb8sKgZ#8htmIFC-|*FH_|Pw(dS7yiN*w(cX-462rL%7BEk z@D!~lG*~LUsspi`=Ya7@uxS+atF94iiGXmp*p$Wx$dLFVjFOLCwVXJ>>3MCNmG33E zf9_G{h91dAM-@Y?WkAi2^JI~w7J;KuL8iC>H2`(N04}qvQWbdO|$VmoJqPx-H{92{(P7V%Gs+%aios<$(i$0J2#nR27|r_NouEtgVS?lLG70 zYk_xQ8d-fpX?BLH8Zy-A(imT4D2ZniVPu=KH6nHt-YrGowdg=MqWoa;DlL zTbM62qslO&_!t5!2MXbfM0$b}A|E=IZS&m31xPXI5{S%i2z57k;PQp0LQSiUnYJco z^;(?VAS7Z2g^n!p>$8j-KhDSV`@;{W^nR|t|7Y9306Z_pI&vp7CEZ6`8@$7l5;Dx$ zt#fm`qe%sjZlRLawAr`P#gerK@my8*fpE{-hPRPjBdf1xcL(<~YgTPa;4EnZ>62QK z;<_4mKRMa>fy;fTt-sevI)&=2iZoLiUT~%wsn8o15?m7B;%^bhs1x1 zYC4n7wKd#rZ>Rf7vW^X~H{0X`(7_D~4)D%4#wX{`U%A9j+7Ji_=GdPAUIy8!@w=gR zYUxhx$ZV{nehfyW0PM2i4N8ka7P3VCVk-&3s{|H$oR}M%YE7|#_;hZX2}iyK(vBg^ z6j9{Zch7QbWHiI|S<$T@=ZZ7^e+A9bJmiCBSqi@;oP*GvmX+kJWc&f?UNsneR&!FF zU6sHJi~=az9h#H36oJK-F40pHKxM2;*r61a2-8~3Nk_7)&SCDl@4eo^$?W#yv!frl zJCSr}7yD06o_VC6N0~;A`yDze@7FBDRX?QN)I6k7-TqR6lPILkG0Azy=%h&(;5|jT z=n_hblw;L*DIK;{RrTs*GSn6*muNeh={jbG?<;0 z!Diio{-lD)hLnAKs7`D>t4MpQjMpCMC!36&C4jh!oa&8UDrLDb2E!J0O=r+L|21i; z)W;~>Hlpz~Zdb-Zo>}(ep!^d*e93Qn_qO@kFa4!oyOg)xA;LfOxtwnQ^m{McpAA}G zS>S%{`@#X?mQw=wMs|Xb&Mf~0xq=*% z4*<@Q(GTRySOI8kjG3~eymT#5)eTs;>ZggMn?J2_x_@ zscNvardw!@yKYHt%_MaY1-a35H4kcXvjFunIv`>7SyqV3O+1@Ef)e;vsosP%;asv( zb2hQ;jVVdqYOS%-=T?olmAd~V$0hYJxlytV+>1QX!EW+9xmv$J_Ts6|htJkGzxgiN z=jvSW)`R$XHCQ1^l?S~n&wcfa=w*2gSp1tqg;#i}aO;HfrOj{5KuOYLR4dxvM1WxH zs;sZlY?Un$>{sze=mhpdUOGqqU>taERSU3Rs$hj@@l7D_DTQhmgT>!Y{c`8ju2Q!UjEWMk#7VL_ZKE`a&jCV!SOrrGidOe}k;^snQe4vkzT z#7G!S=P2I#rpr%X8cBT_wO*v91R%8}vzp7hFk&Mv)p>1+XnOUXrR(D=-G%~D9p6$_ zpU^r?XMil(9Wkk<6`ZW|tCR~gUha>(5*vsDC5By%99HG6Sz?oCK$$YushfxZ_;pYT zIYzFrb;pxsShVNp5R2%B8gs8!)}MAiq<1O&>3t{Vv(LJmy772Es;%blT?^s^eZTms z^j&Z5@_v0iapT9iE;O90f9vayoqE}zi_5wRL6C1E2SEzX9LOF+n)P0!si?wkAE}I{ z3Nc8LYNlBOMR$Js*Yen)`sY{)jRbm`ruH%H-J2dfS8q)q# z=YYO^ONqe)4<&M#<*9lYKGz<|Rcg_fCjj_v1G=mvDai2K=3M0s@8mF273E2cNjbhX zY3oA_;Qcl8BJ(7CiG8p&EL?E}-6io>+n90r2Tr{QbD{b&vo;9M1slZrjf$n+f-5sQ zDy4*>n0ZQwSJF1*_o|Y?qV*8O&Qu2uX(#kBSI}@t&C0D$=JFDtkLvX`$J(&TgUxR!p1cYf<;eU1 zl9|OI@kx~e?&QPeA3jgv94O2PX1Q8<-mL>0H)N+!WJFshDZa{baMo)1N8etvP_!q< zZb4W-pLTP$+tQv~gFwgXG{%`ML)#Qt{j#eCf7hX!dU+|VG19vHBd2pT^6)ICMx4~o zHyvYFCR5^>mQ1gMwA`~=8S0Rn#rD;z#69elGXF2x4H>5m+eTm(q$0t#%86Lq;R!Za z8BDP9tgYQoxf>?dATz$wzWk$l3a}icqD-HM%6b4S)est3UL|MM@<{dr$m_`osb&w- zV4t^o&gJ>-?8=@snbXeW`e;E(Q*Px+#(J#j8g)GiYU#(9f>ANR7p7Qertb2OJrP}g zb8r0S-uMm0`*KpeTb~MlcN|iK>eSpsN|C`itE5#)U|Ff;cxW2TFRI!|rT9yYXGsb~ ztV|Oml98EzV1yIulBH^vj$H<*48CI(D~tEKv|a(`Dy+AiC=95QA$=w1yy5Mygtw1K z(98tzvDJ0D++KT2y4|cO3l-3M7OG`+3A!5~0;`HSfdi6(#{^bIKpea)Prr$@UDe#7 z$X=FZDS0vnT?ETk6$7Z`%;)Lm5Xp2-=e6AHUnoGy;e$!KtA#%SjB}v)>7rM&7VIlAWvqRV$0% zL<1LAWw-}Id8y72RzfMMMIxm%9fE`avvm3)w`)3u7crQo%gcGKyZ`fF9M4bALEe9# zM}E-Xb?dQwxd#7(?ym3iud=sGn(kz%#;#XM$Fl4Ywh03dNa?b3B+PmF!xg~3mA{GK zhera4mBE(`jN}Mu`O!>zCY5IysKG$GdOn4kp`2BXFyNq|?f@yqm^c~Q%Rhb)yGXdc z0Sd`iW0%q)k%WYkWMmJCi%IUsL6^mwRP3!Pd%y|Bs_nhPR;N0>)=%e;Z2QV^0D6ASZ2}5N%M;sgQwe1`0d^?du$RHb1hJupO3^i2wN|nt1s7A&E zt@~OdDf0k&K!v}0v21sWBsAG32iMeY+>DfDB{~_?R{T7tKvVU1Q+l4JoLcj_^(<+t z@+O&hE^bMl#8%RC)d?Ns6&$bo%zWaDkGl<3L4uWmza-wP#quLB=GUKIA3ZqtzV!e; z>YwQDwVAGcd|&wbcb->=>&4|l!pS=5Qe)L7clIrlF*#aoow%+{q?73O)Nvb3szo`9 zgs!@Y4ae|DQ^XeoZrVFG;^zjp|x%Wl$SKB)%2O_v#vw97yFxUa}-kV4*M zv{#tXq*^kKyq`mFY-73P7D@Wq8K(meMO8=(%E=f?!tt%aRQ)yz45535pOJ5HB`bHp zkfjBwQqU~1kD{V#)~itiI1^wyvr}3LVt+zgU>zi*qGMzr_ zFnmQP_u=Vt&nhXN0QC;E%>mfm@euf7ex#L(`e9YT&C*a-&|M2Q->< z1gOd*)yI^MHHN%ljZPs!uY_h@z%Zkc{SPWmqz!(ajasEF6iFsfL@^c9>ym+g|Aok5znJCljQnri!2Q+jjdlMMSq#~tG1 z`qPhR6msd+fa74@=rAla#?;k&upMN7-1a zj2N>z8CvLlG5pR;5KILt0^Mqm*x;S2Yc6?ImT)zzw|<-#XZ5Ym%(aq)Ng#8EIShFh zM)r@bllh!Z4IL5+EPj(?cwWcPh?bIEa7etDlQD-j@VFADVvhGfIe`8;7gY-ao>U=B3K8q1TLz{%0a_qsW~k$?jgWPC^gEXe)NG`&1>$^u$;`Z#F4e`#JrC+MM3f+OoQk z-))2;u1cg*gI02~-u9*d-RIItabjJ}HOmg$$WzivirlHzrh=}ScEGoh@rWW_2GfNE z_bqaBhw=72$!eDMKI~G_6u~{bq`LTHa{JNGJSC5P`++j?jR*1ZQ{!~6Km4NB*$ic%nXO<&$h^(WY9hoYTw36Bt$aQkO*_t3JL0Ry^PT)JH z+8d+V_j&oJ^%RM$q;(go@=yv%PvcWwBl9M#N~`|F(T#-;LQIP-3fGVdi2I6fO-vVohb zql_+gY9=9oO!x@1RR9WMhVhxe$j-sY2#c-~x z;Ec&8k4D!vAP6SIV=S+9IKYQ{UHoD<)R!vs%>n%V^dj z%~0LBivGx;C#$e4sn2W63YCYgt%1G($YkBizj&vFs$*etxLUhL5SUXpSUO_BD(=n9 zGrJ!A(sO1f=svwSkU|5G-nV$`_`yAaaOXhX|vP#8@*e+H#@-88w)xcl5J zW3S_g%fED1CvV$S%T}cmTKOrsLfQj_%bFZV?FfR)R@cg}Dgqo>=?gnwHZJ-}K$dnU>_S{*nG{O-wa)5#>zjH<@x+{z?2IGNG{;w9my zzEL(E;iu_lHkQl3atx44i)_GBq|&0Jh*d^AV5x&2XM!&4GZ_*vq^!Qq-xV;knL|sG zV6p?jyop{$E2jFhs6ht5X;x7O>e#5UuL4HzcN0P80v?YoQkWubmk&F!squ zvub2?v~}kzRT;hoT2YDVvbd6Yn(hl_^2P)YN6zsQl2i5&sSSaoo(ljwI}xSnbmy(e zDgm};SkF!Jd*mBZxJ`t2l_9RnzkV0N83%AUz!w(IHdFtQlL#m=pRHrbPK}+;-UtQM zpS|Tl$RNy+tI{i)sa2Sej_tDo6afxq=OlB=?p-V&9r`al#$aZ3%xnF`<=;3r zv9*&a-H|3vV|Er1%VK5r8EJYf=$=T|kpf&HF(@)h);;+u(@IE8*7U@-EDE_u4RJGL zK$^|3AemV45Q+FmK6x_OvUD&BJSWvWd-*q?yz{j;=hol#=hnAAjrg)2j!1sYORVCw zT9;gh3WW(r)z)B73=lEOnRuIbWl0*vW}c2HPN*nQ?+_vwU6C;^Awcj5zk;0_)XUU) z#}a}aRr<8d<0eZrp&7p6lXBCqUHmy13Fn{j{4O0r z3qU75V&Wy+0I&y3jvYj)m9O5h2pu(9t}w*Y7IplbLy*>)s-XF|j=GYQqWG%Jud7&X*7ZDCb2oVvl-?K;KdovhQz zhQItf=Wy08nNoqrU{}sZsYKVojxK~C_?L9ZO_3cC7)Z938NkDfvu<3ymw4s(Cze&N zJ*iu9$T5`Zo}@sc1kumQrDwU=iet{U+5#(RD7LjP|L*J1sCq3-e&ffv+Hybl9vZy= z!Ti>H>*=??`R;p<#dnp>djhoaJtQf(@Yr%pa>biAU9wi^lOgTuWrI`!%c`2I0d8cZ z0{|-}D#&<4x&g9aX=W;*yD9_uBzzG((B;6PJSJ4T2+pc8_YlIXL2lw8xFRn?qP8o`M%4nqD#WDJs38|vb#4}SfTTe1rMpIwk}VDRM4j%0 z1pnCVe$1-ey%xy?Ha80di1qY+PuU53wuBe12_Ju`F^ zl$Yf$P{8Yaaqz&69|Sve+4zv=NP?>E%`%Hm$?v<=Cl}>;hOF9rn?gMIUkggGIrzGnKkf(s8XG?~4 z!7~!~$!OBws00B9{_^j?4!1X7j)T!hN)D&aG9XJk1+ypcNRp&55F#+3Ru!Ja-!+%h z1;0*7mpw8M%|J?FTe#$Q5lFk>(*hw zW)hkjhg8v=6)&1xekP1K)i?lQx?qMF6I#nA)1+W8|G|@Y{**Vjao_c~akrL=f1_Og z#VXg|T0H!_N6S1_9ese1y&Gz72Sx*H%7l;UXsM;edSyPR4pFtH^8;0Sb`Sl!#aR%{BTfxkfKOdI5<9ZuC=4 zKUFtMt7YX@5h=MMS|xHQitHCxZ$a*n&7{Fxz$}YAA>(8Z1_MB;tqQdk+0yBX4DKfF z$&q?X;NqxK9`8ciM5j;AZhyhWo$KbAwPFBb(A!GXAJ^Ryw>}zwTmtgy7WCF*_Ssq_`B5#B{3>oh zRpKac0*D)+YL|qEHn3d1S8?~S9mH3b$Z8K)s{j$5NaMW)t-@?$SrDcw(?YcbOqGH| zoR;;|rm`TK$;bo5y672A0B}_RC_dRV`@H;zFYlQy9geQUG*G;%n1_LtwA>b6b?8Q z(*TGeTqn?5KhC27=?6ag)`z;)*Ky!`A3T;kz1&*KmOaV77XI68F6^TcC4$S^+e63q z$_8C+KUTiHZ5;_0smsh>17t`X-)E+5GxvRVZ%L7&%}HImy3^@_O$rNy6_81?_kgdF z?1SFvPQ+fIu4oKvXygHwS5ETmn6|dcsZt5*ekBRO)+dnMOD32!=PCmRz?K)h(T@y0 zmV!pr*6M>0;PQ^pcYBgx;2*r5AE_SYn(N?n>&Ll1*Zo`Rror|G6&Wv93%#HgO{XwU;?8tY;s8@$>@ayKX?wEOhZ_7)vlJatSTj7d)74r z=&JQB5ipx%)cQj2^ye%#yL!2+ocHtYbKYlt)3q2^E0RTFv&ry)u)S0)m9ou3gkT!x zY`Io4@STy@1*7mI&=h1Nv}blp3=c70CHI8FzFTudCW)QGt1gxwlB)kg>K@4jv&C3cD_k|K2;d?pdf7Dfl8kQ^eA zd}cKjR-;Pf#17QC)+~z!C`l`R&JNXmo4uwd9p!Gy_4)BtKh?|J8g4y^k7vH{m|n>D zg;%N;GJ6kZ4Ay(ol{5itl@v39kJtrsXO zu!c2uD59Mfprd^r_8@1#L?)xw(~4Q;fI-Fn-Ch2pmuEi4kUSB+Te2)A2ScizPML`$ zlX+lT*w7@I?cqYJ+fu>Ds~*)o8;Cj;-V$M|jwyn_SA<2;)AUS>w}NRbk`jm7DbX*#WfnCid*#Aju$UDd9bSh8$f*0g$9 zq~IWR5vxy3yOcB>K+v)M1cq8myz(R>OC^8F(b-&Qz+0c1 zy*b2tg@<@V5R+8~CguW--7MV!;Iq0LO(3BSgxe5-7<%VB8hP3qNOqLSVQT~(xN6qr z$(%Jduto$CswRnaJi&epFR&aMBmqvo%&JO?GQamT_NJdw%3s!W zT~s8ih{*%1*pY&E^$yp|{klNRc(_&rfYMc{nPOhrEscg3G=FReL zcxKO7;x^xwB}$#x;JWintdg|EEW;Fl8p^p+Z2)p-T+_5d^0Mr~4hV z5@BXFPhM4|kv61mFlUiQT}#5x4pP6x;@NvFP_Qhpd4hOSAYgTJhz~%hAnQ7xogCz$ zm}=OR2f&*XyH|5!ry?OZ5j@YOt)qO_mjxoJ%eytU9RU?c6Qu3amQ|^{X?+rQT?Gh& zf+j&lQm(aCIWYLPWlFC?lQb7E4@FFpl~RqEF>}XZrmDrrIQ3Ikj34^gx5wSPb=?JD zUsQRVq=ra@6Wp+lt+0*kf7~3SRw0Y7^sppH;M8{EfN^AmKn`(0@g?n&NdycNpd*=7 zL*QR#1?Q!fI8>ty&$Eq~A-$?1M*s(I$$U@s~D62 zbk#}0r72smcvyU(ec-x;r3MJMH#tNGA9Np3CF+vYsSRTwu)>;~KWY-YGs||)q5?7a zDBFJ#1*A)qJ}w}+^J8+)`!Rh!iIA5>q|bBK`h)j>`I4Xg`7bI(f93~WnF-2r$mcob zVz){!uma$wN@%kf1K24CKs8Cu8^>P_W_)FJQMV>R!tK53tEqM@dr3aApu&d#>oRJn zucVijv)H*A(vSkakv-=r`-$tiG|`YnKsiCp$ADd3(?v1R+$(DVv~DLTtwgnN)a3!* z@HClDCizT4Xa$0bx|aiiITce03m}LURK%fz010P|4&ds9uApXK-s1Qu@o?A6^T%Ht z(f01M{*C^$w~y8X#g7}0prTlzVP+$oTW;0rIOhhY$rMA;XSdy0*m@N zRU(df_)-h%76PhGiKZpq(G-{(Tv4|y_+2S_~oy8I`vMbG$u`ljCJyR6V93-g5rb?AKiIqu}<3Te2(Qd0< zAicFB9VQsK1Q}T5($?y+lZ8x=uq$w*E_u}ps|`^39uG~I;mwJN*T)A0glg3HUE%mL zNr9iho#mxoWPoL&Boqbu*EUn_B~6qT$vAVx)P0&F4~L`1&`o?t6bdD6xSsW0;9aT)LxniSzYFrPHL z8jxYPuKNZcUTp%!C#Xlo6;k?eMtXj#nv-f@jOFs59ahv_BS;UR)e<6*fE)250N=n_ zDekGdU6r%;K}1%c^co2$SxL=6v+9>x+b16tMv@RAx;fpwcA{vJj{~1A=V=R&=^;cl zvlC1wONU&R)z?FGG9basbLOmkX!||8qM*LT^2K}NnY;w zM_VH%?T0Q`)GEjfOtz(jDBOy|zQcvmj)9NRmGDsBR^7Z#I?xL`o74)w)f3erJvO%9 zgKz2jYFQGl_mt*m)Vt2U)oL@Zy_U)&?_*?IeU-VE6>9#}n z@)}Ef`WCNiEbqVi3i3p4(70fES}*#Vqb}bHF`P#e0j`_yQD<)rbRUh>3A=xE{UrBPZ+94~Z%kMlViDm63TWk2BQJoZ2XZEG@stg+>m8q7LHw!)avSZ1s z)u=fgNy^1RhI3FIsKk&~$L7cOWOdsD?=Z%(n2CP;)*Nehgj%zr{-gtiVaw&ecrCo| zewUttS=u_%;djc1T2kz5-UbEmf96^l<}hfkMAzWnZ^R%@ix(j71>LrgadkN3$zPO7sr zIfDlQq@9(hi zLZxQoq@JN}mnb7*k>+UutI^t?dzL>kV9e<9RX)QyFdTkf{;MO=#XQAHDmH2d0!F0b zwV}JtOPOe0UCFa0#1Xc1eE^2UrNQ@3FiG2fXQ!J@zz_)1=)g`2duk$T%Xznq=?Ya~ zi4Hj$N+*Gt=VPOh`S5D3YEARzfJuEaa^bR3un zCm?G*CD6>O$=9?5`xA-@#0$QAdELNv`MuATRJB$WqzYrTr%!;La`|uc6hyH+V5?F5 zW6D=kP8C2RCdA2oM#4GLL0{|+XhM=dwA#o*Y(+i1tSDeF3pB`iWX+sqYbuK3U8 zcz5hrl?qI!+aq|tFDpb407MG*L26^Z0}E9h0|sOb1k>4CRSJNXkp@_YAP~rg^qoSA zUCjyEOdaFz2|fkR`WG)#-6u{>TUzJ3&LmK z$M3IaUtceuRrpOEE4S%`vu=x~w+4LxOGaZrja`NgQgGpM*9z==m^z?wvk?nOB+7ON z<^tyj?8E=Va+&33q*f$Jz*yCeoyIAYfGU_A)!URqiyYdg`XB5m2d8rw*&~Xor!kIEQpwqhfQu0tts1F{<{;jbm7kWu}+;> z?fBk!(i|ZHgqJHpydMFy#^YqwNRdzi;gx8yRiR2+th$sp|hRD{WU;g_eC_2?Ulo(O+vCk=zeOa<3v7loBRmLhG@q0J_zvaLZ zTQt&8)Iu6fTRM3QpNZNQqvW0JR=k!gq0AH|_249X1T$2B2P102Tm&_u-vT{Cy>oVZ)%duFllEG4lKzYH8`@3Y-?bSDy@0D)ff-AKUS;Pg1g2Td zNKAKWvY!i?(C=Jl%El0P>MF8RkCI?v&HM5{9JtKnO9mIB-TZ0Rg~rX*WuiF)zj+$5 z3JVa0P77&3-;)o)05jD6D;q*Mg<94-2_?x8sC7?1301Wefz>oS@WQAqnuS%*iMyI7 z<__)hKc1)Pnrae!cT!Z9KdElni`#{5&&(1Cj4M1;^ry-_Xn1^((Qfy=kP4h*yK9kl z&B^y0;CTovge$0A3uH|2DYmXo80pj4D&X>>AU1Wv&12SZg_}RbLv)i z$N<<%@L9JMCU@v8E2_`342Yh5m^WOLaf9-a1?3XRY)C&fS^=ZL7}U!3cT(<>uFq=I zs0V*6H9_bl`M9lupykhX3=lm@A$7=7v8WVcN*jo0-B$I-m;dFsR>FLj^jc?0s!&qN z@K*W6tiG!E(#HY?m6qr^G99F4*`7}rcS>rUumFlUT%9ruREvz{^tB&(i#sKQ=!s2#C6e*ptBsu!196o*RHDBV*zIdPYjq1)rY(MZ%z`^DJI`w601*tO-*LdZ@ zFso+Bt6+3&nUDf>)tT-!zjX?78JR+gfDNJpzcHbOXoi0lto_w&p8a`!> zO5o7o^x8=mk`tG$ho81w{_o=>+7_f*$I;#K3#^LVx~&p(R^5kMQrYA+OGntsncBES zkc3|q=%3el3VTQ4W;aW~2l6wDR$?9?Fn~AYZrLMbDW@)FctU0(6xGJsx0l~@cWw^3 zxA*#Bd4|vibF9NtzyX7;V9K97=s_AmUHutQ+9Ro7?MQ`S#N)8O%aXVY|Kk~DqGWw3 z3XgE%U{r~wGEu5BC@hsMwZ_asi1M$^m*4;7uDL{;NG0b)EQnv~EfR`Z>L92jSAwoH zao>z7lVMUa)L9HTeaqdKr;lfQD@L+fylGO1ln!+c&3N%dR!x+hsw=8OQ9-U$-WpF- zE`Q)|EG#qT+62#$Lz3>oWm2@KiaQ8Er*aycU?6QxXa5b9uspknch^|BqdO9Ikm{iX zRN3cy>o%D%N_u8h7DBG&(<3p1XJ+=RSH-WZ=JE$$i`tq$bX2*glXvnOM0H^*W`xNr zd=IF!n&V!_uG6h!l&cVXG?LB~kyi#jk$!KyNVw-y z#5|&UZUIz#=}=k62TS5gRa36+2&otvMZPH=OeG;!l>~OvU{itlh~7Nlk};FYLfBhc zGI4ri+tB@?iABQG+blEY<(EBu9jcvvxt;<{SV~bdajL@uaR&mH)emtjtAt#G*I5>IrY)xksCXh1sx`SA4^{({ zr+6SlHnKlSQbpV4^5>m(LB1rrIoS&Z$jTgqdg#U)($phB$&dlarmJN3DwKgGHJt4_ z9Z`$6NxGV5cd9NqYHRtFm{E0MwL2V-tRlxY!sv`QlYkV|-GDJf^&JCQKt zo5bpp*#xnf`I5}Z$TH2VHC_Jv^Az1OyHZB6GFS3vE{ozAh_rQOoT$_04iINOkZrRr zXhC*Ml>kl$A6X6Xp@9$;VY=KwVHUcHQ!%aea)}Bg>A3(!?0d>Osf|BrVHp@1}p@$%i2)yFmPt5@@SHghjb=0oI)8D z&?@%?4#)^XpWv+!>eaL!KKy&h;hkdml_5?Co=x`^dQS>gC0e$r8QYcrHL-Yj3FHw(e3Z-Pj6D%te#1D#sg z$uNQS4WLSj@AZ_`OJT`N=`PJEx%Mi$pss8K`X~Mo)~$3xVgnKoLZ`qE1SJn$_=Dn@ zw8RnyLP#_UwrBU{*D8i=9vK3!QsC@i!8*(Ws#)3gDaw-EDsuwVVUZi~Fv)I{7(}n5 z<W3wQwE^eMMv9;j319#Z1sFlBI#}jovtFN%;%6XwWU3}?Z5mUS zh^0VxRhAg#*G4{91724{%)b13J%uF*8?tPN=aPR}%6tOvDNVt!<*e4d4APcFlNMC4 z3KN4VmX3gr#z|2^8!9T52)6JQi4vgVgNOzh4TO=&Uv*USfQUyY5o9=SHS_Wt^b`}e z-bR*%tZt9ssW5m|JE(A!2iRjNwX0_>iC0SsG4oX=^P#(XTc=KVg44~W9S(%HqDFm7 zGcy9f1qot>i8BH6A!K218N$^Kt+@QgGb0}4?-)RWELl4-A(9=|ooZ*Y8vJF5wvME3 ze=w<6XB=Sh?7ZBoFxCKXILG(Gw`43icy;htIKp9GyjYz{hq-yzNp4fdKE#b|FTXqf z#O*c7FTX3k^XI%mm+bp{hwoRV?A?EVS|b~nUskmcsA^J3csc+8Mn)-l4g=aFG~@!o zVBtV)r2A5;BZhb-O*=**QZZZ%A`4b{U8mba72_;Ovv^a-M(161&00)FKzC1l`Y z05C(m3arFPy|n_JPSO0)AZH1=42p^lC|a*eMZW*Ouy}v)jF|tRpYFzE_vp=yd#fJ* z>+74F7ry=qx|Vc=NM>WJY*z`GD`7~>gfQOhohfRYX}ZgAIzH2Jc+M{1K!muiZ6$g|$o-*ugqskYoczWCvSw!O9+_ zL%h`7Vr3RAcMzhl&gA!2F@^30fUPpj{O{LUDv<*Vt^+q+mO6n}2WkmF z1Z6|eeUkt{li@mu3~=am^aLgu zs6GR!4k$>$o_%gkM-z-)1fv^O^$Y{N7;;>-+Gp>z!z|!wUJpdxC@BVbgCGJ(hsjvp=}$S(6sDp#1W>}) z$rJmk(qy3ez^#HnTGsXW8bRajISV*qE4egai(4UDX@_m0JR`mT(4zWtu|JLP%>_6} zh>lVZsqp5o5A3d9f)bWX=JcmN<_kgxRI8t=gPA&^I;iOk;ntoHvD$Eq04@Z9jXjoQP#|wp720ERK$>or z)J_dm4Dt|Qd>%UL7HTT7C&jB?t1gC|?vBPQWl@@2M(n{he2{z#%okfe3dAbMD`MG$!ov6*UuDqMX&K|pZe+-_mEv6Rn;OvrFuu_h#Iq| zgWA`4a9(L;Y8WKD;fjP5+XzL~(qR;+k33-zO*-ol=j@C#--$Kh>7g}Tk36H5* z7&dH5#}@#_ww?a;gL}hJr2^A|)tn$s<2+>17V*<^vN^u^2+kuO56ZmHA z;~S40Cj?(|ro3HW8hC;ApZ?4PxmnFHuHa0s{wUsB#P{c+q5zC*YfckOnuBLc{8EjX zQ!WOQZKS3VVo*&fMAfhgW!(zQl8@KDNH5AB;1pH9Ww6Z38_->12Two_x*exK>+Yh) z;1}{u!$WO3SBk)rMx654NiQUEzNh6>7!B@$v?g$f1P}^_*(`sFJxSnuOgq_^sTz>D zCK%RgZ1nNZA?`YxHkPV zSes^5M?Ry|wJXBv=(fvIKcW{n17aRnrg&V@TNkV2`6;Y zeZrW;G%c_QqUuzdgMU*^gT#CJoV0^nl%}g%fG8wXZRRC^Kks|NY96z`SN8emjdxdG z&THVx)A!$RAIwX6eO4w_S>53;;!ZV-wPe%cl)jE+l_8Hl?>W+O|4Zz^mE@yZ29lrE zQvg#@HI0FGOlU~Kx$sne!D=8(1P-V^pjy>H7Fv+i6t1g?;MeEwuSUUD@9m=wGk!^J zdo8r)flbE^pT55Fa8^}RcEn_=ngIQ>-53=L$DzSPyYU!csG}p*sf-Bj5Ua-T?0INw zS9Llh9($@*YE{+6y3?P1@QqfgM3{M9E^2mfGnx(Ok2?UBb4Fm@@ai{(XuFIFtMDTw zwdqw2xlU2J<;DMWuVl96JRdU?A(1odHeZU)UbC)>>Ub)rL03c2BJ0BG&pGa`)8?pw zP{EI!j-;u)Q}YDPfPm$lj+>N}aMRESU6j_+RjNzmx26C9l82scl@l2(E@v=8fPr9o zCP7gBQX+eBR(W6%a97$aTf+?5=yLjVk4gf(RS3M!u3lifSUtuHuF#xPRu2A!_U^vb z@qCQ^Rt<-%dl5ER_RPAPaamEZgFt4*4@S-G*easz{Rm7fTzx4K7N*3Satd~FGIBiq zc?S<==f^Y)gyoLH#A2il8VPa>Z-S+?pwHA52`>clRe~Ld>0vm>=)PJ9Kvlh0BY>ox zxa??AwYWjOrvo=F5r}Zq4j3WSpcG}OIi%B{e`M)`QPm?SSXwU*&x{Y(Bss_8Ma>nn ztL`~f463Ve>Dm-55VVi=G!UB%!A&-(sjRLxF@>etfMXPdt_Y_KS$($aaR4zcAWMB@ zMSuDWjvEeL_V7d*vZV2en30(n{X7cgbtj@5RH8HMk@;c>00<{o=~X-o&s-%-44gRA z;kcd`rBrW>_-L>JfQ4`Ot84VxWJ^7pXj+$m0_!~eg$LrivLN^AFS>j0cf4`LdFA-` zB?A!WxbxcR;aa%!+A!dTN`AUg$+?8?m6vmIe}8G;KfGMe?;e}#UR>B_qpT~|yPQ{o4{Nleq!d)c3o+O7ax_xD6|2r;;wUTr76a>& zl<9Hi>+48BMzGW}(%#aHVRp^%%*`0p38~!t7`r-wL$$dG z21}>ERIA`EEEry=A zs-w$c3{AqF8nH6GnwcE%h7aLXVo^~yqUyb<0-@>(JZh|i!k&ipsP3oawVYs}S4XBQ zb7DD4cI`O*<;N-t*gK_;Cp3pxoBVV45-SZAoCm6kD(Q?sD3gI*QaO$qLI>BFps|+J z+8-OR;PK|gYdn&=ij1yKWJW4Ek&u746C5{E!bQZO!u^m>f5mYJq8`PxRKcrCN)5Xk zQ`!;3ETTp6RUzLKNPx{wQUE(RQ53@~k~VYTWvS4F2vSy23y3RA)%~e@z^=-+D_J{5=N!eU3x{mbq=;>oI>nmz(Z2dMSV&M_YQ?cshl1*W_8{Q1R+9u;U4m0dfr4+#TjSdf&kujh=Y+ z6>D(nF$}vZNzADkGEKO1RpoS-YUcjD=yYu!elCS`<>j20F+dB~Wf_WqpUWaoBFDtu zByIktwk$shm~3sYkaqPmc+JXo+SwtU0!&zy6@6xc21rHHHWE4jV$H`v*)FSQSGOb% z|L4IVim**;)sC>C_SHwO)hUt`+<@3VnyODVvWxfRa0(y} ziO-pXQmHdsn$W5N;bnKiHvR@E=$fQ!i^1pcw3=>7$PVRD#!$y;5+I7eik9Z-uQ_nX zwe@lT+IJz(b7tk&Ue1}7|MCaV-oJa+#;-$G@7nWUyHu7x6#s~RKzu24@U8)dz$gG? zR+LsZeg<<&IZp^z!s4!II@!`l8yJ%Md7H|3x=NC~uAoZNKj4id};fx zkR`lX>Id@;Yt%s+V z_EY7*duxi&QZ49E*HN5+!m){IJ`nv|K<$)vNS%qReHg2QH(s2~Ri$ko+sjw^$f%iFkmbtDIoHU2cK80p8$WRNGV0mI{&5dJJ4q~QVnXIO5Sm7t z_y{0<0>bhKhkJku3zQirH3!H5X4o|%$-;HPNBK~W1Wn;#;D>4sQ@>u;GXq?6hDZyP zr>cURPy37TeJ#czU0~J)<(}Yn>2Wl*%5i8jBxP-BT=tm+yVvHsnyXDMFn*~0z$}SK zD3egD31DX#{>Vn@MyOUfv?ir1(WeA!G|aOR@0|z>A0OlCuYWA=@M1L><08Cj>{(Z` zu}Blv9@4Suv}4n@3OL!=B!uEJ)Kf^eTgg2FAt!-Dg6c^vmJK|?o*VT|`3Q!BL-7T8 zRUqO6dj`)HpjOSF{)TrU)&6B2#mVQZ{6^zIBwOeCuUh+weGmwOoR5Aam7HR%3b)&- z#2HFjN~*9kHo>b0ylQTI^B{O@2nd}GwKbP51%#%4`n7Rq#7T{<0-tdN3!(gC7gIi_ zZAg3Q_x#*@f7qM8zfisXmRXtEo8d%MjfY)sb}iMx=a-aGR#6SgcHU(*qK_tPtt}^( zzjqz03JXZSv2Nl$m>~z1@GgmTVeN3DtSOuV{g7p^l9HxG*?A(GNQ%qOe5y(~H|{#> zq#jjXQnv8LOPN(dDv>2>UYp^?M=8YOABYCT1xzTn<}d^3ASTn)_%_ozdgpPk1LwJ< z9)a~~VlJr0Yf$^VoT&VY|fYJach=pyse2^cFk?-EQNcMrg{Niq|mDNh`;**gOsA19ls-w5xPVH#kQ zAlcA<`WxScO1|6u$?g8+c7O6k?@ugX6noH6a=SBDwX;L!U#mqr^;-Q8NF z@x>DP;z?K`VO|ZOA;%+JBuVrubt4~(!-c4J9=c$+8pWEVR%n`P!IPxBVlLtIH@yoP z>hml7D=+7wt^Ky=AAWH6^69guaL)VD9v;4TQKenLKMoD8R%06!PZOH})>8Uxd#C|| z2p|f8*E5=s8cV~otj=+W$HW9y!q-(tBB^-%4D_INzHM(}zhD_|wq~)086}J@37Lki zdjGjz<=Uy{Tju*Glli_jmA*0iH^=PX`=vKdc>rtD2LPWyV7~}Pt<_bN5H_#5R;Q5? zQEH7%b?YvdA@MX-&H+THW=Lt^2`DFlUvXPoGp(es&Uw&L47U#J( zyuY!H8{4?CjW5bJq>yHU)%BTf6+y{7va6}6eHI{MRd2+L>I*C)6z+xw3wA$^E<=U4 ztMuoyW;p^mSLm9v0}4}ZbX7ZCGD`PhyTz%eiQ4 zzx?dOhZpPa<^99M-F$j+M2#-A-9h={Xjz@$n)in@Y-)Pd4mZ$=k;F}h5lV3v`)`0H z;E1%iZQNGlt@seoF&MhJ-b|3rAQ4s-J_YM?b;dD^#_rfWSa7hSp~-x%Pq}st*m?EE zm6vmIpTG9}{{81|-_83=EF-PT5#)D_NtA;z43LfrBROL!3BL5!s)oq8BSTQZpsQ=7 zlv`Pq3={`~FnT8;krY zW0CK`{qVV}&y|;Rww=HD?C!e_e7D=f!=-RLoJQbB1N9ASiBCR$94Z#qffj(cCtN;4Dm%Krx7cZhm_P-$XDEO8tv{hl41Dv&X=6zz&;oCk29 zF7bM1YcS|T4?OYQs|0DIX%Hr%O4pZQl}V&L1fB@FSoyH$luudgs!1;#QCxbFdbh{* zYHD6JQXbPlMwYD9E^t~yE~*!*Q?-=}fBMc?lw73r)8mSo*UGyNnq}O8yvyQTh0EY+ zS*q@)f#%$jFl@XSzJJU8`_G;}e?fGG4^zVg$9i!I z7HAgK&{RoCZ4RKg8HjUvN#WhPi9Z|8z{@}#5DN`G=`{uXl0+tj>dVx))I)qOP3c-# zJWC$9DcEtIlD0@vk8;wvSKtVB_%xg*^O&)3dICS=xu9!j3C{NS+RM4@_%#gl*`?a~ zog<5s^dQc9g1Gyrx&?A!WGi7}iQloBrHOGIKF#wSZ7V&nrG~fnRM7B+aMr!U4prz6 zu5}vbD1~oncMXh?Ujudow|dQKaWzOY*M1&nyLP(cmVNojWM8g*wR*ehz4bWVdYryU zkJE4htD1D9Ic@?8HpOGS2+usG&JdkKX~IaqxS%3Eff ztmKK+RgDo#UBWdbIu4`=(7+HKF=c`!#_4aldk2zgw;bPF%<;X2tU&}jTg9y`0J_0b z7_Ua0?H&rSYJpP{$X4Rv8m229s8*!Zo=c9B3S1mV9u*oqA|92$?wZ4vc@t1&HrcAl zU&H4B40xB2W1XuVLbB&6!>JKr1P&1K(q&x2S46@IhhC0n&8UPOt6DGfH-Hw zMQ>oGrp>_mjsb(I07)%-21MAPX^4;w1rj|Wjo|13Hf;dDwR^+~0X_{-n{5^l1o?Oj zHakVEstK_}((e89m40q~^2R4`eDcO8e{4Q^e*Jsp<(%#8SNDs%^&2mrw@Y<>>zDx9 zVOl*%q+H|UO{z6HgUQt6Zq94EhLH*Y;9x-L3{cEA4X4tSA)ZzeR8Gyino$&ob()RV zaJR9^zb6g_ZDQ(#?zsuAx!zFcCQ9SsWTK|_SuJSF`>ICkajbrB3@UW#g(D4gc$Z@cNC{1oe&a?1cut*0+9-I%D#axW#i4yrK^FdDncCp9=6 zzqvLR-J%8MXt>^PzTji=fon+O4d=_Q^L&9vA}Tn|QLp&F)KcHVfDB! zzR_3sRfkRu%R&t&a>$481OsgS^mp9E zE57vN6|d8-&RDj=M2raUv=-1ygpeu`%ZdsaAYhFa9}^QZ60JV{oyRQkG9vL*(?^14%NA)@ zM+540U}f!?a#@<6Y+#uZ!_M2lQv8uT;>cPE3O<9=+NV7RZ)@6GKXfs1F2}U_ZgH&Y zWzd{MOh+oQnvjdJpZ=~x!9X|J`N&y7QH3X#&8Ex>az}pH0fsNu!jvFpmT!CWK`XF6`;=y?gHu zdE-+g@sCR*?1&bnS54sq%CXi_p=&*=M%@r-S0Os9VNZldwH->Qb-^L|@*+QP3{+jt z+?fhXY7KJ@%V{2-vo6le8w$fquy=5Z7A_{Ar-WAGg-y@?dkuisth1z@VpCKZtfT<% zL~u+JzsaXGr#iUo3xOR?fuDqPfmxE6~eEICdOBp8k2wo+u z4Kz0DbCh=)MH9t0G1HC$FdJLd%~l4bM*#ubq^dF5 zU=j!(UHR_9sxY# z-kRPAfpTE3tRxngZj?+$@=XsjV$>i?up=QJ%yJBo#zzrE)xV9)4!WGHKGkvh``*GN z}CHqS&bh-PVv? zCA%tc zOkh1pQ&9P%-vqI-?a+X$igTa3%T1abqs~leNP?R(e!#~RE9ccttC1DkV#*of%fX&2 z8YxWj7$d8`A>d2H3w?u3# zWvdMX_pX_A+Tnmzl$K{FgvW0CXSdUTBz^U@H;v~(#u@=-m+oYXq~WWJO{!4@KrIb3 zE^hF;H(@duph#mshBTdcTB26Nf7YRq5d$v5QCxV+XsV4{R0V*fO!%sXla_IF7N@3h z@4Mx+>MJ>^wUpNDE?Ew&mO&(|(md2WLTDUdmY2&xm#X#{#n!2MLA-xgvfcQebOUCC z^*I6a2-A351wn%oFc1JAj@)2X5;f^w1<25jOK0m}my^1GrKk1UFYZ>IdaF*oRj1xq z+mFZEu3c<&t9^QVwNKXu%s2f0M)CVHen=4m-xQ{#t#O2%*idxiDz&}|D}h@JLIwvz>G7>{0eqlaU@BKnfB)T^ zhn?zLAL?!Hrgz?s+$XLAAoCo#lw)0q;BQSn_dkS}J+QheNs+q1U@ipW4W4E0Uiht= znmIP%zct*m=ye*Zze>ai5E)U!<-U!^S8Mb%ydEb;l;I2~oPO#KVxqZDpiP1p5v&KZ z)x`v9zg!*vo5#cbt36TIeQ#IGB3p3TQ5yrb3qJAUYKj&fM!c^CNE1b=(rUT!{Gswz z=XCz~f$axjfm4akZw~9vIBBOVZL7YwfTIPy&ob0hpyNY0W{cIg&fh~cZ8-e{cke*) z^{p2CZPkKbdzRa6wA>dOE%yT^%MokioF&K9j6`meZlZ;iyFX+zbhiiOwly5nw|ABx z*#=aog;*0M25*1$h8M-9dlT>oQ$Z4{)l_j(;p0Tx(hL7d5Qq{bazO}D`Ds1vaZ~CT zG))W;?d>WKY^fcBZ55!xd6N8g9_*8WWKEcHd&Lo9du^z>mUnavnvK2&5G)_HJ5XLWE2(_T%?gw*D&zuT^O4|i z(_;_yb+@oDUdh^A`^DXEVQ+l?rdNK`EC2EI%AFlm?LY9p#s_+^dELCiomK9iRqNe= zY#X>Va7QJ;Td*=4B4${d#1ST3a7#uMip-%>+XFCf?~q;Jf_r?~@hGKKx3&fjVZ-nh ze0D!?wYc_jF8376?YI7LspX;sLVjgi4(c5xfdvTybV7yKJXW-c4eZ{6@Dte9PN}91$urwE-ze+YqgkqNc*WrFdfF7c=6c0boJCP z#t!x6wk&}-xKqgqa& zIO${eq*QF1Jc}cCae}J^jtFAVB3wg=pd|=K36LV9LybTP*Q5)v+2SE1T%eI|Rnz3A z!DLn%*$%5ZHJ8|G4n8OUb9u(K2g=^&+y12H+b#!Nmd{E+QA`j7Ydzkws8&(M=DP3U zWz|DRq)2?aF5h?t9xG`sRH(Y^o>Rr>1RU@z9<;ebj=C?P)KZU0H0ni}aqh)Yv)k(! zh1F00@ZCEgPIc4Dx=q==Ri6BaQ+9v*n@(6PCGIq%MS=y=>-TB3hI{W476Dj$UL-+t z=^8)4!Fh>}Z>*d!p96qwH;L@bUGSO2<nXTS=>IZ%Eaeq>fM(=P`5yQ`KOo7EjMJz!UG5?InERh6Ew26Uu61uEA%_ArBvKmJ z1=2>y-s$GssUq6@VZ93Og8H&xHG^;la5hnO8!C_h{Q(j|c|#HsE2b*Zp6nAbdnlzd ztkoDmKk{073#!AzECT4Qp-)f$J5;f1niKNjQs{B%w$|i!tu~|3ZCuRU! zh9jgr`DIYdGB{;z2+A+WRk7PiXbe!__B3UQA{u8S=p06AaqLb#yID#|5Y%EVjw8FY zff&4kb-v5jUe4u7Ami!7!x}H|K70mNx!B$&oth3Yt>xe>YX@T0l(Q-rq9(k#A;vjPd=-|e*dB7v?fkrG!ee7Y~<_)Q@}D}^nP=!l%-hFL}faIf@GHh#nObS zKy0vIc!)Ze0haEN$-~7}@TD}FHrv5*RrcCKff9@s zI#l=vk!(m0v?jath;{p5wp0fpX^`5}KlZ5McAL`n(>tY&IJTy0@Nw8`oe?YJ7ZJh0 zdTOL8Ft(gV1XY;aa6Kd83&BSwrYWzR${w0vGUYx6nwwIAhe98o%mb_n0H_lPq--}b z_PfDcVir4`Uv^)6IhPT*GL{eb7}xj4#qyVAqvrW6)lw2K93io3GBA!px(K^MYin9o z_)lA??gaU9c;g0&^td!wmbkNsS891BpCxUNz>7P_y`r0YjTSoXNG(Djns#gL*9!TVX%=%2-taZROE@anQfMNvp2Brnj zfI*LeQ&QpCD#9B<-6$XmX)VAO5?CxLW4oo`S@E~(6Iq!*!!rTNKwBvU;G)iv-?f)> zo)I43ZV$hHahhg2Dl0RN!3Zbq65udTT;fRk_00A&d zoT$ERAQAz@5oVTRCm*Rhe(UGy9~Yj7mPU!ESco?+Y_L@=dgTzJ#oG~G^{892e7$*n zClG8Bp0MX4sb-kIQ49kxVck%kl9cv}=965PaSUSkMrX0Y+n~*yuh=Bq9b_dh1ONhsP7V!*x zp_i(v+Uax7dk+GlkXO%8^+lLbCyOd9-Qp$X=4w-z(Y0622KKdw%0>ZY!A&ctHnK^| zCFX-3);M`?0vo4hs4||A??fv#UgI3`TzffZoBNB;?!MbzuIC#{dI`}EC!KvZSL#NS0bKfW|R3VfNJ)1TFyf znsgqO2*tnCLLw4{ z4eTEOL97Qg2DSEYjR41VAiNcD2@fz<$&L&j-h~gC884*kx0GOjn(V|k@Oa7*7mZY`(hNOIbv*3xPHZtAvR~PyC z*fcmINCqZgHPaL|cNRhf45?I|6eEn}gH&UrGZnyHnrjtc(s@O3$SINmf?cEY-5pxq zMu#zeZfDo6%J5cYc&jqJRT!(91Mwzbu%<%kWl6tC?tt%5mJDuu$l#Q z!WF7~X-ciUE{NN46?@Dd%&caBu{2^;bw82}*-gVoriE{{7#qIRYt9|VMOSwmKuF5z zpB4$hsX=EfyT-588`0b&xQuE?Y~NC(|j-W2tJvAo7ZceD7{ zB}fi43zA5vQ8zgdR4^C*oA1Dl*2t08Pzl|xo&K4-qi4FXKkR?jVKHpIsTxb7F+}Zv z;EgPRGT3a9B%`vshak z(hA;-qZ>e5X(~IrIF(*$Isgm+tJcP@TKEyb_ZTmnJ%=~D!n?uz>jsTCT*Buf6Knm} zykgxc4CRo3@*3pHns|6k19ru_s5?D-9Mq^>?jUw>;(!PpTo{xu_v-P_)y?Mc90Y!t zy63g;q^axB1<5AksH;**$pgKE3HkKT9?5lVRs$<}=F#!ly7O^f2ZZO%qwtV`cyL7u zs(}qKgQPkPtXlJkf&DEuR^9?95~mhB4yv*WsrBKs;QK}c$(P)Gfk!I0-`Q%tUp&d_ zpF4U%I6-NtG9a3sQ*cDWgzNCI4qg&~H|*HF;U&R)wrjbIc5C*lgbniE26!x4)uG28 z#7JDMCQc?$5ImLzV0b1&UHRbYy=mRxLFEnbf2V)`R#E%YUQtVc#bPXwaugn$7YnVb zL}%W`=&nl#QKjp|!rm~7C2!1|Y!Qp%mu~z!5s=?FVO1)Ns3qc=aA|oJ*S*s3y7`c@ zqN;mf)L7;kZAh^ro&JTpcc8BK6$EqLY!Tlg+$ zi$v8@X(*GXJK}ix)u9=z--;-Ly0=wF0mfuB1_eAZha`sJ%@P^y7#QT(iGc%1<1q;g zJ{wDO%4BdjA_1%sJyZrFVdq(^TN;+a;r!ex+iMps-)gAeW({>xcfX2xtR;5gFb0P} z)9;R6{s{#bK~zv4S2h{sxekq77qCT>h`IO@+}z~cmBp_oo~n&S3Eagq4kh&UJRz!7 z!$*Refsm;i)t;vxuf3eh%=6iY4;PqmNMHz4) z0t*gSiSlGVU-RKsD}Sq%ztzg$YUOXW@?WZ2`D+VOe5v#?E@TX^Es=4Xx%IO39h=5>>=t2cFu^Nlz=m1*)jS4c|evy0-m z&_Vn&WTikIj089j->GCH`UYZKK z&S!C7dpYMNDaycpJc+wKzf`t9M{=oSv)J(tiuc`H)hq-vvY<@a7C(TO$VRCswkU6G z55Iu@G@B($+zQ75uL(XKIFFJFn4ZXxrk7keAXwi>?B`25PnG3jF@XN?*@~y~E&FkG zGi-GPKOn5bsVpWGR<}}0K5id0?`Ysg_nH9&gDr&yn=M3L48-f^YNg3ca7Ytxdb?N@AtH6wZ_d6YfuzEWEOSfi-FMTt_#cr-!H^i+Q;>~wMoR^YZ zc{%4N_1WFC`)8L}ze*q+uh*zznLSPT*kU~)T`8F`Y{R}lJ_O)yw!lctJrN>6iwPvP z@Rdb^EMfH#BXnP#hSHA)Pw?!(jt*G>Q}%+}f#UGbtUE(sk*gQ0)ct3X#!T>2mEuXK z9#@utWoo*ZDs=OGPh14<1dNXRivc?~xICxH8eU7r87-whjeo55ES`v)Bmo^=j@FnZ zV39oh7dAUtznTjnv)Ov=_?05UD=+7jt!?A!%S&6U>&v}>h4r}kpT~V@lrTR&bMv3H z@X@wK3)R~i3*LND|Lm|hQx&@6DvX{l@JRS^=MVD&P%b|-@FYn1#!9JtfNNlU%e2um zPkyCp&9D^1$DEl5QOcKgAsg@0B-QNn9$JXR8JtVl)htYw~Qz-IxZC5-_b& zYZ^&9`J0sNOs=JFHE4cI9}6S z6YtK$wPvRBvzsAI=Mjul?#S zDrtV=<3C+T{Hd>g@j7CaI|iFXolCc(51cv`yAU&D3mJd}KmlCTJSv>abr=H2sjC}e zYn-eKjY=j~!4#DG;ru($iz;dO*BMmk;2^p^bAmd%_vC?p8&4Yl zynC{r+&}pZzWO15x1RjUFYo)`c=_S;_2O5@!~M6u^Wwcf;BgRgt$+$!I6)g$9BZEm z^xq!KkNB_3eIQ~H+Gg0b0pl51zgU7!+K%kPhNWoAFqmJ}%Ext!st)X!0o(JIEg@c& z5_K`0GfXMLq=CTamo+N6QKf!Xi;)9ZbE4DguvrYmvywxH!@PvcIE8sG zRp-Dat7-fw0G7C}C}DB~4MAFMpb^9#o&yL{nr#jbsRzPcp5!?1_kLv(@|9oQ zwG?r$U6y^T68}k5iC?>1_f|dpcB_Z4eTjCv)BDNX>0LWVc}tnT75$huKh1IIc1sO6 zpeLc1u1FW>oRS|NaT;R|ho(weB2}DCH(LF;6jRkFfAkrXRuT=zihZ*UYSAP_Dd*_s zQ8inE!4>MQg9}Or%WXlsdM+;UjvC4t2E6u5do2chw3BlT_|aG20GI1Tqwefb$v@9H zKp_n;S4vi)eekMXu6QU&Cn0ODjTgjE156-EcwAsOPP5kzT4PhpQDO|%SE<#3}sG|_(WM)0ULp8i#FIVfVTU1z9u^+e!ZbumfIaKsbCPeKSng@$Q#Zj%@b zSew;lokbH>q~(U1uXNkjY_u>BJa-&k0Nu3`i(3v#XjOr2bt|g;X}|}V>ci<@J66FC z_AW6tc1qi-9&jh(sbb4GA^DXDC%O#@fFCJ82Nqa(@PLzcon;9!^Y$p>{Mv+zSDjk^9 zzj62GeUdaL0_aAf-@0+{%64d!W8|f3xN|Ja89T?wN`vjzhU_Mf!d9s}is&gg#CZf0 z7>zyKs-;-GD-TT24SR8It+qR`9+N!cb5M!@rR!vD6wZf-*KG>Of?%Hq#~#yZi`VM2 zs%dMBF*RM_KZ@gN{$W!Uu@j*M0$Ovly%YkvQ|hS$^Eu~0Pz%{$<5iNE281@05t`D4 zTW9UeC;j}3Z?A`k@4Ps7O4ojCmpj#kNecgspYckc`sx?=O00VZ96ZNg4L8!2RGlPF zU~DI|*W^AP&uKh(9BtqzY*m*u-v;yAUNbTSEKd>^>dWfpn5~&Dhp>rfN)~f-pkNQs zOPqSjM;{cHvC`?^Jahv?QDmByA7&$$v7GIr5@aSN7$=9htI=jHrNW|dwgd+T&}`4V z7c{iGI&#Y{Vbq(D|61n*Hg+#$S9N@4BPHDW2!DzW$l7zX2qZIe^l2Afy7u%9P4m zG@LK67~a0)(7}*hE^gR%lmYQGPU@@b53G|-DpkU`l7-nb^T=${WTT0(Ryw!^y5LF} z1Pa$V=lmw$OlS(K=NB1QUd|<}`S};)+w1*yF^wf_bLybT?M;)Ry>4srkzTZtfL z*p5-<@vij{Fk+$V-OUpF@g@3UF&R9P>-bo!`&B&n&^*%6h=cwZpsE`U74n6M;j6YD zCOj_OX+GM=qmIsF)uWZy^=_^QB}ic0HXYErFI3rUC|j|~8A1{6U+0e^ct%9gzC`GoE(FX#JN zpGUv=QL_K=A{SD63a{m8$6mpxQ(X-}DzYh)SPLHoFoZoNi>$IWyf^HHkSaYy0s&?$ zl5waG5_z}X0qC!Cl%}7BF*Ms%uOsH@RbH^!+AxDy@ z^tgpOv_fH!q~7o}dC8kC8f&)Gzjx@6-6Yn39EtTNU2j`lFcL?L0k;T~ss*-&G4%~l z%c>ngdiv|=&CLll6M^V%K2^6R!oCs!r3sCz+Ywq{e^NjFkEWHJV}llqOnp43;&?b z168Nv8wgm=w2-z6ZTorA`TO@D+`oTMtUUu|*M4mmGfN*=3zg4sxKDlc3*s>u+MBgL zh%d*cz^K&bSYxlM_r{lL*fdXShf!S6uyn#_Rz)A@J2kIn*nu}sxJw+QR{}`NJXLrB z;2nXw+e;+{SE|Bl+^p+{*Vox=@#{MLG+zqebY^Xq=MY9g294 zC6B_bc;)4sYwWiV zUfkckc=^4Di<*djF9WDf1~Xaeu^Y>1`Yk@CM$E~3HA$u!ib^!Ca?I0qo2!bN9EjO~ z2Y6g?D+X9LuI51KzO2%)j1ZejoU)2LdAiVck4l>3f2L^C4>2|B+8*w_-0{lGIosb~ zdhy{iRW84{8&4lD*1OCt;Q$AB$i!aaZRx6}-%=oiF{u=JuGGdDY2&T%V|G?$wkEJp zBnJ02yt-2)IM!VefSl2emS$fAPHaGuGe*s8C{4q&bhU z<5X!UD_q^iX^NE6oYx4dybT!SXo_WF8w2GusZ(r~m{tDSq$gakY{^Wht%T3$Kn_X3 z!|ByH0$xeFe(5C!gQH9~Z8v@3*VOV#c@(a(+8#CAM060;VxjTIsROm>O3SG;i5)O; zaDri;gAE_zx*+UWB=7_d54tU|QpHdr0XVehmU;-sskG*L!Nq7i$ttQ_?cgcN$eHsd zm#>e9`@5IVKm34@vCc!swO`$}>f1wx&+Hc0h+XZp)0bvzI6Me zezk35Z?5<_G!48|V|fZTH(~5*?bUDpoIv>)uTM`HBonO_Dw()FE|KU*w zP}QEKo-x+I*_w9bW43qPK<7P_tg!eDKHcrkS~_7oft9fy+=ax}&B(hgn}7~Wb0NBM zgyj}kYRa{4sZ$&5XbjaOht2=2min^n%Rc=_Zvnyi8ndxEHX~0k*0q6F!$OD@=D$yAz} z8_Igl;w=%10IC^$D(7TfL{QMyA;A~T%nGzUE9A~xRn4vO6_x0nH54x8q!~sMJ|zZ5 zxo?L%SCP-;&1bVG=Tt*wq`#)RLW1d>CI#?Q;!It-r1{Et`uvrncBB4 z*R4cwH5z7tYn&yFT{Lb*?I?LFKO&`RehaSIOf18>5*pwESDJq05>>7qh{RzmOK6Dw>!?Ct~*Y3ZFtxb zREKz5q~haMW<5($^JkN^x+*XIwwnscKL258-6M{)HnCZidr;ad!w{C6!IbTy{Q$p%xK8@*#=uTEuEX>5@*X zRDwBKR&rm4jC1QiCFzhkk`})}k5@?%I3;Pm zlGHNgfTG5BY)+H`pvY4D)HeZ`lNqIV;3dJ^p8l(26-s+FtQQ!SfiQ{VYL($}g=ZHI ziw0y3Vg3yPMpN} zRX@{Je}DR~A6KF4D~}=Z;ZF5dP1tW*@I7Es=`BT5%}dZlvXh>=-|FQL(~7}?=81W= z!kLeCfhSeg*(<>djI2>(qYPIu;))A3Y#W;mFMuZJo=*SGBZq5gDzFZI6~8`c{(?G! z*oZ(Rl`1K3CTTd@RxJluPtdVN5NhM)OV7>%fWTXtg$Fb%(ka6Yc0+dE%^?*0|3^b z>gN!xv>Uc2tr)R>*`vmQPu_nDpg`9fP!i{#DhO2i>bR#w@GoJxbWXaiy__?b_uB-Q z?%rQ7UP#RA!s@2R(^)kh+$SGY7l`$$VSRR?C4*ljE;fz$=$o)M)lv8TeCQ9tORZ;BA;UeB zw+r*)tTojSsQ6CP8cft(z?$K>=@mYY1QtVRka>qG{WQ@I@IhCi!YRWmp2O>f`FPU^ zC9qqFj?rKd%K^qUDovqbSEv8(;7Ob&qK`HhS}k15=@MBsM#6a(kT5s_L}r{VG+2dm zY@m7}z2vo{pikmu;4r(yjivU2m(b`m?{&Gy4safDXD;>tR8p1G(sYiJq4KBy{;>Jp zEnq{Q26tJ5hBulr=hif073zoSbtkUIA+==lK)kDN2?!R4sL7JW;yoq%4gZ+%r>2pW zK~1WO2m+KRa1gW!)V!J=hOdiybE5QBxb56)fLtME5$wKZHSdFN^xJC zo~rIcrO?fbtHnt2h4&wD=u!@83PQvV_06YssQ&;!aVtBy9hxDA=u?3W>V+PAXvPB` zJ)Zu@<1R4HV2^=I9kS{HqmnRaI2>tEfKwH=Fa z7f0TeMc{Yq(BNo&#;7qGBTYO34e83OUQcy8ZEE8H`2e<8ikPmuoHJke3x_X!jSs{p zfI?%j8#^bO`i#>%)RzJ%uWBnxkyxR_X`8_prMyi@+;-R?4fC0uuKc}*qiCp$5|kCJ zg4@S>m4#Gu1&EkeaCEy%liqkuJV}23P(CmXop-)p{ezlNVI-OiCGO3v0HWpU9X)i<2} z7g-rEN9{Lkr%%VYqr5dU!phy|ZFz=2JZg=~T>;bD@R zM^q3|0jmdN=U8%pa$EbjIRJ87+Xje{*9BuL`}Ds)t|D*MV+)H*B?(l{IUkaDRDrfG z2f*^O6o^8L4YL{@m~5N$$w7T=i!W1&>@d_O(*}4<6=wYUsfI?aLX+OA#NvkD zpVu&&qAm#>spI`jff>zJ$iWbDqz~dUn8A)_GVi!10?d%C7=DFw<&7@i@sF-3$tG2J zH}cUu03TAfD}lGPrTIb;EXot@)BkaIQHo3b=6Ex}CO)jINfkmWp;pNtEx!Q#&_7jG z;6A(FD%c%Y%#--JJIp45=OvD8eHj``3?7>hQWh8qsbDoi?bc8%i(fQCLBlGF2d^j& zr8%>-YcJYN{fll z%Gft)U5qGHNZ4pu?2KxxC!~yOGv?p9-58uyI{z0dLbFtt2y}$RHrz$sd{F^l&71Mv^ zN4fL-f$!kyuYC3CGu?Exhd=uF{HF1{|0w?Ud*GS%PPRIY zxP$r3Ma&QEm2FZ!m7E+91cU(rmF}4z@@LTqRA3z%bY~?*iL)zBFrJs^#Z0S2%>9(2 znwrl7;UvJ_)GRoZp2jySC-_RO69i6_C~)$sUD7j!80kg;QkV+pX(kzu<7nfzTPLbX z4Wa=Shz^?rFI+>gC-NT?k^4&O$lk0%r3I|P5o|gXMa7{WiY6UJS7H3)T=L-;9_}AB zF7f^q)rV`pw~G}H?qY?5dt((2Z@xa-=Rn+DnYU+G$kNm;DZ8AGWP@%npmt?y;P;j& zlXU%}gl}*-%2^HYY}Ta2qS}%KFQ`ox^M4<IF7nEC3g;l{%FDU5zrXlWe&P9g z@!`Xz8G!uWbqsdsQkV5B)v5arjferpn9g=W@PqVrriQ23j`7wa^O|)e5AjP9n6A#_ z;!07GAcPP?v&6!O^0p~L3+GVYatURrzRjyq+Vt|n+|XaUv1zWW=qAL&+4eHiN#xV=*P(0f8(wKo ze~8SwAX;dL2IffAWi~JRpRF!tYBw6_q4X)<*x}QQTdE)q$3TxAUQJ@V$5VUd8kO@? zd*$VvpV~*-{Ft}7AlIAxQ6^|PRi&!AA_0z9S27gzv`rxdSKVCrqFa$_RCioUgeB*$ zzNGF`O5$gHD2DIMHEr9RM-K=kROU>5)sp)7rkB zO===5F;%7DlIA_d05A~rAGYW&Fk}^s$#aQH;r&&92OF{~&(Tqc8eS)h!v z>bjwWu`b>rxT7bDQWD%_=f%S`q0VCfS$*l?Kn!rnH%$v|%RJ{UoIjw&f=bxU+47Qh zm3U}L{J$Cky;S1(_X=dyi(SE;{?Ft7nyASNFxjR)QT#N)Ogi!1AA{_Z!OX!bRW~+! zZT&vCt27gWMCI}7wyP){Fs-N-iqi=B4J%R^tR9W{%1h>e7uM1TyUZb~xCCB6J^f#I z@BM+d3(p_(!t+PH6}#Pd-flc^H=Y-7JjYkRbNuAXC%^KG{P|ZEV?LRIbO3-rf4@`| zV;)JhQm_xOz1PFLc?^o-sC3oEy6NT`O@H3?$iEQ{App4Z)K*PWMK%hhoQYU*tso9- zBVIwXaye3YgQKQXY6edU^x^y`x6cz+*RH@i3&>x4|9(7w`hI&kzWu8H{dHg551fG% zFU~-EBTCbqEgEc5KNJ<+A@U5!$zg_g&{dys4pIfjd#HX5{<4zML`LyIP_4eJ5rlb; zrMsY5?dUw-2EKq(dCD1d!2n8zGUJ$r6S45A!h`+k|30dfOCT(5<*U*W#2xQ@7+qT8 zhTvDae#(4)I_~e_pSr-?&0seC-i^6v)FHea?$wk$TL(xGG{?7$s#G#Ge7g-I(Um3u zc=7C@kT7>U{XcJ^*W0cTw9ZNnxa7bbUghdeB4?0GJ_#r7e6UWJ9{6+-aDd_Yt#B-QOL+ITgOBWr z)z+BGIf(|x4$#d|KmH}9>_XCoD_)vI>L3b&SMtdlqLVbifQX=66(mWwFX~{Z{C*oa z#JYMV^l0Rz1x2t?tGRQ5j;H-QYrMR>|KP*x+e-cR2Rf9C7& zUUh}D7{@!wX=dGff(aMM3Z_I{2TJhl>=jI-PwB~bmCCOyVc<19$Jc}3tpQCg zqZt$ff?V(sF?VU~LAs=RB0(Ibb+e{R`(iP-^EOiX59c_+aG46uobgbNuv2s5+g>@1 zgeOq3Cb&~G5%I|2PB??Zt8d$jL{)agt&ZHG^BR|nxoNtn+zaR1LTJMlvCmF-3OtpP zXVI+lON^g?c0XS}U#}_-T=}iNe)d3mr8eeMUwwD1?~^zCOTsB1{oxa+VrE<#X$8Ja zQKRcrFVv*|ql8AYcD7L{zfNJm76%7ytG>$=dNg5jF%-G7f zOHo?WrS<7s1Gt8YsghV}Tj#9L8t%sQFWY6)$L=q%Ju_@fTj9yLAAa)TglAmJtvlu8Ifk1sKcQgjTCEpldocQP+EoXx>5cD(>{heM=EKm`0%OL7GPycBn_K zd0~S%v6Xz~$3TeD>vnnZH})t+03^bCW!QGzB6j z*=sTnhi@L^vwYVOKwatd_HX`ep14v5OHm+bZ zb&c2EjjPy3BW5w2xxG=U{}37A$;VQk4zEre#5A4EN1X^QHcZ03HqZpS7`eJ;$!l_`kbp~bo6oh<7HG!jWOj>7J}2kb8{+pDjg4{ z%OxvuzvcmM5=a3mXjlQERn&6v(tKe>U{$`mNCq2U?Pmc35Q;5FLNnLwVm+0k;G<@F z6-lZj4i`))p8kZxwBz8dt5*?_$Yv~@IzUDD*ICtMb}is#nQ%|Lv(PCo!m7T36=-NR z2IgZt<~(ZDRL(R-bTfqUr|u9#)sOu7I(~VM>fkT(Q4sF}9q(gtezBJji9iKpI|8KLd)MY*aq9S8xLu5pa|?3T zB)44@TaGDWMt24c2hg*0H8ox=icIEop2@!Ua?bOdKg^C=b$_oxD3ve{o}MFi)MY6X zW=!cWz`~2J<)YYh9WhE5Q`6^cCv0JO_Lz((>?QJAB<{euHdce7Bd-9rH%DWg1OQ@s zCQ8ILEXHoWzoTFOBmanRx^MY!nQ#8#-}FCfI`h>hJ($7b5~e9Q zy5_RV;&hcK5_ffP333B}>yBdcD(fa9T230V1hgYT1bk+mc=@5*8Vh{mq&s}^lt*24 zW%VIQpLc5hvC2W6QPk3Z@yPkSSL52i@<$P*y!NZRjQ-ztzs9?uNcks!>m5*}Jg;WB z@^a2C7ruJ`!LQwY7ovZum9}fB$KHNRJT+wt`nAfYH;Lfy%`UNktWrWv$;M%-CN3Jd zt*(xD^`V3S#sQ_N#21(%F`RPXH+VV(iqB*BuwS!Asy$jlL(tUYseOLU9Afv;P4`<+ z-c?melN3{cM65cX4ItVH&Ig%~Njx46_W@Xx)SqTiL{-^jYli0-&XJ1KxW%GU$fBA$ zVp*3UN-a(O4F#CoHyvR0Sxxwa~RjWKMz(Slu>c*}S`|NZsX%cZ^e@gH9Z z@7{Ri9zJ{X7v2ePefr^?y}e1b!S4v2nzBf>QLe68e!(z}Vx#KSfEc8uEsiS;J^2Jk z%rbu$teB;oBrE!mDht~i*8Z6FyTP4M+3k1V*&`G_q{xBXG< zE&E?>R3G81D!a&q44X;{j&L@JyfrZ&JP13v_)(qO*ld73gIK1naD8oIf#>0&a9L^e0J)7CO+~rELj~Z=looFQ;LDk!Ca-K*5gC9bKiR_E zG8d3{kpK(8mfX)iT#04!EG`$$heKd|csO_=S=AqJsqz5&{D|RbV5z!Aj8Z)ydc|fu zbD`gqd}Yej`Xy+-RPv=Vbw5ayM){>Q{x@72k#z>eCIN3{Eh&I)z6 z>eCz*m5IaT9SmwPOH87bvuS6pEOg6^W{RY3dYq=IOc#n$Ylq93p;L&-{HZ@gH4kR% z=*~J7+^OSQLSia=GgB_I12|ka9|^&!fcw1qjMRZtx?NzO0JoWz>XKWU+m=#fOaR_z zb-4w#V!~JMtf46?WLcb6xIr%dd6{i+m zz{IVZ1l623zp@%#Aw4!4Sh}r^(9ujIjDv0o`ubiOJgT7|YQ~<5@+X$#X$Q)a%uJ10 z!hF70xzZ(9>yim1VWSs9!reb0TI<~?GA)54Wf@r;*cQLg$k?5)asV)u4L0Uq6+q7C zbX4eeRq6$a3W+MqB16dQ_Ok5m zdR=u&IVV0EgLh1bxJ8xvVcLY;8rt^xTzqqQ9kZE+x)q6;fLpJ+q@b$_HOp2hvHWuDhG%$WQkSbbz|3dO;!SdGP><& z0P@SvFTB%lJz!sdw&bp!Eq#cbtJp2I^5aASSB0ux0_w?1_X$pHha2+tBfENg-A;+U;AphCK8>jvnu__-zRuz4uMJN6xt z*CjM?*!k3oQIFz9InAe24|Zl+Hy*UN*WRE1sz+x&;@ejk|8JiDIV02>u0@1{UK@$w%QBig zCH?%U3y`d$C_B8CZh`)@{zA%5v+PaNaZgr_pCsJ-)Una7gM=xl)W?^iHq62E=TBcT zGjBvOe*3y5G_L+6%}3f3^Pgtu3Z;bruowo3GbLmyb7WwK0Qa&bcJgVnX9lg>>t){q0$^R%X1 z?YwP6-GsU;Yo$0VMeD|cbPuj4qZ=~kROhdhLROq$fT2Qa;+wD2Z?!3c0HTDJu4t>g zy+-ccZFKXadZtid4yx$wC9@dq_S7V||7^IBAxB0$R zlxZB>Ba&L+FV^X-KYIRc*KQJXp*_VWNjB&N*4_O>?}2tSCv3b|+tTu%Bq?=~O#X`< znK!eZHtZSdIy$6H#a?bQVxeYd06ZHqC>vUayNA|{W79UWhYw5V(FvZ)yN)oz9E(*| zqzPX)T)2(~|33EuuA1Z};9V$rO9Czy-3>wsL4A&hm&tZo*5Iy0h$JJ29>am^WM$fP z8`SMSN(${RgP^o(PetYTu{-%#^RPNcY(x@C6H36n91Z05Z-vauCosN zx&!vB=k0HO`oU#hxEp&U=rnO`Cr5w)`vzd$n;rR-WDlWoHTs z^f2qNjGL3do5b2o0f_ltTO_lL#eB$K!*;KRYS7lIDu@{D)^joDmSldHl)r2am{`^8 zk#rS@r1bAVc9MJ9b?w+xiW744hA)95ZV9mIJTpWeEicn|Znm&8n9LnjI8RiFQw6t# zfhmNkE5pe5H@>*EhePHM*PpEM`K$H##plm1>ML$Nia#&wng_D(hj{)uBnBv#Kyrs< z+)b9jvma6fVROSet!+i^HuCwaNxXBora6@@V{FF-%@*dGNfj=ojRml2pdle2mK2a| z`5ccPqp9|?BP&HWL15>*$COL#JE@D^F)6Md-aG}|vyW2K$)EBhjVMT-fOPs4hs3dD ztr)!!qMQs#BxG!!oJ82Vde-C&J=PAZNJP^`1)wPB52tQqOYV_Yrhj-v{??22^3!L3 zydJMVdBuoc@Z(z#C0J0LK#^y ziLw~5VVhoT%tyDU;cJ17ym$h@Ha1hqz*KeSs;CXVoQ8*q$Ev>qutFMxZyu0=o8?^Hln?Uc9E$73kTR+YNdS08% zaIKOKJa5(flZg>NM#UOqipl0sW|n^})4w{)t;eE+PCt_}hYfy$$Rfd~&kpC395ner zmBWqnx3lnAQAzt=I=#&-7~jD(C8=DHw*fr+{E#Wd=9i~L)B^f}%eTvW8}bQguV=87 zF6|PKhm@)2joK`~K=;LDVR>M*X<4a@&;v3OEb?P`-99wgyd`Olnh;!cy*hQk^a18_ zsmuj&@vYwd!@ADORx&+)$y5cp<4tZMk=Ta{tfRBQ|6-OZXaRP?^l8=KFS%=GIC}Yk z=3xdL)GxKfv5i>Py0y*#J2otwN-g|R;)I1g&u?0LW_g|J?(AG&eB;MCudO#|W54+H z`IWWB(szm=gWyH13O)C3a?FbF#QP!wDHk~+e-#n8hX#y#;y}7(@mw>^<$|oa8)+Z{ zu2_ePDqZv(n89K)36SDflYU`Wevqt7UH)hF>-TFbez~^Vg2%G3NJfcZL@-nNSXFD( zfYr7x|33yUK|J84K|>&c8#|W|f=Dc!=K3tGyCH{`BztQu)~34O=%uIDHzWe+?}yVd zbyV*X$3|veK;vH8%C9hOn{%Ein}q1oIVRZ#?rG~1=z4t z2I77czAmz~2|oagDizljRn50fOZ6{~PhUQN`Wo0A+3r}XkDq-CAG2`9nONUOYnm8==~k9_D@e$s6oa&^q4 zSHfU{eG##&05@?{KB>jZT5-rl;VZpaw|3wDHk*MT;0Lm{(r(I7-4x%emV#?gG!Yzn_hJ<+KmfE^>pyINxWr*LYCquv>>QQwi7^Q zsTpBqp%VFIua~DvrZ)JK%+-UDe4VT}QwJCf5*#mi<~TQgoU2p$E3aNYeqc7;o}%0l zB;`m-pz=&2DUvymW;p1(gwPtZQV*%2R&xk47F3|+RGtk!9B-IL`B>YT%aNO;lR z!2v`ba3`yG6?uSWok{YoR_>y+oSP;|iO1FN=#J3ib?%Wl@#d`` z=jv?!;AiRkTF+$BDX{K3iwA(fV3Lnek!=BoF>T2pvmCATE}PtTTVnyN>IgW~DIP!; z8XVetArHWtP9A)g-H=YTOdH+u<&u0d1;P>Yl0T&mc)>a5G@-F~_5Y@@*~*P?2DVl= z$V$Bt%$=-w3*WmWV(D8M64{h@27nykEZGJ1)!1HPfK?iF(t-|w0cyK-b>o%D0;`~j zEa#dqRl7Y|Zl0BTKDoU0+>@7_T!S$jhyi8CPr?xX5enM@b0Ra)p<7hFV}H=%ZX z|F1my%a8JFmyRwiG8JoVNmB(#@|Y}gauR#OJNXV(xho&CWu8GGjKhE=1;zKmwY?5$ ztn<4@f*{-~;Hj}! zt3;MrCCTXc1hCG#xH|0~YMQC_%M-(2)oj`~inMh|{*&ZnL5Q*wAnG5AB~UycjA3Ut z71{?gSkFUZx?atM4z}GF2rg*7!|z;lTl&6I<8f}vHMEe=jl>W{025RYKFvx!mU){Bs-(7H5vhyF|1@caGg)pz-uzX*Z; z=y!krc)cIJ6@|XqZT``3zW$2W%lh=Ezw_o#zZ|4fv-lB3 zkfMHEQd4Fls$-}QRpS&jldJn15M}miEhWOQ0yqo94ke&m0awOY8N#z7$e5)|w^H_i zY@rD1H9xHu)WHFMTxSD=ZO5UCTC4781gaTYPQo-`@Q?Bx+hOxe)g6Z_ z7rstVT8>~IuW}8a0$j&Uwfrs_c5IcHr2%6FM(|If*OW9yIkYx_>EUP-CpVw#ienrE zDPd{8B(YFrvqdz5gQugJU{pIMOb*IbCgD+9r!j-Us#>zU6h}u<4*@ZVi06Nxg z_k0~hFRL#_X=EFzyiU(+u`tBh0P*Kz&DSgO`Fio=OWA}Q58Z<+FkMu(zxC+{w*s3Q zOl&m@>TIpJB2iu0-pt}mu}h*s3BHxY<^cqauW3#0G)?zSs_S6*hWA>qVU;kLl>o>$Tu0o9ZMhz4t0ogHpnaR7|Qt|Ny|hTW_H z!iWThUEY#|c0jkJj<}Lq)2$8crVC>+G3MM0bnC}CNfF<6eIbj!pOs47?3KNMN@UnPBze00W@e6kq9(ax^KxZb^$-RN&2=Wu#9d?VjBupOuHCTCwlDF;tt(6TBN>PTiAe#BsV9Bpbmv`s3b=tGJ|rFO|C zI#qkAd|_>pd1u|Vy;!xX>v1{6;&d4#nI!4P#ImO&o9}#%_pcGh=bt>isA|3S$US@) zb>VCLgSS5Y@DPWfWR>-cu8_SWY`{$ptF6FRsi~7j!IMLH%Y>#{tObulEWEKmIzR%s z!4Sf9Uj|(RF=Y2}G0?BQ`t-BM&(lP=LyvV*4U@>&i*n+$URtt8L6F^kpz_w>?szq+9pARxJ1bx{o zAX5U^P!-Er%Fe@{uh(z=IOn{-pMEkQe|}A)cC#|co&*~54QaU+@2g~;hBR|!tul<& zjkw%AVqbDv8GcQjWwj`UO4*eqiJS9Xs$UJeyOj*-58zi?UP0ALg*2LZ*9D39Fh>~@ zrR@CGB9M=N`JJ~+4ku;VyaTB_Rvx=f8C)8KUM_%8j$Dtn z|B%O_TYkhCIHprU*LLylpFA*c7xDzHLOxn$p+&HaJf}(~g9P8CC=Wa-(u-(Cg$^Aw zq)KU4X*uKu`4-ugZ0P;3gO^sExT>KqdoB?)Se8Y4@rTx;rtRdOa! zoB_g206f8Y*&jm=82lvNGpJAYo+vsQ?GmkL$mL3y#*jgDRzxN(!$xv#&P%0 z=qVtIc%_56qzYvN0pd)ka$mwoz+@R4HBz@M)x3#9GHcY zjZAWM!EY)H3W7OQj{&ar-9nFwUdwMCs;uGf{@Huk>aHtgZF{G2Z<63Uiud#hQ=-~X z2g$ zz?uH;pF2cNz+Wnbf+}&C zT8YVNF(#cK>Xyn&pmGqIt&=B|>9S>zji!W-vh3OJ{`q5%5Em!$Rr@U&M%F@63hCO& zn1Kz%8kB$NaXUsB20rOXiruZ{N1&IXyO9qAlf86Mq^_w2fXIc=A&W~znttzo#ACN1 zLnEf%TDyk3`xlO(9jnXt z7GhLcp=@BIJA(;&VI){aDS}d%v;Z9`64bUTHkb^mk(rxh%3-<{Yyu6u!-unAdF0gopmeQkHYNmf)U8tRNa_lHIr3q4A4>O z7qmWYUEgI{u4cHtsYy3|h8&=Fe$_yj4yGse`>>YU(j0*d`cG_ij-fHl>|pQyceDjGE%g{;vz z)KxP9s%6PKOyHoLai-iOGmG68@NHq>Sx{b^rAq7zoI50RPMB+gGF=Uv<(PD@tH!M6 z%&8N=b8*tGALlhF8sC5U=!-|=(Q9q@UmcG=J+!W`6`NJ9ZizxTok`bm7{Yi}tHbT& zyh`>@N!4<7uuy|1U$BEz{SC;MR|P9+kcG*SBw(O|4TD?&cp~<$8u>|S#HiBo@=zzlhvXmZ9yh z$N9N4`!&&6t}oJ8ZcAObPTr1LQ6MxBdT??NhFB*#6$Nvsnr5xO)Fp{iD=SXEPdUl; zGBbBNw>0V`8PfA@g(wX5AOf>WgRn;8)r#s}`O+NDRrJ&UEP(a*R1<=*_>U-`@KN&ZDk4T(U%|L8sj{picwa`M4> z>nq;GsMA;crLQ{WTxP4k(XYS$^M8Il;}71raejH6JDue@`o=UjX(d2pZfSM z7xKYxnvXvEtv6rwcziLhf91N5$v^wb_44`gm4EyBEBTCfeac(Cdi2rne);wH&&#)r zzxVtdulV}Lf4}5=o<4eZeD*2-{fx2s=x_e=C%j^UUw-!V**bpj@818Eul%;Zc=~OR zSpYAV%ysluAOG-PtE5Tq$jK=s$U{@T#sT_BGRRFvBwBkHWGWYzO@6_-_=$yg&BjiKr{OIDhY0qf429K31Cj?%a`rhR&>HMwpvh;2e1}gS$hM{83fwT^vD0c=G!&s@Qch zqa{Ml;faHUOvf8eNj07}`LFJm(k6M)E|f`bJZul#1lZRVBIlccw?2Odl}*-faJ?TO zrCL)e@=mo)+13V7e^*DJlO$=YhYqz<7)}H=l3I-}<-_5Vv~{l}DOJoN;vx{4AqZ+i z4RRgsG9p$fSOTeZ!DrFqyMOgKM+(BCk~_2kB7mjj<{lZ*#k z@-8u!+gw(kD*Cm(|xM0e* zBobaE@XlIf3_hd?Y&!IoSS9@qN#mHU_BY>0Q?Evqhr(o$c+#X#R$^X7S{*>whpHXj z&#E179q-R2*f)Nhb5Q!jmny%0cI|90>>(u*GR*Q@#Sm7SHWfx9y4zHLxt#4Qc|!!` zx9{DfobZxvemz@JZjhU(3jv8xX5L5jThftRM7v#~pJRoVmwp9nbm{uRj_MmcbY5|v zORu|4>>EAQ+h)=8q0o&V=iK1&`6o{my4$m-`={6X+B&}|>|Jw&QFfLG1d+g_OGh8d z+@wFUr%o`*iY}Jg$SPg_UZF{0S=BIPrL8Ed97}G63TMfqEkBZOjLDfixsHCfZEeT` zAvEVDc(cA*vgBTuEWPuZ+%6AAn7ahHAm>HDx+~vCTZi@w6S5Bxep4a=C!Ps+*R8{@nXUZEdQby|d{d<4Mikw-DRRxC*0RdX!?}w;GnJC-3~ldC`s)3# zp;ob~B_9XY3&RO=A2M85yQqq<34Vz^q)rD&dk3u$b8T0{@Qz7aD+S|RP{Wwf4KX>; zr~^?K1Zs4MzzE*f^S5wbB)|3Jr>`ErXkR?OFOa;DQoQx(UDx+?U&ev2GM2A={>>2z z+buaB*DisRC8fDNNuz3pl6f6*+K!PJdaow!R+E!YI?+5E6_4(vGd|s55d+w_hnZ6d zgyOFH6y7sR>7OW3XKT5sP`$-P&LkIGv+w@Rdk@vy`T~4AYznT#H@9oe>>dL|AAV;Y zx7)&0c*{^jmt~1sjyf(~boQlUC_+;@j8mmW3wG8$IplmvvH7s9@203V!FM);+Pbq$ z7Wa&u%_oER*t{ z$O=h?&5Jk-b^|A5l_L?2oqF6CQ@ol?A|?OT3^>7`}$?` z-M@9zLCLJStIBC5iJ6$7t3ur*Rc2)_wlrH}BPn z7Om{aNhd3tqg7Q-m;BPy_YT^+>FeF~rRbVo@-)S-R z#u7cdSE*pT`*)sv{DXIve=cI{_~Cf;?9o$Z{|_I%eDv`z-<#ifn>!&?i!m)#n&~vx z$c(yqxflS6Rjgnp58d#q9&I<-`vQugO4iHSlebf`2Xs%0ft8^d0Df(= zs@wNzmRcdm?|oief0(AKSjp8ea=KBTjONryHoH+e12z}nw-exVt1jKPvrN6Zr5u06 zvQd*$u|kY|zq5O)ByZI+p%)|q0X~)h2uD{Uy{G{@lEg?UKil2c)H@|VeQAYr(^E(xwlI^?9@?CTfb0ZA<)Q0Vodp!B#3}=OU3*Dv ztU!$IKop&1m}$vVWG}`~>;vB}jDgWv&5m%)pSlFKkk8{5U5>_C5Ipv@269)rt^< z$#8~DTmc>!VygEoLl~h7lm8+r=r~WFjO2wbMKReRMD6YY=H_d_GdWr&5p*;SgvbWD z8c5Vs=YH~`f~T-c2|dymfTJW)qwRN7k%dnXUFwD_n;39BKb(kz1B7#h1rYnl= z3(_}yb6ckOt$=mae^}8+KZPL%`&$hzME$BTL{%|__EK>B+T{_VTx;HlJeOHZk z-KI#xRdsW6t>-uUyZ`9PyKmH$R!FGPNGKADSkh4A{3LXHB7o0Zrc2~Qy*V>f1CzVt zzp`a`mgC_7&UX!^Nx)vTvU8dsxTd2`Nu+cu`|_YRO4aeht;ng2gF?dj+H12)gS>Eu zG+8>kfgmGy6do|}`@6gtfTARWr8c?gYxYqV>JnIEaW~zn*PK;BOWI~@WH_u2_Bu3O zO^#~COj`$a>Qw`(^gg;u`)2>LC*?{a`N7kdkDvbdlTTl)dExJT<1zdWiF}7d-ZK(u zwJ+Eo;hXq3^mzQ>0usRPQBrk9 zJ#;#HA9m_OUauIGPzX$EoYLAzRol&|XVy!GijxZ?|i?Fg=o+sxDhxa=sS=IMtA z?2HlTj<8$FRoOH%35)RU0k8n}?t=7b65CTX-wm+V_+vFJ8};-sNJiE!x~<5&W*2Oi z&P3xc7%WiZZ2NHI$2l#QUwiiA^T(r&pIj>tiR$CcJn`CbbX#0G9K9vJ(hb4O&BJsk zd9wFV{TfrwOBGeMnK^x>YsOrs=nMczrla~=>FeT41Irx18plh(6*EOQ5=DNm+p&>vDx*9vr{8o zb!GeQg4&Da2vCPQEQ4GKLDsG%h*JnMf+c*{0z1&j6)0L&7G}<+?0 zjP)YmWNA-GimOT`w)1nLW0uig>rj&!jbxd-mWu=ER_L1K@!ST!4&$c?YQ;WU5z{L zYW3q=pMG$SY_|`g84re-A^5BcaaEp)t*BaX zPEb!?RgIZY!8`$^@K;yafJu0~_uwVM*;n;`cZqe)+0VLP->M~e>#_TKA0&I#2kAp} zRF?gdix3{@985n)$w>hUYzC3+-cU>Xxehtbv+P1*N z7WFU7cRg$8W&rW_)uiTf_B}`g6B?fmnTstaKqocGXv1N;2Q*5%Px)=DGKfVJRiE#e z5B|=0EMJype6DpSif z%X>Qcy|WZsvqHcMf!r$X^Q%7Zy)DWGTl!6QE?mu}C zr_Z@bIITBk5D=e2t~E;tt?9q2j10Fs|=o3&MfH7kR$avAe{3v)EsuiC)#L(^ zRV`==wyDgMO*4nCDddrvrJ z1v0C~Rizw#wAs3(fL7Y3E-At;P?6e@OkianYSwlqwYxBKNoJYJmzk%D#_IIL@z=IN z_}s)cieqH*y!%hz$3B3jCdEQW!Xwz^!N1td!qI8ja#q$YBaIdhN#p3!p@y=`lC<$` zMn=M>5zmr(dPuN`7NZ(R`rLfIkBX9hG50nVH)NKaRoVwIocnw*@U7YhHy*kN^TFl0 zKzwKC0w2OY_|M+MK9KRv>@lufjG3~n?oO`8ODfLrn(W13n4-h!t~>8biz$yJX|gPH zgs2{gnBiE#ng(mGwQor<&TOO@F8LglEe$o(E5Xa~ycHIWPwwo*BU=&1$*W<7G}%B0 zkoUdjj;e!)yp7#TnukC3kPv9Fav!jS(6V;XTGj%bx^b5U4+}@dZC!2mDOZ+aUob5@ z%&0Qc=9`?(y0;s$7&#xZK7IKBD7y8yU1x>vYBq2mFe+D_*QhNyUC#z-^Dxy8V$wRW zm5~9-O3){g2yNXuJ2!bo>j(^FMTXxN^)CXLTwopto5qzmmTSP_CH49R$V|1SWq0fM zrblKAc)8HdEi~Vn^>^!WyT1PXmuLKMufMlG{ovN0BfNTP6-Fl+$4vD5e`6b0inN@2&ogZ}RdI*T))f7*BSi8mJUWI=QmeZ9o3R*a-h&C@>T-><@?r@~ zw||SQaMq>U+b+3^MYBkznM7}$8O`XzJXCmINouZ_KK9^GI&6cq0rN0xz|$59()mng zWsVXwOsiwmGJTu*5QwggmE1OKwg*P6$x0c{Xzox?B zqfzzCh4<0-?*IFPTXOOi2xYh67NE$eG&~qTT=7*TQDv_p?@coH>v$?r)y1h7Nuh3nYpLTHPu*1_yK5=;9T{CG?ioH0aQXWAj{I9mZ&t)mbgQN zgx@B!@)~O0Bu^ICO4;VLfAal}H4ydR_`5Glq z@d`sq-aQV|vO0g%g4C3~0+@RSBd?I1SR_QtaY!S>FN!QbRfOY83;c(VTMgLX&Mk23 zQM;b=)76}x-dWE75ca@-@gDYo4`z_=RF~^FtH?oqlTL5}UFxrp(SYr8#`ALcoQho1 z@Z3yp3f5&04}eSr(f%Yoq+tZ~DuE2@Uk)cv)!)swB;b-%4+1d(Eb!9#d=j_j%E}0Y0n;ivc6!wT&9E@kKnfzfbarN zR$Zm5IVh_s!0*+aP$eTNq4voi)+S|u!zJ4T!`6^=u0mXFA+#76Hlhm1jc};efn-(Q z>6z*=)#{$RY`4`UF=Tt2K!EV%94-p0zI`k2)+6|5g?-5k!PqJ#4=7LT5Y08}QIflY zUYNkYbS>%maH!T?9q=(bC*hv0julBXLyaWfsA}`7D}J)0b8|~+Np*D+)bicPbt20f zvBoazT$j$ZF-vY9m7F;S6OzCJ{IoWru?s3}r0l}8`k9os^Cab36*m<#rR;8lnPlZy zt5G?F_<1!_JYyZIdSQxUwajvq>P}F9Jmf~KJLJu~gm6}XdHIvonXyBqpnYk{1DQ6@1%9wM`gD^@9ru=UDLx>QNd?427^DEv>TXXjM!gv^po zXhe|tp3xbVDwCSj_~9|?blIq`(UMXQcOLn?#(ei*zK{Gb*VdgOww3tBO3_syXvL|8 zNA19|RiT@uQV_;|NxV%4p4Ip^4);0P?J}(_MZ1BifFc&1v_ysh`pM$fE;9&*rF$Yr z?sAx4DX1Xk9EFKlW~i}EBI#w979*K6ktNd@l9QJe%xK`mT^!>%%X zT)Ht`azK-Zcq=^?naD^xU`1)wtNTNzYXItA!`^nvzC`yE=T_w}e)4o&Ts_=+%)b8A z)m=SxeJ3oC2w}aS&KJqX0Zjr3U!`o09l-#qnn=i)7j%AlhQclt4oHMn=PMEs?4Z1lINbeL?{Wtmb-{1ck-vEK zlSfY<4gUVoZ$FW^@sBhr<8~T9-rf+a2pV=|EN`TJSbm`>AVEPDhfnkhvSg->35-U6nng z_i_PPTS`erX63r*9fbFzldLyMYc-a6uKfDdfB=1|!^BDnY#k@BP(h|rCSI}oEJOCm z6a--Gl%YthRl$MsZq8RL9N_v`nCYme8TJbiT`5_aQ}yLxK!29e~eI3<68 zIK?d4Fc$_ZX5JG(0H-809D4pi8I<{s5`rgpsvbI#TO2v2N=t57>8Nb!@1*2}c2(M# zJ-L|aK6I~G8b-x3@&$CAOzqh4mR-K4END*)@YXkxXQ@iv5fEF>W~<1JKFdZ|rn?dX62&mU&6FV}#CbTY#IV0R5WeTx(Qb&yvltEF9PCJ`_E^rK|7O!}hiHI+woXA1X&HW)-y{ zsgTb~4J`P>-JMBf^QIn`)MDl9?EzDaR+Fqp%2M)Td5|t7N|I)f5!Gy4XP0)Gqz3#h z&yt{PA^?n=YM4wBLSx_;ZaEcOpX(;cE)E3b`2N~FA$$fzlRY2_ffnK@VnTv4_<(n|ofC0L)1d#!rc?JUmZmJ1s^5s;>nm>~fH zhA5?nbQTnrz*teqo*_15)|6*fb|xmC|}$v^^XW; zT~m?}1R24qDBsrYtUQg9IZWWD4KiDW)ofVE>@m4w8qNC zjoIr@Ke(0WyMaDd-LBVOCmUBraR8YT$r?kpc)J&NutYzd4deyLa#zc5wB&-h7P)IV z(*Vvs%fnU5dAfveFwUq_x7~5%`1<*SGB*i%&SV<7ZHi(jY9ZDLms0Yeevh9wnV}N}* zj7DV=E^Xx8?0MyVZ#;YY`O^!Ye&aE_9`(xA>ZrFq{pLJ9R<9d0(hZcbu1+9Lo7>(VL=Ow9o_(LfH{6Hf_-f#Dp4#VFm?WWgX=oe?Sulzj9e zZhCJ?4}4Et!4=aqE8rHUC#oIXtMbPr*`BXqf{&7M&GAAL_QsEMZX&tAI%%K0e0pVe zd79ppTtM7QPMb~zX(`4CoP)516f<~cO%sabPKk`wiYz!e#S=#fq8dEy zmOT!2_{LJ}(WEft&>_z@pCPVfZ1@nw#{<(^u2#n69%=v(O%iY*ZVy&wO457oyRlB? zMp(}0Ot*fVb1~uXpxaFyFU6_* zK9hJgkO)75V3k)@k!)S+-38D>?o+R_`}UF=NX;^{C2c~^2>i6zjB(c#2lCsB1MghV zY$ouxE+C`~4!CdAt*$05=wP=)~vDb_}~s9Lg!V5LYjB1y!G zw3hjp$YzpM#WX_MnI0ulWWfJw_6tO_)X$zu-wIrC>oL2I3*M}gaG_=L`qS@l!FRae zJ6!O-Z~?!euI}N^&6hMK91c^?GBZ|jo!h$OCJ;p3S}C)WI--tyV8^5I9z1n`(1sQA zm@Hvl(wCO?RV!tkDC;U?9&++Y&HUM`IjRt~sx9?vaDn*_7kq~ce$mtV$(kgswwQ@_ z*6Va7snI9f!R{bCyGbldgjn*kzHnr929asiT{0OO0wr&~vJH|7OFB+(n~B)6+bfHG zD+#@zTfDtfOKLkFcY{j3$Ff!`pxqY@O`C^GTI-PA^XC zZ#-lVDxA4P)8&i`UVr+{QGvu&8N)2gmlT0tMpoA45F;ekGP0^$0cow#f+}026D({* zz_!a37i}M-O&KPX;`l-Epr}S8AYPVtc4GUDl>-@@F>O{(F(5Bu;~?1H{nt_(CNdm7 zr%6U)E07;_-R3P5?QKx4Ow{e~;-(y@MQ98glMFU}!bA z+g*v=A$QXx5E~9Ld46platTwwex6$HAyD5@ZQ~ z_uo9Z&qZ;RR&0csE;bDzC#tG?MO#>LvZyf0;tVoamhqNRr_{kO4Eqn#f*KZ9mP^i7l1D61&))5NNOZY7nuP9d%Ox_qXB%&S(R^F zI*ns}xK(S&cmLht9un%>T{r&fhU0&W-Qzb;D|zD`dp$JW^Nx7~Hdw219pdlu2^cf- z0Cw@$=7%Q2kL17D_|7X1%>e{b zBW9$ct7W2_s)X5c#Dy%K3bsO0n-$y0d$mh3Fbq=33~?x`)GVQwdYs!g0_oC!uvG?c zk{!fKUU9sTs*Oz8rA_IIlA3xur*cc$F3v{j|C9Dq$j7{pd(D(!mF`5LUOcjH$jQyB zKK6{MS&f;gYDEA$0eNKfsqXH?pB7-a%wW{SCzWpvJOjQ|7;h9>^k^&$wUM6gQc2(K zS(_KvShpUwKO;B!h1g2~ifUhKvVv7lMw#HPQsWQ_$pK{ru^RB@y&BSbP^(`nMjxhi_9a*P;86*Wp&VBgi7i z0j!WNHrZ!dm2DW(SZ3BT(OLTNj$IDPa11f~UZ@Thv800%YERWlDr&JB$PHB^-qrnF z`3B&94M567xN<7W@3NOwb@jQT1SnbaeLuV-Qx_vuTYk@0nX*vJlEF4ntucYUrJ{TC z!qZQws#1X^0YF9{;?gnSFJCS}rGX4bQZKFN$OC91c`=h)vO_<#%@amvVdsYG0N^km8sca%Db zdXK-wtMJxC_rNMNuh~&Ot-`lH|KL_3DB2mh%O#x}KzYP-fVyd`3kMhr#Ls5CVuJ~= z$PJo};P3{HwE%P#h=(41hXTRNnuV7Z@|(sSehgs+s=+>BMOlL<%&(KINm4S-pKCk6 zO{?(ML-%u5VR&E_e)ALk_fTb$;fv}`kwkY3-Rop7&Ex{)uS=x8!8WJqHaPuR%{{5Z zoec~~9)O-E=Sbjli@8YkX+x@@W>Bf4=wD@K$qB>3D0gr}nxS$Z&yrg*UVkVK05XNsI}t8C#wkP+&^W2yvXwHl{Dr686Vr6nEi z30ILQeqTP6?bLs7j>BU}Zo23O`Tp}i0uz3AQD$=ELA%OI?A6<(w?6%F*4~?OeKdZr zKYIG;lSe;#GL+s&Ci8wl5VG7y>)4@2jTNgS?2v;x8ciA2O7%mdql1RH z+D_%agpivd-=cHmhE}QGiMzP#yz#JIbmxU9=81c&JMaF#-@)DHoXtoI9x&V{WFKP4L+bP_o4R9^zpzYO zo`6Oo#Ul{BpmWmX+4FxP#)(EGM5`dbg%gPsBJv)cJX*aQEg zPHanvOm8M&D8WkCc~BKIgG9$sw;!w;79W(n84nO{`cZ=o;i@bsH?D zAdn`@@;aZ`-uQ;#eEItP=_gO0w^x_FvbP?$hcyZ=6_eij^qcR+#$d@rB*2c$_P!SR z*B#{$L5;(MP1*}v>)uBY+T2GO_lrCxkY1AvbKwVsd)Wo1VXSS2l^ddJLwH^2HVK!x z2K6!s*|Oi5L1Uu5`=8%KJ}PN7zynKev-i?uA3F!NuT@umHFo)?$y_;(#tN&(z`$~e zktyH0mgzbU7|dx{O$Nb3SL$J}?sMO)h+v01`uhDQuT%oFN&uSkOTqYjZ!vYHx+Ndm zb-tAeFS47`ale{v#$l-y6A1?*tJB%M8bjK^K+|m}?@bGa(S4%|0gM{8W#8aD$)-DK zg*7X%qvQdct5x&Wszc`P(iK1FBbLeYOWVvF57`9(Gbecj^N!>ZZhm$8zdZR6QsDpk z9+FRxhC!;jX;<*`ArRw&F)D#1B@Xs`5xg%zs!)d{yyYTis{^a+mR$XgGw`GY&(u`6 zFk;!3Fqw9d)W2Iy8b8j(UTaVkHk>1NVMkMsGz@6PTw<(QpyMq(uW1fuEUJUC2^ib;n zOq;+KiEI!RVno*ndv3*6Na=@`CVR2V9;5`T$PiQ^qH4hDBw*iXCtms;wj-!qsN=du z5S3qzU(HkiA6U}mtx7Fbg6KxMsI`_E5kqmnLMC>|f)1_=vFL+LduVJ7nPCsbVJVmA z5csWD24ZTfV@_*koy&?)KsCn#Sn_9mobRias9&tTTMydRQ%U zaz>4VmfhObBkeq?ycrUtZLuy@VG)IVx%=Og3iui_kkmE>!idqul^w+?GeIO*H5hid z=bQtmpjQ7O0WS*}?mVQ~YwyOFx9KNw!l}%K^+xQ^p(<;si%i$dnIPkB+Ynq5b=Cdv z?rGfp?|KTw#-p)!_)K_-UB*(ZQ!qecAvgV;Bssv438@4SFY8R_OqPMeXh3G(BUde) zKAHaoadLsFFF55OO*is?3HC1}pkNKQb8v%t=cALqPz?yZ%t_31P+?NGNT z*?#L7G&6bphAmhFJhsaZ=pi7W0+>~bN1h&8iZN2m^mVID3{2!DAteQAmEiN?@U7W0 zmyv|DnOmhzzM2qJSbp42=-%l{J?_tZU5l8jY8;oP(} z42)6pM$2@mWw^?wp;mQ$D3i~;y^4!x*#(514$I>f#JU2|vS#&UI>iA8icAYSkTZOl z$V((rk?!W-Kq{nx{;kY7w;r?yGR~X3e{;$>Z+-sFGY$!mh}4WHSsGWI*w%s?vWW;~ zq=YH`Fm>m2b;7HQ$3V#$TeuTwpP@70eGmTZ+4Ik(BaqSN=CvhD&T9hwrj65)j~3{k zUzFnxe#-Oe?*Dr70pz`NVbzTv=X_i{pT2l}6kcCO`w~{sCGO}WPvZkSEn8ngTap9r zVO42uWbci2TZ+ZiwZ%L+(pR2Y-dz%nN&%{-6Qy7_z-R!)hkUQe*FZFg1<7e_w4D*F78|7vU5StjUVUSnEUdXp6haAgKmVZ zQ*QvXwH=&z17;k!$OiU**vzh6Db;~r`}W(%sm>2sjYvzm^&D-`jYns11EqYL7QkYi zq&3a9O+GV{$X|2K7?K>lGRr3$X@g!S0`u3t_wE}2j5-Og%s5`v^%hJ z>k28hkcs29sc*!Uw2dVsnm!EZ(vM^%kS7zixyG8dbim13{Cd3v{k?kp{L}gQv-SA% zS5Geuk#9YM58m;Xi?hAAKK0#YoNG$XNlYd~mNhH=U0$j+SOihGiYE7vaQ4&crnVzjc# z#|)c?wCX^;YNxZQAMUKYJvbyaNi57P5kaF`9d_toH^>@{Z{Rt>(4h=sIT;-e3rHn~ z+GPxAeR{rvuLON=IfqD|j;}h;@vR@{^&Efny;p3Km#=5~Z+jgho<9HV(-*HEzgRCn zea4o1d~B&}1S90d%31-`wyPv2q7-q*QT16x%4@WcUuR|lMg-}&R2J^y@lqMgtGrf9 z^Kw&N1(H!`m3A%cq6dEJjy`K7<-KnE<{&6+o3?I|sc zOo%Bw3^Z9+S8ph3V}-th+@67>1?(4Hkb>xdFtdB5zo1Lv)GJF{O2`drH`Kt) zd$XFo91`S&*G}^+=TL8@IcuOG(Nt5U2oGN(%xy!kBcPQ`x`9&e%<5n4CIeM<>L?Pc z@I{d4&<53IRMRmO2rlwtXMj$wDi4tc!s!k$!+e2KyVMg*InVR0ALr^k{~Zs^^B1ds z*2W)QnPjzHTZzD^ULx{Om%Ky)eSxHG&WYG|o!wvJzof zt6o#63Lj{__hrL0NEsdzPbjTDga`Ky4Uk&9)|~08QLRpmz|60F7|%U?PDjN ztTKbofh|Io;i;v4ZPZPZR#4G8Kqhw|q+V?|5FGLgwl+=ul`ccT7)btI4YGttU7_{~ z_a@%je4gZ6KhD)j{{Hphml|m7Y9DF_^g~ub;{yFgnrk=GE9VF@3l;c=m2|1sB(}uIp<9Su!oSY znp`%!u=IdrEDuHmJkPr&2uD86Z`Be7t0ib~b)^yqmp6yl8)RWZ_f`1T0H&<+Vha?8 zEI*cuDUiOBS2|meTNUL@h86@gBrFaCVkeP6`H{&KIZjIWfyhBfgdUeFeaQ3t-uiLg z%rAsa}l1 zha|gZw-|G+#L;#kZguO&IT52@5H2qr{|HVMO_XcnzorK(TS}m&z+KVH* z(D(#!DCjl^|T5=hpBw zU~85dkfpoU*%brmMkJ3($}y36W@U~hL3NP3^tNQk*`T0Xb)rPTAuay~TV)QqAFFPe zWV_|kV9&G)?^{Gw-b`s{^u5)mEqjgg+}`+cPILSJ2`G;`ScNvM+N$?VY+cJ*NIZ09 zt$4kt7wUuL-Qp!D|(atK~j+>lH@U@^m{X4M;{J_GAY71mb6P`UQ zRJSuj?RMro!@H{}P@MxXhv13!4m>v|;bM}#(+sjyU~2@~@$wWi5-_!}pk8Im#nLY4 zrVrBi@C-fquLn{kbL0q}5m+D_%>xW2`JXMO48)*{#Cq;LyY=IoX80F}$OP1F2(sNt z0-W`yLk)0nfV_qzTONMdJbH8&v`jVNM#76d%l6npYpk?TSfsP7*{pT%XRh*!Uoxo_ zm?%@K3Is6~_C?>xRnl(pF57yV-UwnLb4k&S+cU;6XI+UXm9&MrB9^=^$cRcuZf7jQ4-}RULORvA_LBRgiuV;$CQg;mXt6_C7q1CLi@|C(Z5=JEsu)tNV zJ90NNWdn0Jf`f(oTPL7moJ;&;b#aaW7`GPGmU~crw#l= z7q#=Qg~stXW%@j1W5BMeWRO>AUk}-x$)CHB2W=lCbz;6;!Q)OS13TAo=A_KN){?>2`JNQM-CGVP4-s ze6{=Rtxw-U4Gy%N$r(qZO3yV`xf?fGBatc04q#da+h@Cylm!fPRZZAo0)-E@BiJEW zxO7hkR@5~e4A2}pyP@qkRwK-jFJ~t3nSGRo==9FlGVcB#)k*+VWl_hdl_h)j#bfwp z0cLF{a5bbvT2SQ1js%php;zyFuLH*1zV%dY!CO0*cwVv|92P;&T1ZioEf2vnbW z=&%^_ckuI#IAaxxD4-fccUMpko~IAvPvLo7msl(Os!swM}L zkxy;PK>Ts@PrQQ$004uUJ-RA%)Xw5T6E=iG+9JkJ%cD%$T!~~u8C!=cZeX^nN3RR~ zB8sB1I0k=ayBy&3gI*T3B3u^WDYpbxo-S4waK{Bn@^$%joNmM>m0FcTknM*759o*i zHb_QH;GQa#HTYVV9Ah11rMP{yYW!3)Nanw}rV3$a)F2C*!r-m%@?T1;!#V7+VZ~>x ztsUesrHI=!oe<8`jri#K!%KpW*B-UYy=Sj0{r$!I|9eq%WdFgHq18iz0n%Ts>apG6 zm&`5-k#7)EVUnUu{YKO|ypHyZq^mu&4)$&hBt~eF)t*Xn@&v4T_N7vbIET*I)E{+l zQT0X58DXPp?7jIX-$gI9)U}8jQp)l=b0^x2SOTDpC|}ixOg3=pAj^z}qu%ib^>O8i=pLL?M;1KfmcJnx# zmCM(j##Xzb)vz@<+BRmK?1A52Pd;xfwD}qlob^OsdH60?hsL8`CY&ioz4iJ%WG1$( z$vOjDzE(DT-Z0gcA{i?b6X3yix}j)P*#Sf3K!GYSH0*8%jVGr_=`EDBByL%B`{OO~ zDXC;&s79>95W5I`s4FLuUhh>}$IagSQ%65SN=kHOkX+e@zONKzsu^OJ9GwzBYp0Oc z^A0V6L24xKNiZJ*!nRV?U4vuJ5SlePCvu(gmXWz#SmdFhY78cC^AybRbh_*2scd)K z-~7|>ATv4mtqyP1E)0U1x>~g+$o>M7!kF@9MWWQ#+aM^?y&fcl(o{RmlNQie)S2Ge z&|tVU%e<;MQ)SRyCll>(Q3s2$`n`hc=h}5 z##wYQW{Pw>%Lp+7=1i(-l4qjM)v_)qySngtRwMYzibs_>8M~R{QqM#%71;vQ8HEgG z=dY0I*w^eFRTWCo$5priK~n`7Bt8qTC;r)+e@44;=^|u=?jiG%Co7V0blb@$6i}Ci z(H9UgMypmuFk>Obr6UAN$Jx2uCBH`^Rqy$jvB~ya7sWwM_GAYpxUy!L%mDfXf=X;u zD|95EZvNRr_4uP={~uQ;pZnKz?>iY?cLq6_dV+p!*{i8lD#o>}HnJ0om3lEumKDt` zWnF;>!P=U4wR{`WU(_kCByfRp?7Yqn1CoI0Ya^nm;F>>V4Oa$e6Z*9ac_B7)K_@G zy&t|aH~;*n_aAL#Sg=Zk*u++E@mbKwLd+cefN$8F+e_8wbxT|zZ9|*_GX!6cOEAxN z0#A5TLfjBItGejTR#8LDNWDi79dR?Lq?ovAHpwVEOW;}IRCGZm)TSAg+PGTRQDiz* z)Gn))9k(R30sm}MKWnvK#fe^J*+rGPtlJ>BnQVz+{A^jO%w6(fP|t^Ph6upIj$lQS z9X!d`AvKj5BCBGg(;KNDK6?IeJbkua)o7m`y5GTuXc5Iir0pt~QJH>AMQxu-*{uQp2s4h*n_%=R7cpb9m{qS(9Q;Y=GJtg;-N@wf znxr$867NhV%$K5^{pL*Wj#BOK7hhsmc@`l#%FiIG+%T=E!ieOQki&*+6a%hM!X{;J zV_|VJS+d6|Ww&b0Rrg%XkUvj48zBT8&Dh!IDj^ulTWvXB0MOc$Y6&Ub=|u2U+fO_* zOK-JHX?|9}JexC3M>YgF4Dee_D)E%ymX5N<2$HI(JW~svT}?7^!!kt^M6?Jq?Dv_| z0&-Ud9h|**W}O)^Yb?bSyn2$2XRc1;%O`R)f5A&n_M^|vqRW+s?oQ^MF6z3Z`|AAw zY=o^wQx<(>U>9py>Yj2!2vWwj^5mH${bcmm!BVwHM@F8c~ZiIFjmN%}%-_+d#jv zrv-SN?t`-I4y*y&s>&l(o8~Mim<5#>vnf|IFM%p}4gAtCvd=#B%lUAX*Dlk|24m?8 zs^u1AmbHxXvicfSD3^5*C}7C4$}o^7txPHUO=8>0KKPNmP`+9ZUy+*wB%Uh}UwH_> zQ-L^MR3QHTH;(tOb0iUPJBwrl87KA!cy=;`s{NiS)gcWf6-sPpWcLm24JvNSDvHy+ z$pWYomy+b~)pV$a!lDZykZiFtb$HUQQp^J3+M{DF2Vl6}i?n;%cJm>w#A^@X9}~qb zT@iu0=Rt)+&~@`@+mN|7WXUzZz+_#u!kIrF41%onz&?_xm0);LTTb*fx8b$Rr5YK? zXX<>l4oDvf>m6LE2Fc(goo)l;FPRfq)hS`#GD=${@?P_;Ma^{N(*YO+814W(P=&c+ z-lW^9;1Z*ma}6u;!l;%o>n%tgTAAHZTiT`4z&sB>m54zeknTW0@@<0*HVoIpOj1s# z5b_7@*`xOGXD`>eHP5vN?mN$U{Ka#gdpT3z;1eD86RR0Km{JUf+Ju+=5MWy8I06MW zx7A(rr2FYzo6_K21Gu9uHV;5ku?kVez$w!@w0VyT)WAOw%TT1AJiBhprJ3jsL>QgB z`4`^-GT7=zsio>PMxdl5b#GQ67&^cwAaLsJmgunv zH-2@#gEdj$32rI5#=t~|EY(|PI~%vWgmPH1ZKYEp^`6RJoa}&W589nO;LHo-2XDOk z-bLUEE3O2&0?LU;7nPgixPuq&(RF9 zvjtnRdbTh#kK;nIv2J&fVYeQodiNS2@bCa(`vFe{0 zfIeM6xmv8|UG*u(k@;oSBC(60rh{dQAt5g?LXK$!qNOT)?Y7$OgKt4ZWVH+taT}c& z+v({~d-kk-{qWI~@%SZF{>*gX%7gcvK7Hw;=5xB2x|^5?#Kl>-6adA_aM;voBnZmh zV`6M}1OT~~ zJ=$2xE~CQxnoTfj7o0l$_96AK`dI4X?|g=^Ws(lo-bdm`j-z_prAfiFC6-e+Q-UIeXq%#X z-YhuTN&Ta#H({~DJRgv5{uMn%55byzIHa+5vYe_IR#mBx-y~n#f|IYXmnUR~;Pgt) zbgQT-uJS8Wclo~^lSM9m47h5OATyU?P<{Dy$(yEtP87LbYEC%GdKV0;pcj& z0VT+|QyH6T&~lZkJ$xJdy`9=EdA9^IS7I5`lr5{N?;h~X7w&L+p^cFzysfHt&Kf(8 zvY{4qyJppuzzDCTpC`fBNLa3X5m#>hwRfP=mjxi$#ybkKb>9n6uS&I)EoxjV#x_eF zvKr!T)bJp)CFRFP?o6^goKjdaI?Rt*$A$3FDJ@`@iCu)SwIZ`Ho6aP}T9|}({Gl&r zVrOZS&d9mYVAs@C#`=;@x~lPIYNt{d%^<^6M(jP>y|o^nL}4!-4upVofwjRH-OZx3$s;-d!3=n@(`Blp~wq~ zQMqT#=?PAf>eZYSoYO_X$#vNu$65Mfa@YPI`K~n1;7^IP+ zgX)bts7xLBMUA^jstd$%!qCmX{toyO>5Fa8=L@-a`DRpUn7Aqt_Ap7bYCcGYuh}HF zm_5{8jYSb2CrP|PAaOx8h92w{W$Rt!kO10ZLFnu-^s$>ns+-rR$Zl6Rjir(qPj|yo zW3nOAB{!_TclO=EvmpwVm29Q82kHR5K`W+Y)`1!7EeuiTQZX3P9bueQ+2BvCoS};2 zJ$TRzx!rby9HKfPB%oSd?<(r4q;6n}%O?@}&m5Tb)32UAeeqO*`P2Qlz4)@79bsL2 z6fake-<}kly8FKI>W7bBPZjH~{5YpB1EW2D{E*!?FV<){6&G)!eQvde6#~JOrMq;H zs{VJF8PHW0S5XRNJ9*hh%PO5%$wHE(DR8Aa2k2d}o36rXNnQc@0-)Q%kcOnmD$8=! z94apk8C&#mqFQHVsdn2{du1wc+Eshy$2oQSo@+mPvK|r=zFN;-unjJ0%}m{S0HLxD z<0EN~wW4FNSwy=HTUMUS-Rs#^WJRdkL<^Oz5Y+q%KEq$s2<#+uQh@Z4CF`6nNkb$o z47G}@T!WPer&k9!5s*X=@Jn|nP2Q?a-YQLAnQ5Kw+bciLS#{O(hpj(<@vMzY4Ys^} zUk28;qYQbRk$b31tQqHyQc$ux^owAVtnBIR;gDsj8VOZ(4dSU1nT$y-^w5kMoIDxW z`;uuX$05k9h6$cW6LFK>obD?!`5>on>JEPQ?fG@Dd^&IIt0aR)yl8|%5LVXNB9KCb zGG&{(SLn&FV=pjRrWl4J+bDNh$$0rCpDhOiHoMntB?%H@b9S?ha*_U--&w_BaLzgE z(Y(~s(LJ{sNc864`1Gg0e*YTpjnrvL*nx!)zAcT-P$khM1Fybhva^+9C9~E;l9+;A zueu#lcT#@Muw_@A#0Ox@5Ik#u)#zR4j7hcFw1-w86lEmNGUc?2NF&a*U^<}kt3q|w38&Z zo3tQ^Py!Ye!ar4Bp|Tae!s( zm0r5{E$<JCB|6+|7mv7vzJ$T=F)@v`G_1+6wzV?mV8MM0Y!4Hl?u^N{%?3_F0I z0E+xQtHOP?2_#i5lGS)3wGDgS^zzHWqPHcRw5p^|2-+7g)we#Z@1oXkF*(v2iDj#L zrq={^P%*tuARxee0U&BoD^jXbNZzCdhE+azs&ek592eO9%WSnz6i;-RQeIzbQz!Zh zTr_pA7-nxWWTbdgbZQgYX^qqSTmXL(UamcImvh{=_3v-Smp5L0?{b_YPD`;^%>l!z z_Zy5Igv0Eou1eQ4@*tbU| zHaok((Ncv{wT1CrzKYH44|oM$d*m*!z;dys>5W(4yA|kLgqOroCGW|6ge|3^LUzxl zTI*FECU+K>mBFM9ZtKySxyH6zf`YED<(6D{K;rr6vu4(%>k2iRAnBmO-=j-@&ZGU( zO1nwL6}g?#R0EtHy@M>+{18tm!%CekFKNHdxgYNct8x zZKZ&+K>mF-3$0=`!wSPtJFl+jy_fB)wW^|2jdWu9#(Y}S^qa4z>*0&`+1Z8qwa4ze zk^Z}?@I1cw9xz|se*i4Qp>m_*lG*SMo7K~ zezx0|?zAM@QUO9nB7_>}Lm<7V5kkgK;GamA=;HG?|K_`>c%G0&rilEKSYDg&$48Ew zM&CwSYt4fAWpuPue=AQ%wPXP8$b@_&odPDKiZf|h*C3uJy%hPDOoyt>@pZ4 z8Lt}DLThI#HW}5m_c?V`BVkavN*L>))w`5t;IeYX&PN3kZGt9@0 zro4#`r3t7Eyv3-jh*Z_%zWI0FK|YGRcA!fSx{G3y2|mv#dvB?E=|Y>w@KP+&X`%{c z;O?_;--hc_GIFY{1_n*Jr)O>FWoqh4J{hLzLX4p6hFCeFh$uTN;X`II3$S#mD=^Gz zNdgUE_Mv+hH>9GG2p6WZjMc;kZIgRdI}F$vIoUqs8NGO%YRnln8Om%a_(^YCTAiQ- zqw*j&mC7l=M@u*PUHzqz3`iK1XxUk(>+R{+r##@ZN9VPU*B-n(dvDHb9p8BM<8ATB z+v1P6#UF2rKi(GqF}p3ke;thA!r0_S-SCu^b?yO6h>dS-d|ibNB{u`owM0F`Zk-Iv z{wv)b{w>m(hD?~kmh7Q1KC`gXW>8N_G6BNvTbGlcZ)*<|mA8q9%;Iiq`Ln9BR;1?2 zu*3{Y=VPT|VNHRvm;wq0&hlhy52 zyQ0RvI+MKx4@s9d69l40y`_4tZGas*-c?_GlldwUICZln5yA^SM=(w7;H;u@)Ujmj zVVrM8@(wcE3UiiZ{qQ}M!0yqt5MOPDs&i@3a%2ItOhj^g4qSfClRlOkgCx!Q3vB3|YU=C=;TkYA`2Z*4d@#nTRtv zRVPO-)q{Iz)hxl{IQ%S%CCZmSs#2caxQ)0KkDI$~0 z#Yxq~XA|T_Cp_(dlT)%%a`&zf&J8^g5myXT6KboH>QR&#(WM2i%~Pz&6eqd3F`?XM z0JH;qgBhy@5U0{pa+#Ae)v4ytrJk*`60s`};hiV&AN#dF^6QWM`Xj&o$glrK;@9s% zzt(A~itdK=w??d5$U%US{IC*tWAPS_Qs(6keXE#Owh6y2VS#J?#pdZ$kK(d3Cv|B6i+^msQuizQc zY&o@(Ct{skN_$+2bI~W*U$W3kb(~M$%O&{+fy3leR!>=x*}f8~g9;baR! z3dnQr{_>%8Gt{J{{7VJUc15_OM+(DRHkNy*ay8vG=6`Oz<3J-fqeg_-H;0v5G*aC%Tx!ffvJ{fVVVA(Nai?uHEHpWJZ1|z5`i*Lnz?JAi%;WQ!OeVE_K zja{}EQI+}mR21*Zk8{eR*Yn%5(F;vS##EK7l_{ei6IcWim*9b!S4nfg3n1$%I8=ip zc!w}Yl*~@JP6htMfb76Rbvid%W4#k1VbO4W3A3sOn?R^)@LKrNEUe*Yf^~ZrOny6_ zxLeHkE<`{!sV{D6pu=UWb>PwLOSY0#=f5@Ey!Zm-z1&FCY3>=silYJ90{D!)=Yj|D z7Do=RVsKMVW?nL#vLqv%3f}It+p0l+R4wGTAV>L>P<|-!?m8?S%m~C@%g0h>Rqqe6X2!l~x5D|73F;p4I+JF?TwEp=kUukL z8HQMOs+O!@>>w2~J9045fHW-!sR7)UTpz&9_?%Di$zZdG!zyGqUF6sv7C)Q!QWuO> zb0Fa)Kt5q^o#+DO54Hu!y^}Pg9GQF!M|-KxvrFW;RbXj#VgX679^MY%Opa+;yQdYi z)?`pu&{_G%pZV(9dI1xC_E2{`{Oj}e7;bu219I(A{7!{-bFp6fUZP8$v9n~mcSU9e za^zNRGuxo{QMZAIg|Q$IGS6j?GFheh6l@;V=mKtdw~B5h;BdP{S$d?I{7}>H?q*F8 zo3%-%->uqV0y@1S0~b%l(flL~b#@J(jUdmCw$b`@`X(_E_F_!glr zs#}(-deG4q`7e5{w@xydC7LNgtFj`ith?i|LDm+g8G+5D2F9Gj(Fq`RN_mT&wtn~7 zWG~nzi{j812A(oL#2=E{3_+FiB5C|ta&6napyt~hg+;|m?Ql#My30DSDN@KLdcu_2 zmPaD{CPk>8A?gkuCkt7Fg}1tFpo$J5%skxpyhflI5DX~ggRWU0Xm+%lm%+sl$$x_5RQ644pp1Amlud4&K*2Ivhc^ z7RxNVNQf4gP~knkB%-tWYE1=2NVt`~1&tlDnT|t^Y2vW}H2|DUG34?BM`mf2K-K_@ zE&^=~Ud0cikZ)yfKukDWFn_ZgyoVoYmeP! z#2UWIQm39q_Ffz{-UEpE5wU(mtRE5U|9`|x$Wc1LAiu@^VjvVHx+5>(*IuM-kcSxttT#rnQ+5wqXM#qZ*iz?7IRg)G{{45LSsFs*li7OYE0f%uP6AG` zW)01hOt=^Jj6-^R?0r*Zm9~S~IdsDp)M3`PRn^vewhFvyi$s`bl>7nMJEfHiuXoP? z_GGFMFj#8?W!l+cC~+cGW;cZe)|c!ZK$)m#{WdxepB7*?S!#U%*ZN{pDMavCJb?iM zEtTob>E+HW^9ulzKy1Heg1tgKoqGw!_1Fw+WSH3qXqnk}qk+OC7g$e~TRwTVe)jUw zvqelim(jZR(0ym0{P_v!{oL2S182agv+Blow|fjol$_q>wB6fmk&Qc3Ou+j_P8mJ| zcYBKfcT)h;R;If)xFMwv?}?ZWRL_9A5=Rh+DuuK;CDBo&B$H-y77`fSyWichQb~zXUamX9v z=08x*HzbF(*v}(^^#0A;d>m`RsY)UtWk0|<5W$=O@Y8!d&v_%7@Y|of`pr*&_11Za zwCbxTzZS?J->dbRz^+-=KP-~cOWuYQx)^ncZ6VfGD`QcTRMPiS64Px9h@aVa(W?QY zs;JFNUAOD90}Qr^LVW8MiHLkako5^u`C-Q4YmeHSAmAVWl|O1X%bW4|`}eZ^lz;TA zXS{m*E`Q;zPx#w;p2nYj&g+BEAN*;3Fh6F9j~U`a&Jd?|3s-)ex952L=ytb${@~%U zZ?!kqg9|ea+k`RI>fzX%IdGw55tAY>D;`kAOIZevAw#E)PMgAnoav&ax@cBgz03A0 zfJI~Ne1p;lvCcJ1C?%jl&9a?S4N6)Bx~GSx?+yV<^Dg#(>(6&vdw%5{d|Ll^<;OXh z=ihrytp19Bo-)TTm}SlPZG=`tR$P9_ufJw&A0N^D_m7|1{H{It?9z%*5eht(v_{6% zE!ku<_gtA^*?w)qVrW(#2QUrTw?sKvHDo3?hI~Q|WOb$znR(s?GE1m~L5wChu)=cF znFrOoR0p(ET0 zf^hrDjIpiZUi@7h3h8`HC0aIA@4dA>@vlAD2W{r+Y^-dLAqzd;XlR%_QNaKK#;J40 zB0^4p35g%tmb@9-Ok@CF8@Ywj`S?|rl^b?yiJ&`lLm8Jb*^>!ssWQ_fyyQfV3Gxk< zfMaV;y$##N3Ez`~z^sAQDrZrZ^r=uUo+;V>#xwrT!>@k-vxhIwT;{Gla+hxv(#49f zH(vezSi_dJ+l-{ErS0jWcLiwSH8DyZoTCj3^ zW*RqtZO_`+W4>9^dx*Nw=3RBa>B@>&$NUo0iu@2vJvvu* zZM<(cAb#LbFs9Bl!NUL|!X=141)qA(y_RV!aJ{&kq#VvR@usYC^H=VZFTFmYGGj@M z+e{MVv@F|W=k3mXZ{Qs8-g+A()7)8;N!k@w%U)uzruf6*dw`_2kqxAgkMUw|k3!pS zct0Py#4$EGHN#?tT@yql-EZ&Dye_QNaYyY%j^vpIBcI8oONY6fAFvMb3U(m4K-$)9 z@|BaS%|V_EE+MDqsn`tm44@2?b=y5{HePb;?66r~Kg3@7Te<;P&l2m~^pwJ>)4&g3 zJl75Qqt70G)n0slcIkcX!F!V+{pigqbbH)5zI{&h*6a76t!spo7u2tBS*k86cJr7~ zO74nW>H=U=8o!FJMrbPo)%+4NsIz*4Mj9Z!N-X!OITIQ{LiPC!WdKT4z!vn=`D_Y5 z8=?xcJ+UbDY5L87tUbvGSRkj^EpcU)E+-NAFi~LvT8)5OVjZxhrfUt3%={OAGATZb z%+5f%PB~jZeT7m?b~w*7oeYp>XMH3dVAs_*@Q|0A36X?V!`OY^{3m(}K+k3iGv!IA z;9@?O;gK@z;L{+`w$&9`piZ_J#YWIC>(_2keP)%nEDO35p$QeL9aU4mW zZ6pjE3WPQoqFP|HM*>pQHYQ=^y!i*f15J{a_F-ZSOwN6(V}@PjR=W95-@(n;P-71J zHL8U!3`meQYwtQ(^r|q1&5a()AVW>(*u!298Othk=49AS>{m0vSHrQ_breNPCoHch z1qNM(tHNWDwMUVXM@wG1PVniLw>@n;x;DxbwQeVFchJ3|xw=8wF^Tr0P&PnW<|ENtM*^$BP)9b2m$~?>($EIAvOTY%C z2C&~P;En2nR?oaFxz^0Gx(hA z&42z5+zgh1;y^$lFl&|uk&aR(b1IM6!#f?oR^97c$*Kb`Wv<dc z0OzfRt>m|X!~~YPWQ?}F(bzx<8cX^x3#AOwqT8ngJ;&Qmp)SrtMHn#@WKGm{_fN;w>rp?ohEbBDaIqaid{AW>G; zNKcEu*+6)ZDOFrD_5fA_RO&3(T;+qx8-h$7g9<}X@9t?mVv^sKDY@v*VRsLpWsS(F zA(MUG90Q`={hqPuHcQT&4o%eKnv3sX zWwW3oxzy68OXIXt^-p~H?9pjZyY`6PS##qq*4()FwC1LaAgwqbWiZITsHH*?>XxLL zT%LW2#QI`%`odIC&uFVeQ3iySQS}T>V)Ga1ICI`>BhM^178x(4UYYL+2U^nkbBFPZ z`iPkpQfG$^pI)7i;MA{YQ^+HkZB5#H!B*J6gln;gNo+Y>t7Vi+CV=eOkqeK zHubFY$hsKz)>b~c$W4yP67`3b#i|`M$jyy-<9OG(t*m~f6gzv%V>cy3=a$c)IVK>N zygNLYucnjB`W2hLNbq-*D2p3-^`PqSI+rUFu*lC^LME+cj?m>oEEU?++RbCl7zQ~kOnHnH~PoTmwbTr3= zfGlLoYf53sN_mP%uv-ZXsBp?&EI0z0x%sb-YGZHIr&Mf=RySnwiPX#yd4NsU*y~soPkTsAQQ>70P?XUrvqN~qs^u{mU!d@=ouYELfkjo&9k!> z3GuW`@7j-Z+N*G!mmLxMLXTeCjgd}eWWZfmIud57^x{i()x|FFGO~Igud7j^Ss7H2 ze3mCOB+z2lO}wB_aDxSzHb}Qc;7kM}Cb6Wnou3xWux8SUgqOq$U?Pm3F0HZG3MWU0 z-Vg5mhN2PyyJT3@cjJWIquMocC3qQ?9(8NPNgI2Qv^N3uO=r+y%Boj1wMwnjvu9Y9 z!6R+wke&@@hYT^+y^SZX~LdcQbY!NN>tCF1lY$@(Ff*5m|F%E$*YEZYLYa$zzz7l-#ST zvo@LO!WsSRh~r;XOI;Z|orZ`jKh8-N&7W0;)H7!I>jw`XOlEuYkLqVGRZLCkhp=vv zuJY!bJ^&6%B)%mhrST;h#$`uTK}$@k@oMUMBTleBO7A1Pttin#oN7?g+(uSRZ#M(d4?re5oQs>;+q=_`IR7Kg|D*THnY^Z3p{a4O z+0M4J@_<)SjXgk=e6yqHYpA9=3bk6$k1q0e$}H|~bRp%)hh8;6WHL*xv|d#X^Vk54 zTV8ANUOODVe6rYB#S&%DZ^8(e^6h2*y5aK@p?O<9i5m(Ba%x|avtzhz$&xPIG7?t* z_g+oGm6*OH+hOeTe7}9PID4z=@C|s5iN)dAb~;%zQ!W;c%r0Te*D}mM{>{%{e%YS< z;`65iB>eo<()q31;`UcAMeEsl2it6({! zi_GK%{~6INSIaa`0~mols%3%50y7{~B~K7ufM+H*sO~_ZA9U7q0SJ2_YD3Hdu{zG> z*4_aC)(wj=_1G1_eB;Y>@Lg4>aZq(a?=mqbnnfqS?V4b^YB3J&^_u*fZcVaY*Z181 z?%6mq+rIMX-L3k3?mPd+tKXl2mesO_*9Spz7bBFfkP?!*^(9WimUj)##}tS@PY<#W zqp0Kzn4s_-h}@|hvKYHo(yiMItS!>WJ|z$VqxqGz3zF{pq(m~+_bRh{ck^E#x3n1m zU~`$o78oQTWvC<%z5#qO-RQ7_-!XxUDpVsnDe zfr0vTfM_$h6aZMhCAuj>y}X-bWw8U z$*FCi_+>%WA)7ER@ZHMFjK`hZtD3Y{oy>CBD@E=1^1w@n5>!{oYn6h@grxDi&bQ!m z*%4KT=~K2I&w7Es-*cu{>A={H{@%7`7viPP%W9c(S};A-S`9!9~>$^AoBE zj8OtMz?!T=G)r$R_4}k*^mls{NNde z2Uf7XBhg)U#?z!WCn;PaI)HcrGnB4w@2!JdOGC**wt2#SXp1`d%A8yBUPRPRng)>q ze;pJM9Pd0~3f$QEVkz zdrx@=G+-DpHQDUz0DNV^nm97k$x4F@RF&%)c%KLCtKM|+4FSb#s33;WWf}{|%&q9` zs|kFG#>Z5?KG^%h&W+#Pl;56XjHMbAxH1gWJ8+cbqjT|x8oIYCiW(l;$kK9i5HyAx z$A=KuBK*XX@JC`(*q!KBE%$6lm`~^CmB*4Q-C}lO@FM|5o&gM-fDU;p;xmX=MK5`NOZ6*h z7sW9RTvj58uyE&sD@-BlZNqY+^aT@3(j-y~i?c}bhArI4wlEXf$E{w;IgJGf$P|m8 zGIO5^ylHBdc8HIc_-=UnjOyCQ2OschhTI%8DK(JknJ16{^JEq{p2!iUrltb+Ud&oU^)YhR5Gmbq;Q>*#A zPBZKqn5q}u*{J~>ga?z&AeRA_YzfpYKjQ9F%61Xf93Wmep~Rr35Vwuw>DN)UH_V}p zo{l8u%i%f!C|6fnYI3AmH31{ z42|%kZ0z>o0|3wi1CnQkj2cDz7$Jbup@rLR1y~+8BV|Rk0uiahAl4AL9jQlW<~}S{ z8>wb@7q$WME34UOF3pzH;GH^7ClRux7T(P2hJ&hIXbe7hj1GU8zA#>pkK%|jQmm2{ zh0$>C0Rs^LTx$A;aWkB9-fFH8q*%&rg)Gx6M?{h$>sXNAZJ@g#%sdK{^_oTh_A9ID z@$}0tUp{&C;_GkaI6hmy{OYXe`P##HXMI*YJJWgN)%Wg92M$`Te(dh6i|?Ps!u8ALsS@{xvxgKmYdd=QzN;Q0$N;^J&J03;5UvQ`(#| zc^04d(sF>!q~ToIMLCy*Ux|-(2k(20-g>ZA+x!oz*>s-6Q_nH8+9n|sS<}g);BR)Y z5bQI+Bv}FmCOTgul^_4g-*KQ436;3gNgSk^&{V`zEu@OX1#B9+hHHMobS>{wBbi>h z>M_Y3kHk-0G14`L6agT3d8o}YOBW?cvU4q1x^!8Wnh=({rx`>*B6IVn z{0#4oX_TeR(5kQpn~<(FytNjlR(+;q=~)O-RrfgRA?|S77>F*hWuNK-6Yzg5q+0b9 zO}CeGvV2^9hXXt4S96u7i6?pFs_*ECt{$?W(@m^g$5bm20N1EHM!AuPTLHH|1P z_j;p>rV)m!6(>*&3byI$K*@s!mYE|nC_lBu7HTpC z$t{j>%7G-{D*~Mv;23oG0$Q2V!Uu-wf?^5K1{O0!v$fa?eU@eBUgX`p_fW|maFT3m zKzQxYgzoC@7)2^ueRWBB0|=`H2#LxX=@Zwen;QF_x7(k*(%d+znojrTwFmOez4?uT z+iNcg{r_92^M@yYau13;ji;8x5ixWQ;PQma6L3^RS9!h?Hd(r{!PqROI^v0e7Xnpl zam5_@xl87XZC7(3ei~wDtO0OM0MkjoZdY{$BK>i-!Gd1|OIIW&mYe_KeW>8S`5)hx z(~^5vqa7*?NpJ%6w6FiK+DNWFYqvjOdD&T5ef!0ndSMCycD;c z986_~SWO0%b}|>U*lS>4h8ciKU}iIIUozkX{+!mq0QDSUl_Bl5?Lk(EJ~FBE=DeH{U@Q)sf}pa_y4ix64aPX$J{1I(@CKdg!H+ zlrV`-^Qt>sJ5{C+n!=b3rNF_kJ#l_jTb%0GKC+ZMu?7e1Ng=6^X5bcA7%;bMTM4%1{u!z4$!OJBvf4=MRbXQ}FkeV36xoCN2tT^{ zUytnET$+R;9bpv^L|U~@_CIrPzK8Yw0d z$OLjq7!W@iHycZB-~6=$sSpbJ6ENpgU57DbFXkgix-Dc$ zIZ0%(X6d&Q7YLa7D{kICmCR~eT{K$4TnvX@IztQ`Jm;V4c- zBSW27`JLc$+7@MBHCS9d#QyJxJS*gqPc@FsFVR~g4ZH&C*BL4)LS21<4KI(qxK(1Z z-1OkR1#FF5h}yEror)?K#9TEXZHba?4^3ro7)X`%j>tnc(1Wy_RDeHcb+O$1AMZn; zKP}I=^5dKymA`!U=;0R^Ya&?!sl+Tc+_klu#JiV@9GD@=6q*g?B}(cde6WDcQEn9o z-QY18w#sco293?*Y*RPi#fXaZQe4osZ0vN)r-1Ry+EMj^CTo8%gLhTlxL36q_n$o_ z2g&x8gGDAMRj4W;Np-_{kOWc-x;yIX+92Xmw~<0*_c_Ct*jgLz%BQxX zYhXFqkz%`DLnge$9>X4Qhd)P=4t7-y*5H{)s{AhNOhzYjs-|CRALiw1H>6&|MTL!g zTBNm}|Lo;@c6RV~?NPhCrzBp~CyMu#J+IDd|If>Jz2EOVx*FZSk1b0%+X`PSda%t7 zvGg#>B9`2ij111FAU~K<6%4E5l(doC zB+Dh@iJOpm74yb8bxmx5RnP~L&{mzYbxy*o-ASz&v~K(|9=c)2EM@G;whD{kG!mh* zn^=^(olOo8YZEe0f$4kNqH@|+b>%_3c*^;0hsv94?~PaQ;dZk3wE>2FTh~TXMIIn3 zyAt(ER9{Wm@@1$_t(9Ai%c*GGozj$*{vRNvgUE9+(%X%Tzuw4-p!;zgg-Qpo=|-z6 z_c*2u1P%soe)^mL>(lq3^5?W7= z3!FPIu&-jB+=7UdD!Z@@da1yj@*g!RY!>#3D_$ZA@GMXm3unb>VO9(aOr%E% z%5PDs7zd#s9N?LimZX*$EMqtur4~`Pl_)1tKW)!E=1Q=P(uuljIRKtlJCfmubjzlWAV9B0FZ*|Q_RLoL9 zhc>Lf9U;Tk*=HZ*>Y+|B(kwx$z%QkWxeahI7r^alKWis}9(T2F)u20mIp6{e;j1dQ zb`7}7_*DwZXXs_Q>?)KGVy7m@A7kQ~!g z8C8tg6RVd5TPrb0`7VtCU5M4QHQ@)LGJ5JOw%u&<7xX7d2Gz=NFcQaQUz|d#a-d6$ z@k;#IStUeUasdM#lCmX1<3nW{%mm#JK0`)}?D8r@#jIWf;3E;RON<4|2IMPHu|t1# z=o&Bu=>S-H$oDc;H|}+}2?LPsEP(^GNx;g)ZGb)j`kZ}TthBxMs9mR*`uNjh6OTxuZx9b zw~p>g^Da4gaCT8&o0~LQGU>;z)28STA$^~$#A}b>-P|Xf^&!0R>U*~mjoL0f=_3Yp z(6NbO0R_HKKAhz+jC4nl#j-h#&NlVnQIG@~F0-}4_YD0G-Z6x2nAX50LhLHJ2BI&609rTT6=m51$xee1PNL}R$?B6C!JWR=MVgx4o?=bA?bri3Q1Kl zMpYV9mfOD8M#@_)CL&Ih;Mv^9c_!aMFyzhzRS(-MffBzA4`^c1p|_;7#yo8&`|Mf! z>htyGxwgr*$L;QOsPmqKH(q`3)*pEwsc8d@1WhGH8F*ovgUJ{mv8+zJuHqIYho1AW zDazmh)Gc33QUshe&n^u^>C-a)3KYP&; z@cTzWQMVPxv`mxqf0iv(2M|(XVM7rx`tCaPY~tQ=s+S`~;>7f%EqM8suW0RjzqVGD zXj&-4bh+#j4*X0`dP0ZnMrK-b9T7&Pw)EYrC3~%#|N9-BhB~s-+97P+Cy7wH)Ojv5 z%#@g`)pANLnGDp2-Ib;TzA~W_xvmk^J6b)M&jKMw7o^*v^DoWnXtlpVwh=-S12#h$bA&2VDc*m~F z`kn_dEt?A4O+>X)?9TkZu4|^8mu-Uyz(wa`36YE=fDBMsBE)%qP|^^mvG~eEcjpT9 zXNcg9SMQS81C$pZIQQ)`})5Z-7Zjd1h-9M}JrE!)Ug6*L9PGMPV= zszOxFj1KQMIbG%SWw&5>K#5^zNmDv0M#PbbRwIKzH7_s#7>ZPuI^o||F;N1-WTois zp*~B`KeH+Zs~P*||9uB_pIgcjQo>+ameD6MNGfG2d)R6vgDdyxmQ=dj^*jo>r}k#hSpkGdYeRUr8XU>tR@ij)bXt2nPK$BV2imPj}-h zV`;YI(=X4CDy}?qSMd?K|9sF>%vs0JoxE7=oZH#t=8TY$O?K^SjI|m<&1JAdCp?xR z>!kvlQyHKDNDedT$n`C2+*Qxn)N3Iklyrzi3U;30M$DB>sQiTtq0OA$jrBC;)j3qy z!Ty&E91&pZx-!q*poLooZ)Am_mH>Zrw3bM;VH)Lhoq!1~>H?>m%!H)Osp6^5?&J{`ASi=Pz0Zrayo2?9r3Y9__Cm{^HS#&!4`0 z@lb!t@6Q_ht~{oHTy!zPX(S7mJw&8Q+C&v!Rc^mlhCeFjurb5&Rpo6GIHD!cVGy5d z)%eT=ht`3khA5GJ1~(X6Wt*I=UB*pNtaVbyh7~H`W!^zs*(*Xfw(C%cS zWqVR5T1jMYa=ICzs_ojX43Bi-I5&tsFx!%cGB7dn=F)xX=0^xqpyA1KwOQ7&QKfnz zrLB@QS1V~VuC4Z=DSZ%PmOqu_mH-`ynR$M329~cpa^LMF?=JGjd%3+OSD7d|HS5+; zH%ggOh%ju)RP3sdT-l*#l~mN>q#*9uJ9UCwR)RS|gp#BcOAh}8VvfQJR%)DJa!$m-9PBp%_mL^D*jH3mElt{8mqSvPUe zOgLlgq~we0?cp09^#{Lp|7<+)m0#O~O5HO1WS*_%8zk__&KPX$sJ_D1TT7*lVT`qX zY*&ct!&J2=u^|ZfmI$zSii{Y0T@gT+C}sl*MhcP}&Ty(}YukMHoB%o`5h68v>*nwI z$^GwzX%9~jan(hta3Zs*xV~oEq$l+zhbb|r-h9h)u^f>EFeIv+TX7-lPF%rpe39LshR??aUwN|Lqh zUO@`(0ek>z^0^w-W#^$jZt|GX>CA{$<~)$Fw2MU2oT)x-clZcIA^WHzIU_+b;53Z# z=I{N9?vYHC^RwdM1R9xQa^8EpIf4U>!3$gr1klcpghP*YtMp7w+h*7-v*EcJdVVR+ zYt@`4d7$CDPZCXDErQp#@n-r?LINOb{UVZNv7ra%MSWPb9Lqb!;SAkJKm^#vUQ3YpHM3)N-D_dE=vbmHd!7dJB69=w zFzkz*t9pCI?pZzLtOB@*CYC`+{#01@2d|WnSa)aDvR59sJF`K(m<{TEWrN|mGm^J7 zb9YDzp_4tdkLtHj9f5U%HHQj+<-b7!49rmfmdLXBjzS109e=`=Brg8F7tVZXCyZHxx z@*bd;4*^77FshHqd(p_`hA!XZ>_+Ncx(HfRdcIYZSPoW!F9XyX?a*gwRc&u-+BlT| z$Qw-vfLtF9O909Py@*jdjX`s%^62kXJ(2QME?{{4_&J-_50X569CpLjfDV$t;Q4Uz>f@fCdk6BLjMmkzNjUVcBYVyk$vyD-nM zRn1<_^VKosKd2~Dbs!g~`XgsA(#4TwpRLZ%P}n5S5MALEM;Vp8;G8MduxI%B3Afy4 zNmfdbj6d3vS1G!Z3~fdj^hy$!S-O){Gcas}i0r0RcE~v_s+)i4CqMn<-fx|m;w@Vq z=4%aUVAa9WD=oFd=~22}C4w@C4u)cC)iz=m<5pC@EC)&x2|5h(>W;7!S=wFteZH#l zHH>L;?Th)yxk#LSlXs02j3pU$ifrFk!TQq+=PQre-MY7D)!;vPjd;K~5+S0gV&5aG=~e4l45Zx|Br+n>Dp&8J^H|LL#ZTGFWjPkjheR&ZV? z@piMJv+PXOHMQh%s?1z$W$}fgzJsa(C^-@IozzuKQLC+59jcwR?-|!1WfN@4=%B_` zEqn-613e<2@@_%>0_SBxupUV;t_*%w|2NU4g43oP4ZvZV09%vFd6t2tO<&Y3I3>_R zuqB-U2moVirV&W9D$I!hJ5qIFhbCI5VNU^61^EqWNLfY0m1J4EY$DN{WSH=mv@$ZPek!Ad&Y-uf(67$+P4RHro<* z26&jIUL<&QA(!kJB_`mdzSJ3RM(*m26q>00KGEXdn^^Abv`Spjy=idnpahNrjr16{@fm12R&EGzw!uvcenU?$Ao=P zs}6>w-ty={zFSM}1#nWiqR&0Fqt}+|vTB4xHg^L!v|?b}fU%*MrT_w! z#hjtgDY`6PI9RQ^LQL69Mcu;am4Ov+^;bLFcGXAA%g5u!tg87XZ;#sIXV>-jonHaGvsJGc=f zw@A9V=Q>G~2G9Zu@#yDXkftg3qpo(iP1)#0>` z7X#ztmMcCk7N!ku$Q}Le~Yf_2i#w5$tzS|hS@G%S;nLA2fhCk{tT6QH)%_zKl(P9+F&HJDV} zNhL!dOD__fyj0uzEOkqhzV@_d&H>=u;c%H@x3#QZW``W9nxQ$ZJSi@MYvoq^S^@FL zfAWj<{BYgc{J(Lt^;nt{Alz<})7$|7n_5^|{!9zJMe3GO*9~kQxWEjFfYh4pDX0O4 zKqI|MWl3qNY{!;h-b=dq$KJ(W048QpVF-USvH|y!HiScZ7c6LUc7=-w?4=w3#b+>HllI>G*l6u-8WFkpnH;G6t@}VIP*T;~(tRE~#z9(=3bGTU7nFbP zPMruSvyhzw>^!gGWequ@a-p7CV}3X*@Y*AH_et`3@6sEu-h-NxmCLRQrVN=x2Q`(v z^Z&8;o=tjX*_B?$#B`6Qr%4VO3`UGXpY=fzAdWZvW8R2ktCK_(pahD|{tdD-^4@#z zz4tEUW~ASuZ+g}Rs=DgU7hNHBf)^+zo8=OjZ{B;%-fNw+_gbyKZp@g6_Hv&ZkY&W`(9-OSv;CXc2wsnp}uK^~@#EX|G(9sV;3Q1Z?m zD5ch3Xn34S4ZN~Qmg>3*IfF4~lD?{Bhk%VMdvWF}Zi@x>^?le#=> zXCr78nR)O9sk1bGH)rDJ=9>WRp}f`NgTbiH%&c zobkMC?XbZyg~+QmaNa5RL*JL_)FCAkR5GJeCB=0djI;T|>~M7VV97Kfj*45DMfR$Z z(P7wXt0jJ`>TCO460tfAz!ZFdZ#Zt)t9k-MuVy$=4E2+%6u0I)+0fEV?4uQswdk}Y z;Q;9QkdcA2Br)5qyP@kIvA^zqH6qR3gD`XUu-#-p_R#Zss0IJ6uYYvNPfDl@eq^A0 zF-nLyDVH?Bu=@Esd3k2`yQu^c^}|R>i&SFzf($EC0BQo$SbK&b%FEUPgklsgvvQ~f zh-EM3VGj}W!N^-cY8xgon%B1jA9v8Yp(1B@){y)CTrRF4fe|Z%nHH?%dh^2}!21WwMA-(g|RMwN{*>&)wwr;)4eM@!* zrhQ$1eD>p9Pw}h!_2$hlp6!?SWS$#StVZc*R4*=b#T{6oI(t{A=_pd)BO9{E+VXB_ zE_ap(*-_KxB^<2kFr$OgCS2LNl2#xEKOHsZEa}NMo$qIC zZ!^n>@E&2G*gTI?VFGrMo)9cysu6oZlAKp{oC>jvL|JCGa@|ouk=k;N_o`8`+f5_A zlW7U2PHH^GuIVa+S5)Rqur&l{306dvP%fgf^wx5FVCW9D;LAhGApvF`KTq$N*%0BQtJkB{88s+o8UCph;6Mn#Zj!i>LEO zjYa6K#Pj|2?d_jGqJr?rgA#_5$L-XUAuCOX1*0^3j}F81Ja=KzGANDBv!t>&NUt)Z zn5vZDvPvRZkwsbm1^l=>Q^R;on1qZ+r1^AQgIQg*%L%vnaQFdd-3&^bcqtPWhWt9t zocuVqjun5XG;&L7ULxTzrU6s}NO@VMlApR!t#V_ndd~u}Kyxq+m1=V`7r9UIVE0de~(i>boF3V0ly#?2_s{D|lwOFnES*k(A-x@CODOf)&hO;M`D%XO&FQ-?rDNYboZr=(Q>%>vSCBQwN>c{j zl`XvzI8;8wVb3WItZD&ly{1B};%UG;#lv>M5=PAd1MqBjNKWVGYI$?AvjTKqMhwyQkRiSHAgknl@T#|Obnvj3ieT(d|2SnKL)O;Xzp1#mO0dg3MWQ@t1?F7GF4^sqJO4B?{a?yx~S;nlJou*ugTi{kFq zuDieh67y>5wcYt64yXlRDPrZ-4#~ zP>3f+^I;iHRd4gkbN4b;WtoWR%E>GMNo~mD$ z#N$pfVu?Gtwt~-2ZG!3%-BNlO-Y1AkC%ME9XrEG1jF-RT`A2|!pMdzI0`ara(Gytv z^}*V&z-pfCpJ4!TK#so|T23Rw*jwH5o?_F30JN%$1T+S}g~y7`5rjJ{&dUCUJrCBC zxjJJn79oSTp#n()o%4K}26FGL{-3p#|jVE(|h*gTsO9SemCx49#^Zqy4lKu`hD z>wNqAg`Vr-+=k7dTL*AsJ*v(kZg!ZobBG>ImPVj6 zLIO*(4DzpZljf4LE9-EwwOh~85@d7^s=5s)!J#$yOeoa?UpCngYe}%(p;akE*7EE< z8~F!(JKy?W-lNAZqg(@wTr6%Vf``~NSGtB1kWpBH3+eziNRT9Qgv~=fTlHA-H8SFh zWHY8vj?Z$cfjk>6GM1*yk!IH9K&eF*liZadD6+#dDP8`~=Rf_OM;Foydv_UZ7OBkV z!w3VUM9?lZhSH_k!YgIDHv&;)Njp+$zDWO@=LDn4(14V{U`nK{F8J&!nUw6+lMUw5 z#nU1^#y}{589G%3%mGrU*Jtfr@nr2S=`OEiK=@YSH6($RcF5>yyRs7a!UV;+EWK$^ zwS)_b-HzOmtM09U_iL$7z_C7!1!m|F-gP#2Ce4fD6>AIY-HB^6k#qI0&)Q$C`!Cv8 z${yq8ix)?c_N&?6JZxGxdkjx;csN)M01o~q<>r(~?}z*diL|Ruok_I7??hYy&`scR zm1l)H`d%3hbymvc(Xjz^bNSX2teC_m0Y*fTPtX+~T%82R;dS8SV4z4n$VKs5gz@ah zxw&?JWBlyy#eDYa{^eM&Z+bsF;Qj_3j|dh9^pIbwV}e0Kh`Sbw&EIzs_VgR?fTg zeio zMSoo`*O8{w;C2IeGv{9zsx)BnvBK#g0V zH4=QePjzRFZu!rhWJ{FmSGRKSonz}wRKB#*IbV|9+cIeOQL+YdAnDVvyCBY4ievJZ z4l*Px!Ixqo@w|(XplxuQz{QR#>i=@=Lla>NzO#vPpTK65Wx=3(O~c=%j|io|Mx!S` z&UG2a=XYP+y^m@*R!w4M6bP##0sL0g$-VeenWorPa2H)x)!2~#mTe?+SSQfbfI_AB zWp#8)0wezTatIpg%on^7QUbuVw4DINhMuS;Xv)H~vLeIi>3z34-{2ZjVeC@g(agy|9FIxDF(wFEo2;~X+TP|2C}Mu|+OCFzh><=|AD zTtOZCEc>w4`frwob*iPoU$;e^{5V&$`y*i9i

oZ2?wxH;}6Vl!kI7^jO6A(Hd# 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

x||O} zA&+l4lT@-XKUXc8G}Oaj1gFeJYCWrzfddK3X1g(#%{{xfr+rW^jbna$2{d#MWr@;u zNL-eH+pQ{R*fXWtW_WL{pad$Du3j};B~V!^{=E{s8>?Pme@&2xx1?7O@dP!_bK~G& z0grsW-hAlZ_SOS<6SuM_&?xsE@7o(d0@$RFa)yeww*WYg6=6;#RNae8)0KETOwws=tU$;K#4OUg9`)EELYWz=0vB;CzYgm^pGDeF z{l`P*@ADyZ1e;1AVe86)^pljz(jL%kmit(;Be0&Q@?-FqO4?>v*eUtS#pdPTF5O#o zYgdUqnNW4bVX7CV)ncpi2F+r5Ht8NNHPT#QttJ%(o}u@RALlf&e<>4tWip8*?6fSO z+%**(Vr@-UKPIRkc|-mo^|2&UP@1rV8dT;EY-rw*&xMMT%lHq>NFtiL z#2k&#%E#>u;JLjFcbK~kBxKE!pul=Miy112_iGu5?2@LoYvL`sjm^bd(ir~-IhF68 zOXtcJ8PT&>VrJr0>+GN+qeRdF^V}unZ*A4x=>kTX5i@(Q2Wa_h*%U!lc-sm?s?l0C zK6pD5FplOlkS&JJ4ajBl1zP5qyG}H9-cQy_y6OQD2D!@9^s@j z$+NXiIcu}B6uxV%x{of*AKQ;V!n`rNs6fI12ReW zWq!i~gGsJ62BpbRvhJNERSe9KiApZ*e7clLFI#meW)FFju&^RaO+v-4>!vOHIRkHWa>&P6BBfmBRl<7H(QID>uzAP1*9 z2g0w^zu&yP@JPGyxP4#L=T$!2LI*oHVtZrXwyHu5wb}z5EJP|Ah>|m5Ffh#HWQVBu zDOumut48#bUkKa9P9Twu!cmgF246?^+0>Ow4dAILzpttW`$BkvZsmC4$s)_nL0*LI zK*xJ5d#NTwhvKbCd0wvcz~PS8fAuJ%}H5wm+h{k4m&p;kYiX z8g^xk8JSw^*l0z&-3n@%*h7xbp}_h=2dHJ^Gs}-K(WRFyd$S?MY7ehVF>fE6wX+*R zt~GS616gEVb=W(7ETe68iEp#llMiE2QWpzacXH;Wfo%k+G-l?}1ujE&0U=YwjZdB-n105sv0UckSKBxtgM% z45Cw=vMxHUm+7@@K)!3K`G>_nfV-d-Z^`I+saix*eT&RcNj1!T+O}0wA$9fXvb#UMUR}VL zTMyp{Zw1`dTY*2gw!kAey&ARbGw(aAg=E9tC?boySAL50dDoiwwF zO0S2}&s6o7n*{XQ!Cu+($si(@A&=EMCl2j_rqb%LEvT|or?ax#|zQ_{}-a~yAS>G?WM=ROG@aM^PBt81(mFB7q1UtwN^= z7}y5vDD|w}Y-s?7$|LB)VUiglal^`cfe)RH>*R`PRNE9}5+w*RdIUk|xF%@}pb_^K zIqC2ix7>$FSs9W;VC*VU&N}|Y@HW;iA1vv-MMW6w#2r^u;d!p6^`=W>+3(uTvJDc) zZn}_G=rUF3CBMl^Po?FH%jjKo^gZAM!|k+m zNEKOu&Jb75wV$xt-(Bq|q}wwFxb?t&bl~`SBKkBPIHVS_eXkSr!6Rf=IUBY!zHDuy ztEg02%RD06+)CGNsj#(A@`AHEXJV<_wD#}~4gdzorfg6RP+63{L(P<5yOSlo*>Zq) z{F3YDaPU2&M9AB!3;{UYWWB5RWvacTGvD5*MVA?#QgK;=k0pS=B&!Km&><8lw~v@j zC6AMsj2hS$57u`LCCojch&6`E@?+vsB9G}(+EhM1$>S`^`L<;4ow6Ce{^G*l=f-3B z-sqw;vV65GGk=UOAEV31s+q^AnqdySigm4=KIM8pSt}(vC}5Bd8ryl-ZY1mErCUop zlV+Ow{RF4|3O;vr%MIt+jH`q^B1_isrCT9ZS$*5;YbWMN<0?CSV!%?6*J%2{olE%S zNz~7r_w9`z=QPQGWWBy?oxtD5n=8}H%l8Gu-8)v@a2U60SI-*sFp^tHPMgRa6xf5A z1xk|G!j-Mvb`skl*LXEcc~i(sWH(+TP4>Qy5qSLnhrRcDw)4oYJR!}fyHs5xsXG*k zo{5Qh;NwJ~l-|_5%pcLuHzI8jDiB~3q^e7L8Sm}?G~RpfZIAcf{?>O%7Vw<|l%jdj z=c0s?2omR>drp3tJNI5IbMLiFhoM4%>)gQ3+@P$cce}GqQ0lj-Hn^`lEWMZPTAZel zBE{ONLV#RYN^gmIGe-6%yKFcJfb#~(KOCqT=Fe8LGpJE{2DlTkSr@67;Yoe2s_rtS znXo5Rtf_%QXkOW4;A}NB5OO{goY$G0&N?uIUGeEI6@US7K*H7p*I7E=ctys^KN(LB zk+(*rGz43gKQq}?XG4i4+G3|52RtzVqnWL|iO41lF_wU>sZw&KUi5Z`)g+Z1&-WR> z`Ks-8-{j%xm+RHV0pzV`@7=jUAM-Ij;)9R*7=N6vt3J7X)0_{bhtK7T){$xt%j{66 zuCeyO^AcJ@8z~8wtSC~)&@sRX$W*E@9!IuRmIJ5Sj{k2Rzk=hK7_5>aW@XWbL}Bnm z$pLV2Jl4S=myb(?lQj)(g}g4FJ)Ad}^vU?G{p977 zFP=PovYxajEeY;51|;<*$$`Q4mQ$vHQ<3MGQ@xp`^*2lK$-@WB zs5+1;))FXE3xp?Y!3C-TSuOh>8!)7azN%#kK}1zVR;rRs2hO$oH<#A@(0`5nZk-+Y zAtWn4TH)P~y1ReOBoQ9I)l_wvuwSfNWJgte!WD@kZ9C$D8Yac0;8N6kjZGH;3C>Gr zOX73<5wKBstkLuFxV!BJ69)!i@M!~}iATh(?TWh54Nz_jQs=`B1~=BZe`{dLveY%1 z2=Iw6>WRR;6KR=wBH3g=wC(Ev?Eub4bKS60RB;Dh$2m`%70Tt-2@vXE9~Qr@4typR zb-QD}%kE)Fo{0}=0J*BJDKOX<9Z#-2W3*vh9DTh@kMCUPt4y5=C_yzkENw2v z#dnPmqGcjOju!mK7dtyx#FFyJ1H@o}bt3LTf^pSKQT#Z`t&;6d8;v-+%^if|r!D^Eg8uB)^c5!bB7^0|)A-K(xO6pwrH>KpV+8w{!SXSK%vLW3f zZUf6QTXcdQqgMvXl;FNZ(pU~RCp>@g%lKh_HtIQprQpQ61u~V+KCh7e1q5JksVzqX z+5rJGwu5Ue}PKFT} ztq)MxMPJUkB7e2;|}*i{Elm1m2iL5c_KtIVV|+^}k}l|wv|I98f&cHF9+ zzGkiKUTUSY5*9seWj7Bt{yD>KvaEJ3BEDA(1+_%U313|kad@xpa@V<4!D)aazh zxRBTvTQRFMjgk)3)kmIr69zp#BKpH2Te-57cise|MYGRYlIU`DJd&E zfcjO$kd2fV)H|<&cxDVZk&p_^FWai?Tpfx}3+7pNrwVTJP?sK5QDNHf9uScU9oF}| zfAl?coT+Y%JRnUtrCws>*-9hU)aqNn-6?5M^1Z+p7zM8FLMbRe4A zDbAKcsRj<2Y?2OxC4#DPknV4Z{6;ypOHcq>`GM|%TTk0-d*G8_*CB{gF44E9|H-f2 z|NWQ1=>PHe;rK(7T&MA}jI2go2UBhQvu)_GaivqMMKsYKs{$iMz3zw7k>Z7 zv-Vc*=P&&JYp*`QIk6<8+U(Mjf>&=CZ`*CQT3HjnOD;@42+ifvB^D>o#WEi4SR?$^ z#<5ooaZf`)!O%zS*@Ei0H}uWJ65o*in!Nib&hG>k_lMoQm;yNNz=zM>=awf z-AR1|pPVF+5o(^*?V%RLc*67T$p^9pZar&nXP=jQ!2VM0fq(LSbe!xlsR?`1RTc~l zZ)HlK0;`b-oYw}k_F0wll>JtvjnC>4Z!9RoF>;lyFYj#z)p|Fx8(k8VR)Sa)Fl%vY zru7m=P=oEBLYUCQ?uyyfUv$R6xvIg^as0nbvO|_|)bv!d)z4iiL2<$fM{7ENgF?Ew ze6nmEUop$P&GNdB84EaG!)9n>r0f||>Z|Qylu#S6VWrjW<&0zyS*~&}k^IfCUi6oL z;pyjJXd^uP{R;?m>)CsEj_gMTu8;SIfAo99pvnT6KtIk}GR}QU9>S{DWAUfvQyNbt zq_s@b=}+O~Bg8|!*`N~q2spAQ%4K(56Hdsf$^>hKK9H)+tTPSg@W7*CFqg7<^|t!3AqIUbG3B`u(Ye#T*&Z)(LGSls4emvGRo z%h%x)-=$~{%OkAEXjS{srCitx0sa^3f%1KP^`0)UM@wwP#ZWc3`12(s0P`)n+qiU&>fU0uP(iq5Qc6IhEcN|08c01UTcr(Vj$J?NM^W>rS07|JHIR9PkXb8$I+ z+u@vb*?#)zv+?OuLe8461)Xbx3qS{zcX-xut4q^lb=8t!EZmFQk>%O#tXOBURYI_h z?JX8!%bXLCAw5ggY?llx$(S}q(=tXnd4^@3^h*gtJ#A>Zir<5` z?W(bj&=!mce_dCcX>VPZfvWV6*A&3A*hg`KG2vO8xCsRV12?JK;Jc+NGgQmO3aa@S z3vNweqS$#GcNrTH6&wq50}=2;ycwTfE$;PXEsTWURCkN4?0o>*FoTUjFzyS#08q8W z8*2xzu|CVHAqf*pY%)x|TRJavs)i3Zb0c{K3DOb_7&EX%q|ueE{%P2X_jxMA!Iv)4 zjDA+}`;%X+uU$j#7psDsKfY_IFe-r z(>W3ihcy-Tqbj?x2yussK@GFwCI(|Gj050Yg@(b+OKlD%@;WxC6lhC`O?@OR7fxl1 zS{)9VzFSY*O-@K2-unDz zK~x=!1K-X<7!N^mW!G%NGu&n7(WXLDkL*@U-0!_c>FY?efvGppM)-%McL)fPALb$% z@{tqNa!r`}wmt=XIu@1T6gs}e*Q=5J8DOW{k_%0IzF;Rad7!Bz83NoFEK?w3E`=0F zsf%|Fz{2uoZJDDaZa_QvxIwSL#|(W2u67bd<(1BX z@&{jh_2TL0?F(S`dVZ-}dfTacr*7%x`Gk9@^NGZ8!){;^J#*ndj56f(ESgXC_6yKq z3u&$1v-Nsbk^=;08n~qLLCk&}U6n|zGyWvEL1ZS%DFwrpc$C2t zw(%R)f^?Sp8!nG`0|&M2c64AguRhNfv?qMWY_RIpV#DV%x~*K_nQHeqAus@NNgbn0 z&dHZJG4YLaYt_Nk+rWw#4gpna;KcK?EyIxnd#kE$azkmyeHfwtk(El4B+FX^unqDZ)M%VdEu9CvFciHL??a0ag2ZygXQK?beq?*BEQ2&7YDQG@texgPyY0gH+PVdr|T69 z^ySwU`E^3wxmnGPXYmbd{O#B8%j1*EpXCjOs5f4JbQU?QizDJfpsPd5MPidnQfwIt zQGs({d$_D_ry#Yh6GowVMHyTbkcd6#bg*QujddkFm} zuyK``R)R5HWO9~1y{h^Rq`>q#6R{HKa%kOQMT`@NqQ8B0?86=XYI$IR8S@0q=p^lxPj^mFv(=mdfo1m{?lAqvj2sm#0 z?w|4Rp)cxG-<>?zO|T94ZS;(I;wsFD%GwV)Md>zzW_TUbSi7iTEO;JXO|FtsVtFqs z#6<4q?N%?+0SZn=&0o4YsfCGs=`rCisfX>$d#+NdHeFqbx{_7>sfm{HoVLqe(lvq7l}>Wl6eYI(uJ$}zK#PLFnv_( z^PzUIy|^%R{}?a{=_#?rW5-zqHE}8u;ch-*G%9i$4!EDxT{hv!e3F(Uwls{I2d%(Y z^_bMOui`(}ITDu|;2M3c$hV5fDf|*shgwsq<^@Y?RvGBtIn_@%#+d4Yv1Dm;7x=(v zIY_nFEQp~~TdZPTTVt1H*4!!e4J|Bi_0g+j$)|dy<5(Ew+4_Due)?=)>I&U@*4}+* z`W}0ts*P09sZ|aFJ*t;74j&(+#H`F9yX$g`Cz}EPkHd~WPr}|Tt1r_Fi=;i3tcr|` zcd70nq1~Ku;XyiLP`C=s3(V%kp*S#zF_TYVE&JU+`##dhrjKp9<#Kf$#=26HSXi9$ zNiFI2gLO_R@z6^IafiNq>{?O+b5iTP?qcy+RkdNojM*AHahf?sdBEoP?$zrS*UHy* zT#Qo&ee%KL^9k}kw8qJd5E;*o`}+Ao9tDUWu#Vy+dfJjx&hCn zwg`Hmhiaf|v(Jy*XUtHdNTUW&PThG5?>7PFP@u$!E z=Q5q_#lAD!Nl4iY_JVW}u^O9gM_8)ZoQxmLbx0bEG?r z>@fdf_5_b(>_@IRMvQ&D1KJJhT{V-@(~Xq;qRRK91+K%vST#1nT?UKc@@l zRdwP;{L9rxUmyax*(PP8)^VKs6Gme7dWfCBo&<3 z<3im^CTU`*>fR@1wu}u~=hU(M5YO2wiO3itb4vU+IBr-A4gop@-QVn?j&-_(hWkjV z2D34D|HAuFFy&IJ~~` zoL!HO-_#La_NosLl~H6J4pe0il3Ys4yzy4@TwCcEfSNTy9XUfS*vQ0qQ>C5CGQuxZ zaRC!t#Wn~8z55rB^pj~F(++vn@)y{^W6^MKE<6g<(-HRb1c8r8G&d%uq%-4X4~R6+uClcU#_I|qBS{A@M9W& zg~gu3+in6dOM@FQ`jt^b_aL;*$JW>f6i;~6s-l98rTTT8i-$5-pm)yU?q7Nj{+37q zZ&Y19vkkt1!JDRJ0^EJKEmRCAr3K9lI+$oK&j{{N$356+V`@jSz!|Ckc2%tdzl%AV z@)XGx_a)ptd91dAI#C3eg(~`DwGCc)GTvM7=yUE=d-3WSru(z!m*>;Bp1F53VtbVl zKL{u3wh~2Pf`BAbTF$Ijx8Tc_BoN#}w?|rla<_Z;Y9PDHVtGKP(9LjE8%Y#HjRB79 zDzMA0Tj#aDu*D2vaD-I4nAiY;@Iu*v2Un}va`!L42To#(Z-cmteYibrbfyvQ;eYJc zsiqVx##nPo5}@n0d8l^)2-3oxbc(A34WlO5I?)?P3mykxRC-i268y{4#b$A}UY(%V z!0mt`B2hKFaqcI4YhQEjzK2IrccL934_SJk+U-15RX=3*MwScMP_2X;+pujjF#9}qYt{e*eJ?@i zx^>t*K2B}8nF>}ovCu(YV)K|O!5{DbmG`j|QUm<&1)s3^O6Aq$ByCw>0WLUz0Hi=$ zzjkK=X1Y2i?ALZ@wlc!pYMU{FKE_r?sanEkiLvk;u7NI^0Umf$GKR9FpEemdrrM-O zQ|oqEbay!GzXYkj`%;Tn*_( z9lhEc{ z)TRQEQp)idYKd*9)4f%5x&`w|=U(N|llK<12kBL*qzP$;sZNyH`L>Vql(v&9J)A_H zS-}eFjXGVEN|1>?MgnbB+1iBMx6U7T|LS}2!`Pip_>At})P*lk{M_^eN|vYs0xPk< zZs`sCrX)wGT-SwQRL_iFs`Q4iv=D-|vKblzzG_xbeijHJ8s`&1JTaG?zKM(sNf+b*Werm4J;-Z6$m3 zMUv+`)>JY8FAyoq#E)$YFdg1msnBn9KELTH(Uo9>fqK2~jJqAk!Y6%|*g z^g%b={FIH~+ff@k^YSgixD&>q?4qf>AGHSxWNq3_&7bt!9;GdNpCeJe#7dR4SI4>o|&lZ%tKW=VarAb&bUO zJ8!3Nv$VEDFRsWdRl=|dGpL6Ob_?mT38OrpO#H@tw)fLl>(76sb-p;9xb@^+?XKvK zh#$^Y_=7iIe{^;zDbb>9KV|7;)Ai7h<_VOWRn-p?7qtl(RhZn}?2bYC9LG7TGwM<3 z`_P5J29IT{paDr?{i|0^sAuilDtNLUR<)1;S4{%1-`mAOqNDIdo>#zqWq{MAXBRQWCHvf8{- z{o+`R+^Vd2vB$GEkTgY;QWSGy>H?cJ!OXHDdia2QZ(4O165C>dp0Ec{li%ljw75!> z=*-F+z#I!OIIl)w;e*#l_neax$jx zrhu-qjg8mc!_D9)aMju+kc@{Ys{1fe5(rZD%y<9Vd*HmSCY<`*>bYB#L(1k<4#QYQ zieSq8wxFxEJRt!01B#j5l--oCP}uNA*6LMk1h?}>eG7pliXbYW;ZdDZfnj?YPgo== z<_6x%?Z(QtbE!8Gb`w^ETGJUisl2)6&EmE0}0tO=0y#{E=ov>H>pU z+t{o{W?!gkzE;VS75vzeR2Jfzd;^g&XkS#n+;=$cbsuEIv)5HQ{{b@>s+6+4yceYuA17H&Odd z#{1f8^p0F&o)Y#2uN;Q1`O3BV6HYo)M-FYOO3^F`2Q-dh6f+ynXR%J^j5`FJD}gFWz|i-l{Qtc?0v>tB=nL6|P#GH4^HB zUsVMoxk%hZ$d8~=btBT6gv23ofIT8!mf&b3@~OVL<7y0>I)NbMa;B6>d&z{FFxAAN z3&3MjlEU|O=^7ih8gy89&cL&K%?0^Pp*nxaia5rU+%UlT(5wkSG(652zTv}gE7Lo* z)yQD|8n*@B`_{pDtp6O)UyGOOV5YuT&>dolSYpxO9CeOtsaac=gkHf@*WEm(~X zbW#IlSjVWQyHv8rw@H-{P|gZQg<5fT_f)at7LDUCFpKFoU0M`d;R%Wt3UhVnhu?Cq)}T7iH>GvC-KPz zGYNQ8+kUb=CmX0w7ho5Hr_;u;}W$xlak`r6y^IR+H#y^}3TF>c_vBq(H+q7J2;-2AD zSo2gc_xxB|Nx2+@bc9R@k_=<_B&| zElr@WHWGY~hbt^>k|<}z3?!ns0{_OwrwUj2t=AV)C7yru=)9+se(P#t847NhZHTA^+&g$qnupD zn1+aKm4Z~6_^HaQLn?BWHLDJgfWbp*<3J4Q(5OzfNnkftAE%Bab?0|JXsABzq>6HD z`9+odI-^Qp-pUx*eg0mBTTbTyTBO7Ds##mK- z_l3S7)nW;^kX)TtAIWV=**Q%YHx(A|@GEX_<_QS7v4Lob6F3fFESoIJUs^)P0c1^C zQjp!Xj+w#&bMEt512*M*1tqHkyfYvQN^5xz-iT+796-EfUu~}Jim9})DqBJWb0ae>zqH#BL}3cs_cr% z3y`Pe4Pk3&*%^S^t_AEes#?a5bGGN78qZgIfggnCU7UK|c;?=I^Khvd_S&nD&H}?u zBdb>*K+*VRKm#-fVa!J@0+Hrwst zNQ?ios?>v@hX(&^jnR6qyY)V8wKzSDuN1(X%UJ4)09k3SWnHb+4=@V7=pY zKltmPz5M<4bU(Xn>~`zvduO)MrJA^XsM^0^6S$z_0SG>fLq(W}5MP6KKrf_GY*-iY zh#JKzrLUx_uARfIHM|6Pm9qy7=Gi0g+?zwOT5=gGEtYup%(~CerU;;-|tU6^o-Dx#eRW;*AttD6KP4(2#NKb`sFT#WK}MB@@4KrEz&3w4Q?w@W3Cs^YoIzob~L!U;1C zPlbsH-}^jAg?_%dp8jiD=Lc8qS?X&N)ldhth7M~J{^5Ww%294Dn-vY#TGj{ zoHt?Xk~;}f?SYE77VU)Z&gwOZx)B~m)gIIL%-EKN6YHKtLZ}Mx-LZ*QuR}MtHYUCm zAJ8$b8YKm$?0o0cKA3&q4C4dKn6r8ODV<99uU^dOm&!f2p1HRp<@X#RZhdp`!Cqus zaWbV1Dg5w3dkl%6q`2i<46tY^0Qg9Bn@U=iB7()0d3CU@t*SaC2Bl2|V{A|IbhWFW z!Ah{UE=^Ft$lm6_{1I5+)izss(?Q}2dE{$ZSwBB5ejiy`HbXqzGCjdlfrL8{_G}%t>F>#;h~Pt}dU^`tc4P%@x#R5nv6Kzn>HOB(6~ z?&m1SO{my92D-S51u{%ckd8{GS}qVh{2U=cJ#tnr)$Lt6y8aCvyQv>wZQ#N@bQ}o- zS7+6t_32;+Hot*l1eF&PpoUk&ND21xNh)e8W5k^e+|?w4_Jp)o$b0icS>p4SrQBFIPbL$fYAWg z8;EWok-d!$c8rBh#wyJfR6QQ0-LOZ4F%;gS3+Ykj-M{XSJRk^Sb!udUCz(Ce)F6{t z9U(X2NV>o{nkKKVWOm&o?(U@%M0AjtLf6qSESvBXRhp<)EWJ#(b#K6uPK(j$I5+F) zSO?Ea`c}%O*zWm)@K+iSyjK3b`Cn~8|nZdCacDB*3E31`eJqUqAjik zC6T2@WKiF+GH@WXx0#umHJU3%_kWhz!T-mgL=u(@^X{tU_7^IMA$b^12!{Bm?pT-$ zpV+F7uEWvEzP9LjO?_~d18);5CGNzc7?^XxF*rO1PQ|#Ao0pUqgA685@0Icap|>pX zs1iT&D&0_mbdAn9wCK z2_0npKp9aTiCV*rVc>HI-;{h>@>T&YbPSGvDv`?fd}vBAeNbJ;*3OLQBf z?OWQd^@4#s#*!Fm#n|m-@4)X-NR6$oLZA!_FU%hUcO$nV zL7r3z+Ti_ih$0{AwT38;`L1;LZ~3D-*>97JT7&sobvLptPo3h?TuZBC?NrA&+ti<6 zMCbTq^?70m0Q`yHl?bQ;hdk6yH@o!T{ut&E-Cn?^D+iX)e35%T&OAj`e!c3YCYV_$SA0F8wAC#_nP?>ldWev9(6Gc1Go($ zal6NH_wOFca5_0@ptCV#kg=*+TUsLJMF~5}W8ac?aS?bt)I|!;gcE{~DVImNL7=w{ zG&_z^Sp5*X^5(p%Z$hdCU%0G9T=@@HXGz5%+2Iw9(%rxJ5e59xq5z#vGf4wTY$J?b zjr8yz*;D()Yz>!b7yJ0VmAc=mzA-gp0j|Iu$h z7$SNt+W#hh|J`r?_QT(M^`l?CFU2=Xv#Cr5ZiK0=dEzY9(XnN9Budi4-cn@txccCU z=@?N}9=#)k<7lEJ5^^Efz~B{UY_CI!Swy!TVN7^%{HxOG`J7;v3XgZkLq~s+XY!$d zrCU$ibuO5%o;>A;JbAh`QaWF%-gr1~+ROMe>&c5JzyIVZ>(QQk`Q+0lubx~>HItxp z!ZPt@vR6<^QD|K1BgX*7tlipxee4-4R^JwcxvMbN7L`={x&pueD-wHo zyJEZd4fvWQudG8}UwL@2Oc7ZHk7qR&WYIudyD&{|M^$vPE>hg$%cgavF)dRaP=`~? zN;3`14Oa;28HK~hZpgd%er}+3>*1X7BOc-T%O79UFcnmUZwj6!EYBI8dlLBCSS73d zxay$7Jg!xx{f*V66o&3px>hfCo-{UP9(3nHxJixXh=3Bm=QlAZwNDTToReoC>|_F^ zat8s;*YIQbHm=<_Y{utX?HeNQQukhq%U6jEF2hQ?fq|G|@SCiU-4zTMtLPev?>6usBIwZEfdIK3XNGlPBAcxxm5C}R^&=N zbD5xPd_4Nc6o8}4O5|*qK)_tErLMkS>h@B!0n|=>SLK)FBvEPCmkWm!K$KY4FVI_f z1Z?vhjcz=gvn2e{|NClxDQu0oSMyB_#pB~tTC0ONbzWR7r3q6xYgIXFOG&(J#G6J)Rx>#m8`VaQ9z4h8xzq|MD>~-n;+mG28}z zp!|&Z?~D30;h_qj0%a!1seN|QCJe-!YsA4;_Pule7LJa>y3qSjvzl{7$&B?}Obh`7aQX;K7 zWeS2u&<$b~{#dh9TqO1aF0x-P;PKRMQNs4A&Hz}4YL19cBZf-e-W>gR zm_{kAWz+ltr9?_D)EFM6;hgmjZ#-w$?^NG+^|iJO$PT}yHt9q8u}-ZOQZdN^@|eIF z0VwJck|T5nuWu}PE(n)_0Y|8;Nl#HKcRj&h*>4#LWY!?i2CIaPrY4_TiVCTCH8_qz zDzi55#NqD0en`E;8POTj|ARxE8^HkS75)A|z2uje;gY8))G{tYKwI z0DHBIXocCH>I^gp-XBJ#+j*bdc+#%#6Z3WVp*MP@e*d*szxzHR-tRqBte%>cW}y1r z@32f&L8#;+)FWKQtxm-PV23tsmBKPez5xe-on>Ww2;`eh6Jl!WrEuISB(+J9Xh_H) zW(n04fE#mSpnUkVy3bDa*26g;dVTin#k0>Opn2tX#Ta}8-Y-=gb;MoZQ2BfdpjyV7 zj*m!EPLiB3&tvLS2H?@rOGU3fG1!YD%_bw7Fco+Q(HRn zGK7g>W3O-NKHU&NjD0HywY5>HzRQ(PbmZFto*T6bfF06=)#xY|Kyz7i`4dG?! z0I@)>@VBn0gLN5Fr(NTGW^!xb|CU?2^Wo`@C++R30Qutd^tD$XpxW-^3EN-72^)~4 z_({;iH(&saOHk0OBcF6GlxPZ1mvp8?u2on~C{%~Ck>ZXmtmSm-1pzdD0R<(eGYD^0 z_Is#eB)@s5q??3pTBxyT1HmAOi2WTWZ2qBr&i#gYGJfla_?vsb^M=2H3h5ZeT4f3@ z4-zlLfjS#}weNPweB>Ep>Qn8yH;xpV+*eBXJ<_H%{$3-9#j+ukAsw+UZBc20FqJGH z6D-KycUAQi+dA~^ZJ#iu55a;i)X#4_Wp8+!-+8kh#UFO`1|#^5(@(y;*I^2QV3J5I z2Fz%qVosNCX7`v(iOhe|sT#gCxD5q@>olFfsgB#| zcqK5Qx&l{owG6&UwG__;tK`|;{Wtyqo4!gM$c@5h7M8d+`1w$;i;My2B<^TL7>xwC z`Qo1Vc)&)}?Mzc$wXLyfDOFGl7A?BdX;yWF(~7W2a|E*j<0RhDn`CUNz=`YT?!P^1 zQXp@mG&uu%sO{I?)arn_uq7#SN`QCgs75bd?@VD$2r8z{x|*Q)qR_}hV3JAtxz1p? ziP@N~`rek!UD{6|VjXdgy$pZmy1X^%?!P8K1?<#jUYm(C1lFY03l%OkFvvhaq4WqHCWUa(aYT6c;}bH{** z-*^ALMv)zyWU6bb8g}`ruGb9T*RCFshQ|U`1}nKblW~aBZ5am8M-Z(ZxEfS!$!LT3 z#ch>bsQ2*EcsIf|w+`=S$$LeZk5dC+=)!VpC*fQjcmIR`(f1$DciwOQ-!F#}=17Yi*hStf{!z#m0rSi_?$5PD4z3T8(vaNVzr zb+amFsnQ?Xqhi`2TXUH`b~L@FmA1 z?ogSyn#xD^AWNO33S`+{m}k_&;y2UR_z#xMAmNW0UbJRsmlJ&u1Vfzy;LTcZgt-tJ=mHRcH&JV02@UG_ln8FRS`-o68*o5f7vkF%_0}Qu zw5Ycp&b1?)x2!0;y%{iJ24p)Ql^L=COKNo z_DFScNl6k?=x0mYD@@san|*eFKmJjX?k`D^PB;7@MmLq98n>DF6eD(q2Z5Y^h{U%cR(4pyPJdwQsr1l3t?gA0ed8@m^bCridQ z*lTAXKUZwMkFp9)ibmK&a(q$(W4NVDJB9_s!%>a7v#Z9X(ggZ4bR*$Kq+4U5A%qj0 zgoM6kRvTIz2r+J}+Iz;%{(-f3N$naZ#iR}tW|AY1$Gn`Q?2U(WZVU9Y_Wb$vBXvgN z;YAa8O{`y@bpv@xve(5C)JFh>OaN}`N(Jdm!&G(oZM_z_?F@Jn>tJ028;KS$bl-NW zU>~Y_pLp^m*&yNvew@`doxtm*I2BSpr2~e0fBd5#JhYff1--H;go`eB)Uj9yVw6$C zt3AjrdG^$rY1C=#N{~k!W@y8*g+gTq*uA?X7}u68atDD_2M~fC5uBv*ZI=?&dRB@J zKg(EvS~W}yu{iJi8()>4GDpAv?8&Pq>&ai>pNrG-8&BNZ`-5KQ8o&1Hqtnnmt^jO5 z$PWIR)n7`nVv&oFedx@~_!8!EZDL@jQN$dqh5s&Tl#WB(pmR_c$SA<0`h-8#Eurqp zO!Av?8fBl=+zAWYZ+!Le+Y%h&#iiflKLNP)jJ;ubzx{e1#eLRYeM8CTjn_Z?Q-Hhw z(LVyRc=ta&iu20<**^kAe)qpTiah53^~h=re0X6~W$Xn{f=xJ+G}OWWqT9#WOI5q^ z?qK3h4<=Rh;j>eFQrk@Mm9abKKIkM*H3S6$w~1?Ai5_NF;$HO3bYTcHs+rDE3Wtk# z|C@gVAnWdb_doiLhmI3!6shcHwr5cnMF^~D5x{Dtqc<5FF-T>9^7uyrMpROHkh~TS zFqy@J0^6FDZvhN>_N4pk>b+?!ZfwI4dRtN}N2So%Xe&M;cJ+|AXRY;HD@UDq=qH~& zX-|G~bz=j&uKC2p{oH*OWG}1-{jNwJ%+v_T6=XffKDN(Par)2Q_UeI9>}))3qqTOmn3uJFLpfyX(V` zaaR7i^>EHLY+@o$pFC$jfA*w5nf&_-XnumN26SF-ig#WPnqGU3t~x5{rn48EYurH2DbcaCIfT z<2>T)lcqHYGp_s2-k1&;0e=g)KktAzy8b34OGNCIq02x?8g$r_r zO*o{+&C4~jm9*l(>@=huUM2jj#)H_h&fWKYL0m7Yw4UdH#?IKI- zKo6{{PwfSG>v6~h*onYz2nfUTcpb2fCmz5?l3Ghbif598oFf39_fi!m-cwB*2EPv2 zCc?hM&c0TgQ)Gpp&nzQ`a=AtXbD$gJvE?~ID$KPsz?oydvm~zx@3_YKQ^;Awmq zn0;>V*2Gmch~6rZFdz+7Wj9zyzy!4u#W(m-$q$Nw=X0-H59hSPfBM@M{`}eJi@>?A zEV7-1H@?+br?x#)^6U+d4L)IQpeJo->)l+@vhljZJuJKqP~T-8P)ckT%)`6Eg}4VC zXX_h;3nS{CMcxbFnKBH%t$RG9K4z$4pxufKbhjZ== z_)W9fFV>e|{Op>5Chk$1e~s<8J!lpCCJqKG<>Rh)q*wy$F_au7C|G>OaFv0}DgXmK z?m85Fau|L=>OpN#z9@YI77yq=c$OL%w@8~+&1K1E2~)Fmu4qo!!^BOAn<)V*FcHo8 zpi-!$B&Z2uj~-5Fb?}rtkgmmIRc4n8!E!FML?yGDGz=9pvI0rn#FY(zdlB~cO2lLs zK@tdfYiOKWW={12CGG}y_y73^tgQN`B?=D{K!R?yB;x2{|M2KInrc_$Q8Sn@a;NU1 zDkP2D-6H|%2I-(jWkO2h!~H?i0TWruEIe{In>`$>8buLRbYT_&8L6ogt;lLB>l}Y? z?MB{uO?>W$a^q=xyDFtQeDYb9^6OV0-I+6+Agg#>iRvpFSP5&Hz0#&wrLNE_iZYKo zI^$Q%x`=1{OSN05sxC&v@b6!_-;LK*X^%f?OgfVs}GQ?D@wN74!yy^8E`Q`>7hQ!K^e27 z6`lKKmzI}6!{k{($VZTmN!LPnSN!(I5ocH)AwQ1=#jtL&r`#y!PrB-CB>q`&Q? zy|ZUwxY{G;F?!$@lZuqVR}j{2)mJCN|8(l86S9PpaT!}6ILgZ@%WVfc>`$ zRz1t{V9=zX1DZm3wjM0GOD^7dP)}MwD?lMw92_>)Wt!Oz<(yS?>l5?0r6rvEw%&Nw zep&9EAsToWHV47}tvZ(;;b~Mmn{%|IZDW7cCtjvMVBuNz`3WDPU zfY-@^xDQB`2ylI=kX`CkYGK~hyBtmudID2ig5QgzXt@Mf{;(jUTF|vjcUz+Pw+YoW=X*0+)owIdseUp5RhW)|wXBVYw zx1P4QVgP@&f4hGu6nyJF@S(8wE48wD3qw?8nx!$Eay)U%v0MCRtr-B}w{J;^W5hX< zd@JCg zM|vMUD3kZ<6$8R>MiPgJ&rSh2y@k6qf2^=Fzk9zS%6XCg)X!61VWDg^^f3b)TK~t&g+MrRlF; zeevv~5$uhp>=$%OjBn|b7=IaJ{N3O79&oNba+GY^y1#TqLeNecD@|&|zV``@f_JeI zGoTZeWYWa_uBdz1T8zb39SHK!FOvwJa~<~)U}&39cD3L`myXbR@627j(Cuv1@;)=l zc@NzBH1V7}_Sf|%Up#3~#*sayY6t1`lH z5vInOYlW+;)}#z}1Dh)PAwk3v)ReIpcX4ZV>*1WUMtWn0$C^*??+z|eF#CQ~pJHr2 zEy$fYuhO^N`)`i13Gktr`tkh5&$eM!xOdmH>?8<|O;D&~}MR)l-zFs!ma+5ENGy(BIl z*t9L#4vqCNUl&boQ-bC!sdh^c!({u`Ky377cjs^p3M-5KzB3*Z7b+=DXR}|4SX12j zT>aJ=S7&eY*M3tmDKGQt$ZGp}#_HME+{v=G&RPMyO_ zaLKjhr%O651Vt31OA)sXVYYN7li&s%%csKyB^WrcDHKwZ(!KH+*nq>BO8kgAEJ>|O zEF4y8nhUe0ZnNV}2hpv~E8Pa6H+O~38O_7SbXYwbYWCZ4AyJdh`jp^bO5>uD~trG~YY)cF1I-BsV zGyKod_cz9Y^xF|_FRNN_J$rAf2`S(9)q0crzV`ZekGTt1uUj&Ie-T%$VlL}|BLV4v zkru?B4Jox(HYS7wCSMz|HIL&IEp1RX@ix@jdu~uXNvP_I0N^?Y;TVsmjRBP5feBO* zf7KNh3~1`^?+lONHt_E63XecS@b2%{D3+Qu#a@fF6^NUK;eg41wRzecK#p<$1?Q4S?3BpC^ zSfaBtV57;hdX+eE#&ac1=9VN5i&D_;XwVP9{W%GM{q^;A>5c<5joSLQc}GDyI!qAliFxWOBD8^I+?J+OAbUB zx4>mAxR#?UtA{t*1;*|cc52mw7r&}DZ<6~NuCP0!8oe0a+b5qsanrGGuwf`cP|msd zt>^un*FEnycVp(>_ug9F7H=#j+IBh_O(?_*a z19TN#xF5(+^cZM7BmZOf?xmFKv867ZUBV>Jr`|Va4(FPR=U;sF6#Vh&x=1Fw@w~l_ zahq$3zCU>5^~aaji`!|;8ev`agT+D02yMY99r+J670~fW(vd$~wM&ycM0J@olIU7c zv2p+hw_xsg+%@>syqzc+VG^p!LQi(mNII=$p*{3&SsNx!;2el=eV*{O4IZ5v$Ma`j zo8qtT%dFlT&)d86%FWfh@`usjzi}_bb7H`ahjT80d9^-c;;$9UR-c6O%L1$6D#NnS z1GND)I8O^`B$SVSGy$;~WLDoyyL6#D-NY7@{{$pg!y#fA5N!}7p^0wd_Pk9A_7#*0 zSMkZ<%b9nPA}aW9CEpq)YeL@$&ieH7<(bZasZ(&6R%7S!lQ3$RGX6Bljzw7)zjRJzC~C?L$>M1J+9G zqv~Q_Z9e#;6GYk225#vA?8JY9yot*-YX;+A>KN33pxt*9j8jS;5HA(@$OK8Q8hy=~ zZB%rcF~OtB&hdf!m0M5WTdTV+?!UipAM*D5)*Jc5^((H!n~QTZL#HBMkOFE*KO)e{eAu11+)tmZUu%O zSM+`6g)Q-=Z~7JgzVccbP_C0On5Kc#8?~G2CC-gWD`yanzcY*#LkH@oYPY06YOp@2 zmGQF7h2K0iJ~FDbweVih7cdUgeQ{74-v~_*(-)Asg>+lxehF!wKh-W z&yLlzOIXWc=|+OfdQ~~V%~UDF5&qfi{D0g^k%bz-3T#+b(s_k_Y|mch@h3f;1!-

#h9JvpjOo!dO#Lhx*9&tb4ntx);Bf*OaSC0O3Wlm&RTbRE>My}w_y^y^UI?=RX=)#C#l`#*35ndvB&jef?X2!vm2ffV2w^qYnq&plVBXmQ z4oVBuHe>GFVG{v*X1jONToXvbAPp1LyDU_fu6_(Zmy|Zua>AaA+7@;Ty8}$dT%1bR zYy-uO#=BPqob_I}>MW(eMufhX3H8Z_np|zGl~@*E-h!wtJ0h5(^kx?repwhkw&hjG z<0p8w5{bJ+42aIEBRlVfKSNM{`s~H4FWd9yPsgWg{N&*-J1^PgPYY~Oh1ZdRLoYrWzRMn3rp^=jZ`ixVGN-PKnd z_yty-xX99~HBxCNx*W0^!|c>->m~txmeN&|IC_y~W!3r(Ft)BgJR4z4Jr`!yb4wCW zv}D8U`Jlju%YVVQAeC5eL&PO{l^PE$o)7whTD?gXN#wB4~2A0Gf;z>uL^oO3;9 zCF;OOhjv#4&PX<^IFV@S^+hppC^>T*hZL*J-m`O4N~8^5h+d zqT4zTZLMG*lZZl0DgHb~06iF%`D91;VtQ>3&yM5pvz^Zv)v#O2H`q&=M^-3d4tNAC zQ~yH3hDvEwX^r!VEgER{90Q<{VjeiNV6e^|T6FNIt+UGDmHk_R-54COLMe59siQ@c zY^1fdSFZy=Gi^INtk0i*`Rudx@~g`fiyP0|+augXX7cx6d-c0VxNWj)62|d7PTV}d zS8-Ui(lnAr2w=~!OUh96camR9Zc9eFD#MMJf)VshbxpxR1JeaEOVh!0f|2yY0^8TE zHtk&U`|5}S!q=Vi7-+I!na-DdU>%<4+IuGxGJG{v?HMf-4 z$U?RjByV-OS;52*KJb=0kyz7NA=jq*;N{i#>RK)9EO4k2@gm#O_6^Y$#wW@`HRI9S zRjOh!zOhO+we5NMs*LD#zUBF~uRd$9 zF8IZ*=j`35PUh;V(_^$f1OGOA*Opfy{BiiUh!DBQM8IuItl1_@U1=!2!P&zYP$6n{ou`oDmB}9rZ z(G6QsMY1D=L{?9cAggEW(wz@OhYhG32H|s?5>l|1X#T1NGT3mRhV`@E>Lt&TG5$ev$+wTbG!O)rs9!b>&oU%NRbD4$W2N zEC>{$TB54nZS)bu)}?U3u$+bc0CrRw*>RQ&a+K9^v~=R2&qIYv#CK_&swwcUXU})v zj_r&)Z#-w$YvS%RcrR<>-gy1d*`H} zEeqW?+$i`Dqk$-$c__e!AHsi!aK_9ikqmY)vQ*W23(xaB&$Hp#?RkC%KZ<|rBbiCw zdzosuB6XRCDhZj%V8o5@JHy^HC;AumAPG(yFWrM@ zj8S`RgBr);92{hKAS?033$e!CkEmk8megca7u%GoEh!0nH1?^e1Zk}Jc>K1R06O3{ z@|nw^9e+qSuMRI@A`~x1fn7kY1;TxX1bKmPQ}&W>L+BHf2hWzSrG$A$G~_Ob6N`rL z8{jiy4xe6=k(;{-XE#6Jd;R?GJoH_A%)UAEri+<3eTr*Oejhf1NC3Ca?~<3xW@UB6j|SO@D%<#3JJ4KuTrS|s6gsXqd* zO4%Z1Ahx!M2&W|)Rx}f?46R+0oVL;|p>;w;+FtcDm8k#;G3f(fRhF)*rY=&pZs#ni zwvq@nVe0eu-UVizauQQja zYY*JT-21MV{=@b6-d8`l_1Bi~QfHSuwgZ@*x=hXW*V^;X@6TMOt~_cVkACO(8t;Ae32wV9 zfqkX0qm#n6ffZSJdeKp9cE0Wfu-+B~C30ug;0n5Q=r9&buuuSEh`a=ur&4v(025SN&-_Yu{#k_ZJV zmN;$Sxbowi9@G5sLwoh=l7X*g?GP2|lYIlBa75<{bhRpPJmeZuRk$ytUbr-S2BI}% zl{x}jGt?yonIO?Z(thb(k)0e+LSSF=;h@{SN87UQ^=u3Hv^8eTRc4UV;+v|r@2RTI z{>k^A-pYYdS=nrI005;D6$bHqTNcVVDCx&>MdRwz4|9K!c5$!#}Avss{XGf-DQW|bdF zT+%OQvkYU~nmm#-wvXSUoS&nFCp$+`orbe>c{A4WN?PFjmt#tx zMUhOSjY5QHNZriMc;Jz6>1;3})iPwrK153!GO0Hqf*r;_tcS@x@@r-MN=>rhPCi@p zpl5b}%ewS(;r1W?HY(X-^iou1jb&Y|>CBy&I+HX}Mw-J*K*;2Sr|!cv%My7^tbq{3 z28N&(Ud6Posts3)>Jn$kfe0Ro^eo1-9@r;Kg3WF(MmNTzf(BhatyfSJyUNNMTOmvJ zk7b=4Kk3a35a;H?2(_s=M$c!h6Ht>y!yr#PMIc=`b{*yn_-T|EM2Q_lX?Bn5JyUfM zzdLNxRa>z8l4}S9For!9+xk9{_sh?p-+z8q!gl3h`^Ns0^9r`7>6ZN#oTEwbWs>+d z`9wT3kiBa#a~h&wt~t%rRiu$r09EAX;rBW^k5?H?wqwM5Dt4C zp~4f&ldYO4mD~f!Ulo?*c+;vW($*K}733?@?O;W=x&zE2>0NdFsLm@D_@1o3zkJ_+ zy2j&=KVOgcfBf>*1Aq1K_=~SI^|{~Gm51}AXN>1O+dUc27Si-4l5ZlBGD#ZD@$W8A zZHQ?s4G`5ykl;qiSxggk5e6+I+j>GbY;`&n!s)PdRI&1aD9&9#dR&&6Nq) z%6MCjoMo%fu7hZ9{}Cb04C-S1oFu!Ok+^pnM#R#~mwN~DM|Qae`2?`NnUU^8Xx7C6 z10X>zVxP|v|C2%d(2XyX=#wtB-66DhEIlI&GCo$9o}rk)%TG^+I6WG=^5dLdiw{*m zviIjDE0Zm!T)4Bsf30DKz{p#e!qhcBz@Zx(yKw;;0XLrvy-tjH2HhSXx7>E^lFW|?gew}n0cySu!t;rgWSt$Tg_g3-^dOxz)Gx94IDN%YTq#tg9KgX^;t z3#6SY1F@cWW?usUG$0Zdgl9rPblJs!Pc=TrQsn0WNN#`y)m^(eAfr0Es!L7QJ4oTq z1DW!e5Ko}ba%ZP~*M6MSZYn6r-OF|JHZrjpFUeBwLCO*-m&M!yoDw*7-M5s&YlDO* zm0qy0f=(OjO6p*OaLT@VdICjPKYwWmfC8>B-;lB&Zpad^o=@s?xX^_1+29;uM^ck zE72gPKnTc#A!O?W)5{LvO^kMj!O#vezym2pc5OQFy<{CLV8^AUL;XAxiy%*^Brr0N z)1=+$N|2{V-m^4w`;Ud6{NSmxdW{a&V&LJ;I6_aWzE&Ce*`wkPOayI^0%eo{TD7BZ zC@rCgh211dI>ykyecZ~xeouI#e@}g64ztsY9qAK1XszQF|y78+vW6jIt+0OibP8#c63^f6@bE(Kj- zgslc~>-j;rU69r!D30lB;jqtA+s0XKM0SIOHUynal{zb7yC&#I^Q{nO2z&f)NCZI2 zD#a=Dy5!|9rCtMRqOCr!Ql~Y1TbhT~sCe+s1R&DZWLO#7 zq5dg&?`aPV&*Gy_BM2FJs+WiirpPj9E;1w`bh+i3fT9xItfHFP$o-bcwJm^ZSTb@3 z0H}$oOI>a^??`nlg;{JP%fK^0ggx|GduMSlebGWqWhr=4_5b3_$941ik)?OG;;ub% zmrs-4-NKZMcQfS^jCyMKnZUK!z`>zw&ZV=FV__h5XBM_!20RjCk=rr(gV+HxN}%E` zZ$D?ow9tZDb>^a=qybb3Hau6Jk>jZLvkYAANg~uz$+kyVUOBTCQxC~fqsd6>uqLlABtBP|I|g zEVpWa=z{i%E5?s}x&nXu^{e^woAvXt4iBU=;(YDV`?v?EKReTW@2j8OD)filRVtg* zb5Lr~P?$1hGF|@JYtBu)P&G7plZ1G>3Ly#1Us+S98$<>(ht6`G7M_0WhHn0<5* z5q*IK23bZMUC>4=@|zY+O6n7!`>uLrK5pkQAr00sWrmeS$nvqk>{>Z(r7F6L9ujvp zd=nfY1L0cDL-P|NQ|<^c9WDneBZQDkfqgpj(EZ9dTnKtsk6u>g4XIAu{CvVZBwLqN z$Vy~CvLR8GhcuE?pHWwa`LsIhcaA9d{BEq5uh-4pJPU)@9=?lC-Ttfd>kq0FKl|Y8 zpWI4R)M0-Co@3QUY?A9pK2NI_#NtC7hi5A2R~6DnU)+pF{i`E7opzBu+mgDGvX1XT$DD+=B6K*LZWN8m4~p)-yv(GX)sKc~EW~53JymZ{+LXeI zlPuwBK3+e6Tn{hX^P9zt+@De5YmeU56x2;t5nce1yTLe@IN)8Dj6?*H3OM8{l?-## zT~QtWIHotG9I{sceW*CX>h95wWU?e1L=RgT!w0E{4EfVCcbZAY2ue4l)S4};L6PeA zA3sjA?U*Y9*<_grnNyJ=Yo$t{zz6b3Pfh2m(rvPg?GiOmYElbFhQKC2#v92u$4Vgx z`o4nBl;ei{5upH4#_XB9t)Z6&L{h)pfDgx*^X)⩔vJ1C_!b{6%wEcGmWQl)l`11 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ξyiAH7zzFYCMxc#u`SFJRnbIuO5dOHJ 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.2.7 <3" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1, acorn@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -add-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" - integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== - -agent-base@6, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agentkeepalive@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== - dependencies: - debug "^4.1.0" - depd "^2.0.0" - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.11.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -aproba@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-differ@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" - integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== - -array-includes@^3.1.5, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.reduce@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -asap@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== - -axe-core@^4.6.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" - integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== - -axobject-query@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== - dependencies: - deep-equal "^2.0.5" - -babel-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" - integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== - dependencies: - "@jest/transform" "^29.5.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@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== - 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-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@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-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== - dependencies: - babel-plugin-jest-hoist "^29.5.0" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bech32@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" - integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== - -before-after-hook@^2.2.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" - integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== - -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -bignumber.js@^9.0.2: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.3: - version "4.21.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" - integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== - dependencies: - caniuse-lite "^1.0.30001489" - electron-to-chromium "^1.4.411" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== - -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - -byline@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" - integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== - -byte-size@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.1.tgz#b1daf3386de7ab9d706b941a748dbfc71130dee3" - integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== - -cacache@^15.0.5, cacache@^15.2.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001489: - version "1.0.30001492" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz#4a06861788a52b4c81fd3344573b68cc87fe062b" - integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -chalk@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chownr@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -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== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -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" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -cmd-shim@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" - integrity sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw== - dependencies: - mkdirp-infer-owner "^2.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.19: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -columnify@^1.5.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" - integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== - dependencies: - strip-ansi "^6.0.1" - wcwidth "^1.0.0" - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^9.3.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" - integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.0.2" - typedarray "^0.0.6" - -config-chain@^1.1.12: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -confusing-browser-globals@^1.0.10: - version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -conventional-changelog-angular@^5.0.11, conventional-changelog-angular@^5.0.12: - version "5.0.13" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" - integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== - dependencies: - compare-func "^2.0.0" - q "^1.5.1" - -conventional-changelog-conventionalcommits@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz#41bdce54eb65a848a4a3ffdca93e92fa22b64a86" - integrity sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw== - dependencies: - compare-func "^2.0.0" - lodash "^4.17.15" - q "^1.5.1" - -conventional-changelog-core@^4.2.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" - integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== - dependencies: - add-stream "^1.0.0" - conventional-changelog-writer "^5.0.0" - conventional-commits-parser "^3.2.0" - dateformat "^3.0.0" - get-pkg-repo "^4.0.0" - git-raw-commits "^2.0.8" - git-remote-origin-url "^2.0.0" - git-semver-tags "^4.1.1" - lodash "^4.17.15" - normalize-package-data "^3.0.0" - q "^1.5.1" - read-pkg "^3.0.0" - read-pkg-up "^3.0.0" - through2 "^4.0.0" - -conventional-changelog-preset-loader@^2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" - integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== - -conventional-changelog-writer@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" - integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== - dependencies: - conventional-commits-filter "^2.0.7" - dateformat "^3.0.0" - handlebars "^4.7.7" - json-stringify-safe "^5.0.1" - lodash "^4.17.15" - meow "^8.0.0" - semver "^6.0.0" - split "^1.0.0" - through2 "^4.0.0" - -conventional-commits-filter@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" - integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== - dependencies: - lodash.ismatch "^4.4.0" - modify-values "^1.0.0" - -conventional-commits-parser@^3.2.0, conventional-commits-parser@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" - integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.1" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - -conventional-recommended-bump@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" - integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== - dependencies: - concat-stream "^2.0.0" - conventional-changelog-preset-loader "^2.3.4" - conventional-commits-filter "^2.0.7" - conventional-commits-parser "^3.2.0" - git-raw-commits "^2.0.8" - git-semver-tags "^4.1.1" - meow "^8.0.0" - q "^1.5.1" - -convert-source-map@^1.6.0, convert-source-map@^1.7.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" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -copyfiles@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" - integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== - dependencies: - glob "^7.0.5" - minimatch "^3.0.3" - mkdirp "^1.0.4" - noms "0.0.0" - through2 "^2.0.1" - untildify "^4.0.0" - yargs "^16.1.0" - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig-typescript-loader@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz#c4259ce474c9df0f32274ed162c0447c951ef073" - integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^8.0.0: - version "8.1.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -dateformat@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== - -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -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== - -deep-equal@^2.0.5: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" - integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.0" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -deprecation@^2.0.0, deprecation@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== - -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -devtools-protocol@^0.0.1137505: - version "0.0.1137505" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1137505.tgz#5424148a191f46ab722ebdc05387f1bed9983faf" - integrity sha512-etlSdcQy8DiTCw5oV/AaQiEqEDMCHTGRcMpsqzlKUQQdC/AKadVNbN7GTVAwFOKtMo4i907DczhNkXebiZe85g== - -dezalgo@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== - dependencies: - asap "^2.0.0" - wrappy "1" - -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dot-prop@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== - dependencies: - is-obj "^2.0.0" - -duplexer@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -electron-to-chromium@^1.4.411: - version "1.4.418" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.418.tgz#9092aca12db25acf02a2ddf9de59f0e4363c9928" - integrity sha512-1KnpDTS9onwAfMzW50LcpNtyOkMyjd/OLoD2Kx/DDITZqgNYixY71XNszPHNxyQQ/Brh+FDcUnf4BaM041sdWg== - -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" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -encoding@^0.1.12: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.12.0: - version "5.14.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" - integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -envinfo@^7.7.4: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== - dependencies: - array-buffer-byte-length "^1.0.0" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-airbnb-base@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" - integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.5" - semver "^6.3.0" - -eslint-config-airbnb-typescript@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz#360dbcf810b26bbcf2ff716198465775f1c49a07" - integrity sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g== - dependencies: - eslint-config-airbnb-base "^15.0.0" - -eslint-config-prettier@^8.5.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" - integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== - -eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== - dependencies: - debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" - -eslint-import-resolver-typescript@^3.5.5: - version "3.5.5" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" - integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - get-tsconfig "^4.5.0" - globby "^13.1.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - synckit "^0.8.5" - -eslint-module-utils@^2.7.4: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== - dependencies: - debug "^3.2.7" - -eslint-plugin-eslint-comments@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" - integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== - dependencies: - escape-string-regexp "^1.0.5" - ignore "^5.0.5" - -eslint-plugin-import@^2.27.5: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jest@^27.2.1: - version "27.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz#b85b4adf41c682ea29f1f01c8b11ccc39b5c672c" - integrity sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg== - dependencies: - "@typescript-eslint/utils" "^5.10.0" - -eslint-plugin-jsx-a11y@^6.5.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== - dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" - -eslint-plugin-monorepo-cop@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-monorepo-cop/-/eslint-plugin-monorepo-cop-1.0.2.tgz#c482ddc45ce7bec6642942ba8c35c1c910942f70" - integrity sha512-jGEbrgW5K+JUxT4OwmVMOxWfR9NJDwmZAXxsGCMYT91p5r3b1IB3jMedLCX+zfAXuPtnLOgo93mALaVymLIX8w== - dependencies: - read-pkg-up "^6.0.0" - requireindex "~1.1.0" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-promise@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" - integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== - -eslint@^8.17.0: - version "8.41.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" - integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.41.0" - "@humanwhocodes/config-array" "^0.11.8" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.5.2" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^7.0.0, execa@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" - integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.0.0, expect@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -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== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fs-extra@^11.0.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" - integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-minipass@^2.0.0, fs-minipass@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-pkg-repo@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" - integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== - dependencies: - "@hutson/parse-repository-url" "^3.0.0" - hosted-git-info "^4.0.0" - through2 "^2.0.0" - yargs "^16.2.0" - -get-port@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" - integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== - -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-tsconfig@^4.5.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.6.0.tgz#e977690993a42f3e320e932427502a40f7af6d05" - integrity sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg== - dependencies: - resolve-pkg-maps "^1.0.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - -git-raw-commits@^2.0.11, git-raw-commits@^2.0.8: - version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== - dependencies: - dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - -git-remote-origin-url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== - dependencies: - gitconfiglocal "^1.0.0" - pify "^2.3.0" - -git-semver-tags@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" - integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== - dependencies: - meow "^8.0.0" - semver "^6.0.0" - -git-up@^4.0.0: - version "4.0.5" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.5.tgz#e7bb70981a37ea2fb8fe049669800a1f9a01d759" - integrity sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA== - dependencies: - is-ssh "^1.3.0" - parse-url "^6.0.0" - -git-url-parse@^11.4.4: - version "11.6.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.6.0.tgz#c634b8de7faa66498a2b88932df31702c67df605" - integrity sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g== - dependencies: - git-up "^4.0.0" - -gitconfiglocal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== - dependencies: - ini "^1.3.2" - -glob-parent@^5.1.1, glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== - dependencies: - ini "^1.3.4" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.2, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.3: - version "13.1.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" - integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-unicode@^2.0.0, has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-cache-semantics@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - 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" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -husky@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore-walk@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== - dependencies: - minimatch "^3.0.4" - -ignore@^5.0.5, ignore@^5.1.4, ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.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== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.2, ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -init-package-json@^2.0.2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.5.tgz#78b85f3c36014db42d8f32117252504f68022646" - integrity sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA== - dependencies: - npm-package-arg "^8.1.5" - promzard "^0.3.0" - read "~1.0.1" - read-package-json "^4.1.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - validate-npm-package-name "^3.0.0" - -inquirer@^7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-slot@^1.0.4, internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== - -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.11.0, is-core-module@^2.5.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== - -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-ssh@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" - integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== - dependencies: - protocols "^2.0.1" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-text-path@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== - dependencies: - text-extensions "^1.0.0" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0, 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-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - 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== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" - integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.5.0" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - p-limit "^3.1.0" - pretty-format "^29.5.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" - integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== - dependencies: - "@jest/core" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" - integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.5.0" - "@jest/types" "^29.5.0" - babel-jest "^29.5.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.5.0" - jest-environment-node "^29.5.0" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-runner "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" - integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== - dependencies: - "@jest/types" "^29.5.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.5.0" - pretty-format "^29.5.0" - -jest-environment-node@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" - integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-haste-map@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" - integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== - dependencies: - "@jest/types" "^29.5.0" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - jest-worker "^29.5.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" - integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== - dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-util "^29.5.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@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== - -jest-resolve-dependencies@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" - integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== - dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.5.0" - -jest-resolve@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" - integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.5.0" - jest-validate "^29.5.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" - integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/environment" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.5.0" - jest-haste-map "^29.5.0" - jest-leak-detector "^29.5.0" - jest-message-util "^29.5.0" - jest-resolve "^29.5.0" - jest-runtime "^29.5.0" - jest-util "^29.5.0" - jest-watcher "^29.5.0" - jest-worker "^29.5.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" - integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/globals" "^29.5.0" - "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" - integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.5.0" - graceful-fs "^4.2.9" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - natural-compare "^1.4.0" - pretty-format "^29.5.0" - semver "^7.3.5" - -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" - integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== - dependencies: - "@jest/types" "^29.5.0" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - leven "^3.1.0" - pretty-format "^29.5.0" - -jest-watcher@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" - integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== - dependencies: - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.5.0" - string-length "^4.0.1" - -jest-worker@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" - integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== - dependencies: - "@jest/core" "^29.5.0" - "@jest/types" "^29.5.0" - import-local "^3.0.2" - jest-cli "^29.5.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.2.0, jsonparse@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -jsx-ast-utils@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== - dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" - -kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -language-subtag-registry@~0.3.2: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== - dependencies: - language-subtag-registry "~0.3.2" - -lerna@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-4.0.0.tgz#b139d685d50ea0ca1be87713a7c2f44a5b678e9e" - integrity sha512-DD/i1znurfOmNJb0OBw66NmNqiM8kF6uIrzrJ0wGE3VNdzeOhz9ziWLYiRaZDGGwgbcjOo6eIfcx9O5Qynz+kg== - dependencies: - "@lerna/add" "4.0.0" - "@lerna/bootstrap" "4.0.0" - "@lerna/changed" "4.0.0" - "@lerna/clean" "4.0.0" - "@lerna/cli" "4.0.0" - "@lerna/create" "4.0.0" - "@lerna/diff" "4.0.0" - "@lerna/exec" "4.0.0" - "@lerna/import" "4.0.0" - "@lerna/info" "4.0.0" - "@lerna/init" "4.0.0" - "@lerna/link" "4.0.0" - "@lerna/list" "4.0.0" - "@lerna/publish" "4.0.0" - "@lerna/run" "4.0.0" - "@lerna/version" "4.0.0" - import-local "^3.0.2" - npmlog "^4.1.2" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -libnpmaccess@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" - integrity sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ== - dependencies: - aproba "^2.0.0" - minipass "^3.1.1" - npm-package-arg "^8.1.2" - npm-registry-fetch "^11.0.0" - -libnpmpublish@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-4.0.2.tgz#be77e8bf5956131bcb45e3caa6b96a842dec0794" - integrity sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw== - dependencies: - normalize-package-data "^3.0.2" - npm-package-arg "^8.1.2" - npm-registry-fetch "^11.0.0" - semver "^7.1.3" - ssri "^8.0.1" - -lilconfig@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@^13.2.2: - version "13.2.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.2.tgz#5e711d3139c234f73402177be2f8dd312e6508ca" - integrity sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA== - dependencies: - chalk "5.2.0" - cli-truncate "^3.1.0" - commander "^10.0.0" - debug "^4.3.4" - execa "^7.0.0" - lilconfig "2.1.0" - listr2 "^5.0.7" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-inspect "^1.12.3" - pidtree "^0.6.0" - string-argv "^0.3.1" - yaml "^2.2.2" - -listr2@^5.0.7: - version "5.0.8" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" - integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.19" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.8.0" - through "^2.3.8" - wrap-ansi "^7.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -load-json-file@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" - integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== - dependencies: - graceful-fs "^4.1.15" - parse-json "^5.0.0" - strip-bom "^4.0.0" - type-fest "^0.6.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.isfunction@^3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" - integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== - -lodash.ismatch@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" - integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.snakecase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" - integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== - -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash.upperfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" - integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== - -lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -make-fetch-happen@^8.0.9: - version "8.0.14" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" - integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== - dependencies: - agentkeepalive "^4.1.3" - cacache "^15.0.5" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - promise-retry "^2.0.1" - socks-proxy-agent "^5.0.0" - ssri "^8.0.0" - -make-fetch-happen@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" - integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== - dependencies: - agentkeepalive "^4.1.3" - cacache "^15.2.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.2" - promise-retry "^2.0.1" - socks-proxy-agent "^6.0.0" - ssri "^8.0.0" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -meow@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" - integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - 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" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== - dependencies: - minipass "^3.1.0" - minipass-sized "^1.0.3" - minizlib "^2.0.0" - optionalDependencies: - encoding "^0.1.12" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-json-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" - integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== - dependencies: - jsonparse "^1.3.1" - minipass "^3.0.0" - -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -minizlib@^2.0.0, minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp-infer-owner@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" - integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== - dependencies: - chownr "^2.0.0" - infer-owner "^1.0.4" - mkdirp "^1.0.3" - -mkdirp@^0.5.1, mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -modify-values@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" - integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== - -moment@^2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -mri@^1.1.5: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.0.0, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multimatch@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" - integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== - dependencies: - "@types/minimatch" "^3.0.3" - array-differ "^3.0.0" - array-union "^2.1.0" - arrify "^2.0.1" - minimatch "^3.0.4" - -multimatch@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" - integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== - dependencies: - "@types/minimatch" "^3.0.3" - array-differ "^3.0.0" - array-union "^2.1.0" - arrify "^2.0.1" - minimatch "^3.0.4" - -mute-stream@0.0.8, mute-stream@~0.0.4: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== - dependencies: - whatwg-url "^5.0.0" - -node-gyp@^5.0.2: - version "5.1.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" - integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.1.2" - request "^2.88.0" - rimraf "^2.6.3" - semver "^5.7.1" - tar "^4.4.12" - which "^1.3.1" - -node-gyp@^7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" - integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.3" - nopt "^5.0.0" - npmlog "^4.1.2" - request "^2.88.2" - rimraf "^3.0.2" - semver "^7.3.2" - tar "^6.0.2" - which "^2.0.2" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== - -noms@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" - integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== - dependencies: - inherits "^2.0.1" - readable-stream "~1.0.31" - -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-bundled@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-install-checks@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" - integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== - dependencies: - semver "^7.1.1" - -npm-lifecycle@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" - integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== - dependencies: - byline "^5.0.0" - graceful-fs "^4.1.15" - node-gyp "^5.0.2" - resolve-from "^4.0.0" - slide "^1.1.6" - uid-number "0.0.6" - umask "^1.1.0" - which "^1.3.1" - -npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5: - version "8.1.5" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" - integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== - dependencies: - hosted-git-info "^4.0.1" - semver "^7.3.4" - validate-npm-package-name "^3.0.0" - -npm-packlist@^2.1.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" - integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== - dependencies: - glob "^7.1.6" - ignore-walk "^3.0.3" - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" - -npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" - integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== - dependencies: - npm-install-checks "^4.0.0" - npm-normalize-package-bin "^1.0.1" - npm-package-arg "^8.1.2" - semver "^7.3.4" - -npm-registry-fetch@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" - integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== - dependencies: - make-fetch-happen "^9.0.1" - minipass "^3.1.3" - minipass-fetch "^1.3.0" - minipass-json-stream "^1.0.1" - minizlib "^2.0.0" - npm-package-arg "^8.0.0" - -npm-registry-fetch@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz#86f3feb4ce00313bc0b8f1f8f69daae6face1661" - integrity sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA== - dependencies: - "@npmcli/ci-detect" "^1.0.0" - lru-cache "^6.0.0" - make-fetch-happen "^8.0.9" - minipass "^3.1.3" - minipass-fetch "^1.3.0" - minipass-json-stream "^1.0.1" - minizlib "^2.0.0" - npm-package-arg "^8.0.0" - -npm-run-path@^4.0.0, npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.5, object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.6" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" - integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== - dependencies: - array.prototype.reduce "^1.0.5" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.21.2" - safe-array-concat "^1.0.0" - -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -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== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map-series@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" - integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-pipe@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" - integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== - -p-queue@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-reduce@^2.0.0, p-reduce@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" - integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -p-waterfall@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" - integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== - dependencies: - p-reduce "^2.0.0" - -pacote@^11.2.6: - version "11.3.5" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2" - integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg== - dependencies: - "@npmcli/git" "^2.1.0" - "@npmcli/installed-package-contents" "^1.0.6" - "@npmcli/promise-spawn" "^1.2.0" - "@npmcli/run-script" "^1.8.2" - cacache "^15.0.5" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.3" - mkdirp "^1.0.3" - npm-package-arg "^8.0.1" - npm-packlist "^2.1.4" - npm-pick-manifest "^6.0.0" - npm-registry-fetch "^11.0.0" - promise-retry "^2.0.1" - read-package-json-fast "^2.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.1.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-path@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.4.tgz#4bf424e6b743fb080831f03b536af9fc43f0ffea" - integrity sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw== - dependencies: - is-ssh "^1.3.0" - protocols "^1.4.0" - qs "^6.9.4" - query-string "^6.13.8" - -parse-url@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.5.tgz#4acab8982cef1846a0f8675fa686cef24b2f6f9b" - integrity sha512-e35AeLTSIlkw/5GFq70IN7po8fmDUjpDPY1rIK+VubRfsUvBonjQ+PBZG+vWMACnQSmNlvl524IucoDmcioMxA== - dependencies: - is-ssh "^1.3.0" - normalize-url "^6.1.0" - parse-path "^4.0.0" - protocols "^1.4.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.6.2: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-quick@^3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" - integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA== - dependencies: - chalk "^3.0.0" - execa "^4.0.0" - find-up "^4.1.0" - ignore "^5.1.4" - mri "^1.1.5" - multimatch "^4.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -promzard@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" - integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== - dependencies: - read "1" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -protocols@^1.4.0: - version "1.4.8" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" - integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== - -protocols@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" - integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== - -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== - -q@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - -qs@^6.9.4: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^6.13.8: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -read-cmd-shim@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" - integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== - -read-package-json-fast@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== - dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" - -read-package-json@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" - integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== - dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^2.0.0" - npm-normalize-package-bin "^1.0.0" - -read-package-json@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-3.0.1.tgz#c7108f0b9390257b08c21e3004d2404c806744b9" - integrity sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng== - dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^3.0.0" - npm-normalize-package-bin "^1.0.0" - -read-package-json@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.2.tgz#b444d047de7c75d4a160cb056d00c0693c1df703" - integrity sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ== - dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^3.0.0" - npm-normalize-package-bin "^1.0.0" - -read-package-tree@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" - integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== - dependencies: - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - util-promisify "^2.1.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg-up@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" - integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw== - dependencies: - find-up "^4.0.0" - read-pkg "^5.1.1" - type-fest "^0.5.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -read-pkg@^5.1.1, read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -read@1, read@~1.0.1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== - dependencies: - mute-stream "~0.0.4" - -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^2.0.6, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdir-scoped-modules@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -request@^2.88.0, request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requireindex@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - integrity sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@5.0.0, resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-global@1.0.0, resolve-global@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" - integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== - dependencies: - global-dirs "^0.1.1" - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -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.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -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== - dependencies: - glob "^7.1.3" - -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.8.0: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -"semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shx@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" - integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== - dependencies: - minimist "^1.2.3" - shelljs "^0.8.5" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -slide@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" - integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== - dependencies: - agent-base "^6.0.2" - debug "4" - socks "^2.3.3" - -socks-proxy-agent@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" - integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - -socks@^2.3.3, socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== - dependencies: - ip "^2.0.0" - smart-buffer "^4.2.0" - -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== - dependencies: - is-plain-obj "^1.0.0" - -sort-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-4.2.0.tgz#6b7638cee42c506fff8c1cecde7376d21315be18" - integrity sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== - dependencies: - is-plain-obj "^2.0.0" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -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@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -split2@^3.0.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^8.0.0, ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== - -string-argv@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strong-log-transformer@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" - integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== - dependencies: - duplexer "^0.1.1" - minimist "^1.2.0" - through "^2.3.4" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.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== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.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" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -synckit@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" - integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.5.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar@^4.4.12: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - -tar@^6.0.2, tar@^6.1.0: - version "6.1.15" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" - integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== - -temp-write@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" - integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== - dependencies: - graceful-fs "^4.1.15" - is-stream "^2.0.0" - make-dir "^3.0.0" - temp-dir "^1.0.0" - uuid "^3.3.2" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-extensions@^1.0.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" - integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -through2@^2.0.0, through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "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" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -ts-node@^10.8.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.14.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0, tslib@^2.5.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" - integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "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-fest@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" - integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== - -type-fest@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -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" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -"typescript@^4.6.4 || ^5.0.0", typescript@^5.0.4: - version "5.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" - integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== - -typescript@~4.7.3: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== - -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -uid-number@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w== - -umask@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" - integrity sha512-lE/rxOhmiScJu9L6RTNVgB/zZbF+vGC0/p6D3xnkAePI2o0sMyFG966iR5Ki50OI/0mNi2yaRnxfLsPmEZF/JA== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -upath@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" - integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== - -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util-promisify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" - integrity sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA== - dependencies: - object.getownpropertydescriptors "^2.0.3" - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -v8-compile-cache-lib@^3.0.1: - version "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@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== - dependencies: - builtins "^1.0.3" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -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== - dependencies: - makeerror "1.0.12" - -wcwidth@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.4.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^2.4.2: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: - 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== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -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" - signal-exit "^3.0.7" - -write-json-file@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" - integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== - dependencies: - detect-indent "^5.0.0" - graceful-fs "^4.1.15" - make-dir "^2.1.0" - pify "^4.0.1" - sort-keys "^2.0.0" - write-file-atomic "^2.4.2" - -write-json-file@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-4.3.0.tgz#908493d6fd23225344af324016e4ca8f702dd12d" - integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== - dependencies: - detect-indent "^6.0.0" - graceful-fs "^4.1.15" - is-plain-obj "^2.0.0" - make-dir "^3.0.0" - sort-keys "^4.0.0" - write-file-atomic "^3.0.0" - -write-pkg@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" - integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== - dependencies: - sort-keys "^2.0.0" - type-fest "^0.4.1" - write-json-file "^3.2.0" - -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.2.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2, yargs-parser@^20.2.3: - 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.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.1.0, 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.0, 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== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod@^3.20.2: - version "3.21.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" - integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@ampproject/remapping@npm:^2.2.0": + version: 2.2.1 + resolution: "@ampproject/remapping@npm:2.2.1" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.0" + "@jridgewell/trace-mapping": "npm:^0.3.9" + checksum: 92ce5915f8901d8c7cd4f4e6e2fe7b9fd335a29955b400caa52e0e5b12ca3796ada7c2f10e78c9c5b0f9c2539dff0ffea7b19850a56e1487aa083531e1e46d43 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/code-frame@npm:7.21.4" + dependencies: + "@babel/highlight": "npm:^7.18.6" + checksum: c357e4b3b7a56927cb26fcb057166fef3cc701a4e35b2fa8a87402c31be0fd41d0144c61c87bf7d3b2a8f1c4d9ef00592dc0c7e8b9500dae43340a1e9f1096de + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.22.0": + version: 7.22.3 + resolution: "@babel/compat-data@npm:7.22.3" + checksum: 70d54116197db63856ad79c84167b4226f178f6eb920b2d90b7b25ed5f3baa04c1e5f371b01577ced81cd71955c6b43775b5accef43520e1a32850eea47daab9 + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": + version: 7.22.1 + resolution: "@babel/core@npm:7.22.1" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.21.4" + "@babel/generator": "npm:^7.22.0" + "@babel/helper-compilation-targets": "npm:^7.22.1" + "@babel/helper-module-transforms": "npm:^7.22.1" + "@babel/helpers": "npm:^7.22.0" + "@babel/parser": "npm:^7.22.0" + "@babel/template": "npm:^7.21.9" + "@babel/traverse": "npm:^7.22.1" + "@babel/types": "npm:^7.22.0" + convert-source-map: "npm:^1.7.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.2" + semver: "npm:^6.3.0" + checksum: 33ede7473e3794a9904f004e87fa4625cea3f6790f0f2c6eb46145f2e8627cdcd9b6dc749b1534d579855198ebeeb1979b7ffb694c8cea7c3e6f17e718b7524b + languageName: node + linkType: hard + +"@babel/generator@npm:^7.22.0, @babel/generator@npm:^7.22.3, @babel/generator@npm:^7.7.2": + version: 7.22.3 + resolution: "@babel/generator@npm:7.22.3" + dependencies: + "@babel/types": "npm:^7.22.3" + "@jridgewell/gen-mapping": "npm:^0.3.2" + "@jridgewell/trace-mapping": "npm:^0.3.17" + jsesc: "npm:^2.5.1" + checksum: 14247dd924440b723db51a3e7c1fd6b33cebcc7360fcd56a3e3cad0447a8f2a98f95d437edb7a7c23f0c217f06224354c7aad30af8be072fb711b86e9d8b08cc + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.22.1": + version: 7.22.1 + resolution: "@babel/helper-compilation-targets@npm:7.22.1" + dependencies: + "@babel/compat-data": "npm:^7.22.0" + "@babel/helper-validator-option": "npm:^7.21.0" + browserslist: "npm:^4.21.3" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 7b9bd03db9a92f78e6ca2a490e949179cc7be9116b76bac83f11bb0f2a5a498e98066c4de2471d3f2f3ee833ddea89afa03b7fe3472080b3ef9a720879c756d6 + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.22.1": + version: 7.22.1 + resolution: "@babel/helper-environment-visitor@npm:7.22.1" + checksum: 4d8ddc75ab3f85ddc48f3a108a69b4171b9be07d419952a0db30a72d97da74d0590cfb72b2acaa5e037ad6d2cf32815e634797745624a9fc07230651f42e7ace + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-function-name@npm:7.21.0" + dependencies: + "@babel/template": "npm:^7.20.7" + "@babel/types": "npm:^7.21.0" + checksum: 5b4387afd34cd98a3a7f24f42250a5db6f7192a46e57bdbc151dc311b6299ceac151c5236018469af193dfb887b0b7ef8fe7ed89459cd05f00d69b3710c17498 + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-hoist-variables@npm:7.18.6" + dependencies: + "@babel/types": "npm:^7.18.6" + checksum: 830aa7ca663b0d2a025513ab50a9a10adb2a37d8cf3ba40bb74b8ac14d45fbc3d08c37b1889b10d36558edfbd34ff914909118ae156c2f0915f2057901b90eff + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/helper-module-imports@npm:7.21.4" + dependencies: + "@babel/types": "npm:^7.21.4" + checksum: ce62c86e8e1af9921fa2d7253a540fb5aaab424a79de47a626c4e8855950d6ac14c0d46a9ec117e8e2e256ea1062583533947202988be889a5ff2076c213be18 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.22.1": + version: 7.22.1 + resolution: "@babel/helper-module-transforms@npm:7.22.1" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.1" + "@babel/helper-module-imports": "npm:^7.21.4" + "@babel/helper-simple-access": "npm:^7.21.5" + "@babel/helper-split-export-declaration": "npm:^7.18.6" + "@babel/helper-validator-identifier": "npm:^7.19.1" + "@babel/template": "npm:^7.21.9" + "@babel/traverse": "npm:^7.22.1" + "@babel/types": "npm:^7.22.0" + checksum: 559f3833f518c632b06a75ccb56e104536e9aaf5699205d24ecbb274bdb75e744081b85884d268e85c805ba33854c1aab501d6452592014b8adfdbc3a8b090a6 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.21.5 + resolution: "@babel/helper-plugin-utils@npm:7.21.5" + checksum: 3d97ba406b32bd9ed0022d6ede2e07e98c130f4cbfffa044b3c5713d94e9b5f557242651713e2c79569cc13d6c67ef9fa749e87cb3da60a506a79bdc2a0c3d43 + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.21.5": + version: 7.21.5 + resolution: "@babel/helper-simple-access@npm:7.21.5" + dependencies: + "@babel/types": "npm:^7.21.5" + checksum: 682cd80b47c2424c31afe70bcc8ad3e401c612f6923c432e4b8245c5b6bc5ccddf3e405ea41ba890ccab79c0b5b95da3db125944ac0decc8d31d48469e593a0e + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-split-export-declaration@npm:7.18.6" + dependencies: + "@babel/types": "npm:^7.18.6" + checksum: 1335b510a9aefcbf60d89648e622715774e56040d72302dc5e176c8d837c9ab81414ccfa9ed771a9f98da7192579bb12ab7a95948bfdc69b03b4a882b3983e48 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.21.5": + version: 7.21.5 + resolution: "@babel/helper-string-parser@npm:7.21.5" + checksum: 4d0834c4a67c283e9277f5e565551fede00b7d68007e368c95c776e13d05002e8f9861716e11613880889d6f3463329d2af687ceea5fc5263f8b3d25a53d31da + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: f348d5637ad70b6b54b026d6544bd9040f78d24e7ec245a0fc42293968181f6ae9879c22d89744730d246ce8ec53588f716f102addd4df8bbc79b73ea10004ac + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/helper-validator-identifier@npm:7.19.1" + checksum: f978ecfea840f65b64ab9e17fac380625a45f4fe1361eeb29867fcfd1c9eaa72abd7023f2f40ac3168587d7e5153660d16cfccb352a557be2efd347a051b4b20 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-validator-option@npm:7.21.0" + checksum: a5efbf3f09f1514d1704f3f7bf0e5fac401fff48a9b84a9eb47a52a4c13beee9802c6cf212a82c5fb95f6cc6b5932cb32e756cf33075be17352f64827a8ec066 + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.22.0": + version: 7.22.3 + resolution: "@babel/helpers@npm:7.22.3" + dependencies: + "@babel/template": "npm:^7.21.9" + "@babel/traverse": "npm:^7.22.1" + "@babel/types": "npm:^7.22.3" + checksum: aac260672708d22fd90f00ace641d3c86feef1560b81ca754cb68f6a94a4d6c2468701641673c9b2ea9e0812dae6c2be58d94dd28c5251564cb77ed430c711b9 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/highlight@npm:7.18.6" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.18.6" + chalk: "npm:^2.0.0" + js-tokens: "npm:^4.0.0" + checksum: a6a6928d25099ef04c337fcbb829fab8059bb67d31ac37212efd611bdbe247d0e71a5096c4524272cb56399f40251fac57c025e42d3bc924db0183a6435a60ac + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.9, @babel/parser@npm:^7.22.0, @babel/parser@npm:^7.22.4": + version: 7.22.4 + resolution: "@babel/parser@npm:7.22.4" + bin: + parser: ./bin/babel-parser.js + checksum: 86e2abfb60faf523dc97d19f41388d8e46c02af306374618d638c960a49e74f8c23ef73032b5bde6011d64ee23820388427bd1d00a54be68f2e4545fa0c5b9bb + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.8.3": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.12.13" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/plugin-syntax-jsx@npm:7.21.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.20.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e5dbec5e1c53f114413dc3cc71f43b483d2f0784d5efdcd92c95a55b148d0f1987d136236ace24778d3365dc3d37b0b4d8cc1e0594267860f9f131ef5f5dfc73 + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/plugin-syntax-typescript@npm:7.21.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.20.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a4561a8ff7833e3644b8cb50482a405403ef8216271f6b53ad2c35bd0689323b32a1f4cc52569b5120df2c577f1a80c5795cac474ede6334268f42faf389d56f + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.20.7": + version: 7.22.3 + resolution: "@babel/runtime@npm:7.22.3" + dependencies: + regenerator-runtime: "npm:^0.13.11" + checksum: 097d0d6aaab0dea782d14f720a7383ea50fa87cba6c070495aea691739ea11459d80b4acd086a38d52894a2b15d4748dc8040dba3706aa18a8d5c8d896dec9b0 + languageName: node + linkType: hard + +"@babel/template@npm:^7.20.7, @babel/template@npm:^7.21.9, @babel/template@npm:^7.3.3": + version: 7.21.9 + resolution: "@babel/template@npm:7.21.9" + dependencies: + "@babel/code-frame": "npm:^7.21.4" + "@babel/parser": "npm:^7.21.9" + "@babel/types": "npm:^7.21.5" + checksum: 179ba79822ab79f7629e09bcb5a0c3f9adc27ea0fae855f9f16ea78407ee2e89b6b6cb37ad5da64e14c104261512f53328113b6ee443d8cf5145d15a6e963c5f + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.22.1, @babel/traverse@npm:^7.7.2": + version: 7.22.4 + resolution: "@babel/traverse@npm:7.22.4" + dependencies: + "@babel/code-frame": "npm:^7.21.4" + "@babel/generator": "npm:^7.22.3" + "@babel/helper-environment-visitor": "npm:^7.22.1" + "@babel/helper-function-name": "npm:^7.21.0" + "@babel/helper-hoist-variables": "npm:^7.18.6" + "@babel/helper-split-export-declaration": "npm:^7.18.6" + "@babel/parser": "npm:^7.22.4" + "@babel/types": "npm:^7.22.4" + debug: "npm:^4.1.0" + globals: "npm:^11.1.0" + checksum: 350ddd9bc9f1243f44c552503a31e09d8bdf24e692c1836de91ac773006890fcaa1de32ea620ac86568795f9c80e39229781f2dca4a95bd35a777203c5210370 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.4, @babel/types@npm:^7.21.5, @babel/types@npm:^7.22.0, @babel/types@npm:^7.22.3, @babel/types@npm:^7.22.4, @babel/types@npm:^7.3.3": + version: 7.22.4 + resolution: "@babel/types@npm:7.22.4" + dependencies: + "@babel/helper-string-parser": "npm:^7.21.5" + "@babel/helper-validator-identifier": "npm:^7.19.1" + to-fast-properties: "npm:^2.0.0" + checksum: 6e62674eec13b6dbef38168b09638642105483b1a026c8b517a2fe3cee0e37e457d976e82d42dd4ff475cfff4f44e337215bdf6b184662841b19edf7268c6d04 + languageName: node + linkType: hard + +"@babel/types@npm:^7.8.3": + version: 7.23.9 + resolution: "@babel/types@npm:7.23.9" + dependencies: + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: edc7bb180ce7e4d2aea10c6972fb10474341ac39ba8fdc4a27ffb328368dfdfbf40fca18e441bbe7c483774500d5c05e222cec276c242e952853dcaf4eb884f7 + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 + languageName: node + linkType: hard + +"@commitlint/cli@npm:^17.6.3": + version: 17.6.5 + resolution: "@commitlint/cli@npm:17.6.5" + dependencies: + "@commitlint/format": "npm:^17.4.4" + "@commitlint/lint": "npm:^17.6.5" + "@commitlint/load": "npm:^17.5.0" + "@commitlint/read": "npm:^17.5.1" + "@commitlint/types": "npm:^17.4.4" + execa: "npm:^5.0.0" + lodash.isfunction: "npm:^3.0.9" + resolve-from: "npm:5.0.0" + resolve-global: "npm:1.0.0" + yargs: "npm:^17.0.0" + bin: + commitlint: cli.js + checksum: 08086db89ca7454e84e10064f1baf49ae917bcbe1d242a418750d8e547e6fb76f694bcb29e157733a032042e8e1762c12e407fbce76eb7ad97df48feec667840 + languageName: node + linkType: hard + +"@commitlint/config-conventional@npm:^17.6.3": + version: 17.6.5 + resolution: "@commitlint/config-conventional@npm:17.6.5" + dependencies: + conventional-changelog-conventionalcommits: "npm:^5.0.0" + checksum: 5ac8cd6cd97d0e828da64f252423ad9a05883f65ccfad2a8f58aab2ab9c041e0da6e63f12ac57b27b5c3060c6bb9184eeb5ac163fc42df74120d7c15cfc2d00c + languageName: node + linkType: hard + +"@commitlint/config-validator@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/config-validator@npm:17.4.4" + dependencies: + "@commitlint/types": "npm:^17.4.4" + ajv: "npm:^8.11.0" + checksum: 2270d53f514aae72931c87cfb0fb82faf2bceea6014b7d4beba21f1b8cba373b9ae60e9fc10e01797f971e7c2413e8a176fd30b7f7f2b04b471e54498d38ee2d + languageName: node + linkType: hard + +"@commitlint/ensure@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/ensure@npm:17.4.4" + dependencies: + "@commitlint/types": "npm:^17.4.4" + lodash.camelcase: "npm:^4.3.0" + lodash.kebabcase: "npm:^4.1.1" + lodash.snakecase: "npm:^4.1.1" + lodash.startcase: "npm:^4.4.0" + lodash.upperfirst: "npm:^4.3.1" + checksum: c0f29ac938ea90130b6bd9677bd42b8f8eb0561a3d06bd4d47dd6a03d17155b77839aff5e05e4b0e72405479ece8e8cd2ebf49617999862d59ff0d54531ee5cf + languageName: node + linkType: hard + +"@commitlint/execute-rule@npm:^17.4.0": + version: 17.4.0 + resolution: "@commitlint/execute-rule@npm:17.4.0" + checksum: 832870273d6414663799ae3339317aeab629be01e3a5c0e6382628f5b84ab417c64475dcd63dfc55d55388d00d5cfdf97f72173b3553f33a6daf7ab9982c37db + languageName: node + linkType: hard + +"@commitlint/format@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/format@npm:17.4.4" + dependencies: + "@commitlint/types": "npm:^17.4.4" + chalk: "npm:^4.1.0" + checksum: 6b3e84c4dd9d8331505de6039f1cbfb37e129567a30fff12beb17c27f1e52b5dd8ca68ed7a8e9b66378ae29817cbe0d4bf24c42f151dee24582c8c1d6cdfb306 + languageName: node + linkType: hard + +"@commitlint/is-ignored@npm:^17.6.5": + version: 17.6.5 + resolution: "@commitlint/is-ignored@npm:17.6.5" + dependencies: + "@commitlint/types": "npm:^17.4.4" + semver: "npm:7.5.0" + checksum: 0bd8924cff9b8310032bc28154196f799a5c93729632aa4be70573d452cc5eebd281f5f44bb9199dd24c00205e424ed4f8777d427fabed4402cef2ad90a9f489 + languageName: node + linkType: hard + +"@commitlint/lint@npm:^17.6.5": + version: 17.6.5 + resolution: "@commitlint/lint@npm:17.6.5" + dependencies: + "@commitlint/is-ignored": "npm:^17.6.5" + "@commitlint/parse": "npm:^17.6.5" + "@commitlint/rules": "npm:^17.6.5" + "@commitlint/types": "npm:^17.4.4" + checksum: 25ea2bdbccdcdff6c45a2d81dfdaa572eebe24936197ef2b51fde26ea5d4caa73e35ab0a867fe91f609e27ff1548bc7923559693fc2a135b7980c8ee838422d9 + languageName: node + linkType: hard + +"@commitlint/load@npm:^17.5.0": + version: 17.5.0 + resolution: "@commitlint/load@npm:17.5.0" + dependencies: + "@commitlint/config-validator": "npm:^17.4.4" + "@commitlint/execute-rule": "npm:^17.4.0" + "@commitlint/resolve-extends": "npm:^17.4.4" + "@commitlint/types": "npm:^17.4.4" + "@types/node": "npm:*" + chalk: "npm:^4.1.0" + cosmiconfig: "npm:^8.0.0" + cosmiconfig-typescript-loader: "npm:^4.0.0" + lodash.isplainobject: "npm:^4.0.6" + lodash.merge: "npm:^4.6.2" + lodash.uniq: "npm:^4.5.0" + resolve-from: "npm:^5.0.0" + ts-node: "npm:^10.8.1" + typescript: "npm:^4.6.4 || ^5.0.0" + checksum: 894375c1beffd7c165a4f21a83da2b30197ceeb4076630eef91eb523a02018a7e53db4d90277e451db46037a994ee92b083f21290bf0ec07a951a309d309dc8f + languageName: node + linkType: hard + +"@commitlint/message@npm:^17.4.2": + version: 17.4.2 + resolution: "@commitlint/message@npm:17.4.2" + checksum: 9ff0339852babf4c3f7af3ce43762a640a7e2664ccd86cc7b623efca079f13a9efe1567eb2d0cfed30e9d410bbd74e6ceb884d9d139e6761fdaabd81e0d1db51 + languageName: node + linkType: hard + +"@commitlint/parse@npm:^17.6.5": + version: 17.6.5 + resolution: "@commitlint/parse@npm:17.6.5" + dependencies: + "@commitlint/types": "npm:^17.4.4" + conventional-changelog-angular: "npm:^5.0.11" + conventional-commits-parser: "npm:^3.2.2" + checksum: ec13cb7e0d14e7dd55dad22dc942d4978a8933a52919c9e0bd93e68ed0c1fac6f98d4fa7cc48a25c5233907a6a08fc2b7ccb8a9b6cc69e3bc536f000fda62f98 + languageName: node + linkType: hard + +"@commitlint/read@npm:^17.5.1": + version: 17.5.1 + resolution: "@commitlint/read@npm:17.5.1" + dependencies: + "@commitlint/top-level": "npm:^17.4.0" + "@commitlint/types": "npm:^17.4.4" + fs-extra: "npm:^11.0.0" + git-raw-commits: "npm:^2.0.11" + minimist: "npm:^1.2.6" + checksum: 60c4351eb8c8bdafa331f690486bfc338ddb3c2341e6cd168ea38748116a75ad96711f08825e2faeb90d85b43d07ced221b2f69c6f228001b57372a39bdafefe + languageName: node + linkType: hard + +"@commitlint/resolve-extends@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/resolve-extends@npm:17.4.4" + dependencies: + "@commitlint/config-validator": "npm:^17.4.4" + "@commitlint/types": "npm:^17.4.4" + import-fresh: "npm:^3.0.0" + lodash.mergewith: "npm:^4.6.2" + resolve-from: "npm:^5.0.0" + resolve-global: "npm:^1.0.0" + checksum: b81f5ad692c1f3aabd7b09cdca5f82c4d78aa7c28a859efbfe790dfa9b7487507e17040d8fbd5ea0aa05881fe365fcb914927cd20836feb3fa558e3bd61d52b4 + languageName: node + linkType: hard + +"@commitlint/rules@npm:^17.6.5": + version: 17.6.5 + resolution: "@commitlint/rules@npm:17.6.5" + dependencies: + "@commitlint/ensure": "npm:^17.4.4" + "@commitlint/message": "npm:^17.4.2" + "@commitlint/to-lines": "npm:^17.4.0" + "@commitlint/types": "npm:^17.4.4" + execa: "npm:^5.0.0" + checksum: ab2cd081ab1039104d9670bf67b8c3ecf56cc9e03ff558231ea43fd3c95187d805c0c8d351a7fe2175069246053c7325c1fd450d82ef2c6333d2056c64432343 + languageName: node + linkType: hard + +"@commitlint/to-lines@npm:^17.4.0": + version: 17.4.0 + resolution: "@commitlint/to-lines@npm:17.4.0" + checksum: 6d02a4e731820168ce6fca7150587170a291786a7edc93438d4ec09997675d322ea38b7533d5c32de50ca0092d89d111bf8118a78d6025603dee6587a3fa68da + languageName: node + linkType: hard + +"@commitlint/top-level@npm:^17.4.0": + version: 17.4.0 + resolution: "@commitlint/top-level@npm:17.4.0" + dependencies: + find-up: "npm:^5.0.0" + checksum: 67677d11b55b27826cb7fb70556cd237435336280e0e65b622eca778f5761aa1011d99e78101a23726b3d6649338967369d3ccb0371b60a21f7f9c65ff565f2d + languageName: node + linkType: hard + +"@commitlint/types@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/types@npm:17.4.4" + dependencies: + chalk: "npm:^4.1.0" + checksum: d6419001d8044954f68ec077a54b21ad73f36901287abf496cf31ccf4d66ea7b816adf7143290d0f382f2ef625416b1d2fa99ad8b80876e1d5772a8c7165cd26 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: "npm:^3.3.0" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.4.0": + version: 4.5.1 + resolution: "@eslint-community/regexpp@npm:4.5.1" + checksum: d79cbd99cc4dcfbb17e8dd30a30bb5aec5da9c60b9471043f886f116615bb15f0d417cb0ca638cefedba0b4c67c339e2011b53d88264a4540775f042a5879e01 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.0.3": + version: 2.0.3 + resolution: "@eslint/eslintrc@npm:2.0.3" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.5.2" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 46291c33bf580ab12101fb7f20adabaa60326a7de094409ab4a5ca4611552ab2325f8d677d6c1d2d9f45f83f93360b115a0b4488bc48180cca0d0f386804d829 + languageName: node + linkType: hard + +"@eslint/js@npm:8.41.0": + version: 8.41.0 + resolution: "@eslint/js@npm:8.41.0" + checksum: 41cf403ccebbc90315c7190bd901fa17975327022146b2db8c846ec5b11d04c56b33ccf9064b9da7349068e96bef8f322423fbcce700d815b4097fd808aaa4c6 + languageName: node + linkType: hard + +"@gar/promisify@npm:^1.0.1": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 0b3c9958d3cd17f4add3574975e3115ae05dc7f1298a60810414b16f6f558c137b5fb3cd3905df380bacfd955ec13f67c1e6710cbb5c246a7e8d65a8289b2bff + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.8": + version: 0.11.10 + resolution: "@humanwhocodes/config-array@npm:0.11.10" + dependencies: + "@humanwhocodes/object-schema": "npm:^1.2.1" + debug: "npm:^4.1.1" + minimatch: "npm:^3.0.5" + checksum: 9e307a49a5baa28beb243d2c14c145f288fccd6885f4c92a9055707057ec40980242256b2a07c976cfa6c75f7081da111a40a9844d1ca8daeff2302f8b640e76 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.1": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: c3c35fdb70c04a569278351c75553e293ae339684ed75895edc79facc7276e351115786946658d78133130c0cca80e57e2203bc07f8fa7fe7980300e8deef7db + languageName: node + linkType: hard + +"@hutson/parse-repository-url@npm:^3.0.0": + version: 3.0.2 + resolution: "@hutson/parse-repository-url@npm:3.0.2" + checksum: d9197757ecad2df18d29d3e1d1fe0716d458fd88b849c71cbec9e78239f911074c97e8d764dfd8ed890431c1137e52dd7a337207fd65be20ce0784f7860ae4d1 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: "npm:^5.3.1" + find-up: "npm:^4.1.0" + get-package-type: "npm:^0.1.0" + js-yaml: "npm:^3.13.1" + resolve-from: "npm:^5.0.0" + checksum: dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a + languageName: node + linkType: hard + +"@jest/console@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/console@npm:29.5.0" + dependencies: + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + slash: "npm:^3.0.0" + checksum: 59dfbdb6c3c15652f8d7267071f24d6335afbed0b1cf71aed70b6ce8deb1d86e7f4aadb978f639435650107fd22476b59e63a3d3a9ac99b1aca739b795a54410 + languageName: node + linkType: hard + +"@jest/core@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/core@npm:29.5.0" + dependencies: + "@jest/console": "npm:^29.5.0" + "@jest/reporters": "npm:^29.5.0" + "@jest/test-result": "npm:^29.5.0" + "@jest/transform": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.5.0" + jest-config: "npm:^29.5.0" + jest-haste-map: "npm:^29.5.0" + jest-message-util: "npm:^29.5.0" + jest-regex-util: "npm:^29.4.3" + jest-resolve: "npm:^29.5.0" + jest-resolve-dependencies: "npm:^29.5.0" + jest-runner: "npm:^29.5.0" + jest-runtime: "npm:^29.5.0" + jest-snapshot: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + jest-validate: "npm:^29.5.0" + jest-watcher: "npm:^29.5.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.5.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: e4b3e0de48614b2c339083b9159f00a024839984bd89b9afa4cfff4c38f6ce485c2009f2efa1c1e3bb3b87386288bc15798c6aebb7937d7820e8048d75461a4d + languageName: node + linkType: hard + +"@jest/environment@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/environment@npm:29.5.0" + dependencies: + "@jest/fake-timers": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + jest-mock: "npm:^29.5.0" + checksum: 1fbe63cbfb9c3f6c9fc9d8f6917a5aceee1828d589569bbffcf5fb4bb56bc021dc3a6f239cde3099144767c97763ae134904ee522f236cd8c0d071bd7f9ef63b + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/expect-utils@npm:29.5.0" + dependencies: + jest-get-type: "npm:^29.4.3" + checksum: e7f44de651b5ef71c6e1b7a0350a704258167c20b6e8165b3100346d5c7f8eb4cd2c229ea2c048e9161666d1c086fbbc422f111f3b77da3fb89a99d52d4b3690 + languageName: node + linkType: hard + +"@jest/expect@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/expect@npm:29.5.0" + dependencies: + expect: "npm:^29.5.0" + jest-snapshot: "npm:^29.5.0" + checksum: 447e7450af8ba61ac34d8a2ca11c56c62f6f0fb33ff13130f11a1ec9526a08d756ee72da622316a2c52ecfe726fe14432bdfb46e45aff5676f8d1a8efc8d201c + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/fake-timers@npm:29.5.0" + dependencies: + "@jest/types": "npm:^29.5.0" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.5.0" + jest-mock: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + checksum: dbf52fd302bf6b3d7ec49499f12835b7d7d4069d61adc62dac233021eba61186bbad3add1ceb3225a23a8745dd04fa0dcc2c38d350ecb0f26eec63f2cf5e6aff + languageName: node + linkType: hard + +"@jest/globals@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/globals@npm:29.5.0" + dependencies: + "@jest/environment": "npm:^29.5.0" + "@jest/expect": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + jest-mock: "npm:^29.5.0" + checksum: 0c25f07d8125e45cf3c21442e625f6a636eaf7f4cf1cf3f9f66bae059aeb31d3dc61dfff9479eb861a5089dca34c95e231ad88b8925bee42387abecbfe5ecbc2 + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/reporters@npm:29.5.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.5.0" + "@jest/test-result": "npm:^29.5.0" + "@jest/transform": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.15" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^5.1.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + jest-worker: "npm:^29.5.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 72b771a7749ac2eb9b671f2a886dc98cbe914dfa1a4266854b040e4cc563bf9f5db02b8ff8654b7bfbc3b28caa6d48ca0dde9707454ea4f79d77bd13b6357929 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/schemas@npm:29.4.3" + dependencies: + "@sinclair/typebox": "npm:^0.25.16" + checksum: 8a35967cec454d1de2d5a58ab99b49a0ff798d1dce2d817bdd9960bb2f070493f767fbbf419e6a263860d3b1ef1e50ab609a76ae21b5f8c09bb0859e8f51a098 + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/source-map@npm:29.4.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.15" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: 353f9989dcb416e8a2559ad2831b4b3e8446a9f8259782cec97f89903b5c00baa76ea3e23a3f1c83c1ccb3999a9e318b8c6a4bab29e4b66a4abdbb760e445a50 + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/test-result@npm:29.5.0" + dependencies: + "@jest/console": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: 5d637c9935ea0438b2a7c106d48756967e5a96fa4426a9b16ea2a3e73e1538eabd10fd4faa8eb46aa4fee710a165e0fd2ce0603dacde5e8a1bba541100854b1d + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/test-sequencer@npm:29.5.0" + dependencies: + "@jest/test-result": "npm:^29.5.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.5.0" + slash: "npm:^3.0.0" + checksum: 6fb7549a5dbe2da6817eb853134f76cf2b320b283900c5e63c997ecfadc616379372a49ac8c0f4ffdb9616eed4a5908c74cb7a560a395a6e1dc0d072b865657b + languageName: node + linkType: hard + +"@jest/transform@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/transform@npm:29.5.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/types": "npm:^29.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.15" + babel-plugin-istanbul: "npm:^6.1.1" + chalk: "npm:^4.0.0" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.5.0" + jest-regex-util: "npm:^29.4.3" + jest-util: "npm:^29.5.0" + micromatch: "npm:^4.0.4" + pirates: "npm:^4.0.4" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.2" + checksum: 113598311d84ec7e4a4aadd340e332bbfbbd66e20eabea8b2f084b80cf97c1bc9e1ff90278c4f04b227afa95e3386d702363715f9923062c370c042c31911d94 + languageName: node + linkType: hard + +"@jest/types@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/types@npm:29.5.0" + dependencies: + "@jest/schemas": "npm:^29.4.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: f1cccd2e9b00a985bfdac03517f906cdf7a481be3606c335f8ec08a7272b7cf700b23484ce323a912b374defb90d3ab88c643cf2a2f47635c1c4feacfa1c1b2d + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.3 + resolution: "@jridgewell/gen-mapping@npm:0.3.3" + dependencies: + "@jridgewell/set-array": "npm:^1.0.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.9" + checksum: 376fc11cf5a967318ba3ddd9d8e91be528eab6af66810a713c49b0c3f8dc67e9949452c51c38ab1b19aa618fb5e8594da5a249977e26b1e7fea1ee5a1fcacc74 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: 78055e2526108331126366572045355051a930f017d1904a4f753d3f4acee8d92a14854948095626f6163cffc24ea4e3efa30637417bb866b84743dec7ef6fd9 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: 0dbc9e29bc640bbbdc5b9876d2859c69042bfcf1423c1e6421bcca53e826660bff4e41c7d4bcb8dbea696404231a6f902f76ba41835d049e20f2dd6cffb713bf + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: bc7ab4c4c00470de4e7562ecac3c0c84f53e7ee8a711e546d67c47da7febe7c45cd67d4d84ee3c9b2c05ae8e872656cdded8a707a283d30bd54fbc65aef821ab + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:1.4.14": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 3fbaff1387c1338b097eeb6ff92890d7838f7de0dde259e4983763b44540bfd5ca6a1f7644dc8ad003a57f7e80670d5b96a8402f1386ba9aee074743ae9bad51 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: 0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.18 + resolution: "@jridgewell/trace-mapping@npm:0.3.18" + dependencies: + "@jridgewell/resolve-uri": "npm:3.1.0" + "@jridgewell/sourcemap-codec": "npm:1.4.14" + checksum: e5045775f076022b6c7cc64a7b55742faa5442301cb3389fd0e6712fafc46a2bb13c68fa1ffaf7b8bb665a91196f050b4115885fc802094ebc06a1cf665935ac + languageName: node + linkType: hard + +"@lerna/add@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/add@npm:4.0.0" + dependencies: + "@lerna/bootstrap": "npm:4.0.0" + "@lerna/command": "npm:4.0.0" + "@lerna/filter-options": "npm:4.0.0" + "@lerna/npm-conf": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + dedent: "npm:^0.7.0" + npm-package-arg: "npm:^8.1.0" + p-map: "npm:^4.0.0" + pacote: "npm:^11.2.6" + semver: "npm:^7.3.4" + checksum: b20eb2d32408ab787ad99fe6357f113475d4d8c34187dfac9e71226277dd6fc3490150c9120d07f74c02d1c59414e42df010e9343a1765000faef5ab23f77562 + languageName: node + linkType: hard + +"@lerna/bootstrap@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/bootstrap@npm:4.0.0" + dependencies: + "@lerna/command": "npm:4.0.0" + "@lerna/filter-options": "npm:4.0.0" + "@lerna/has-npm-version": "npm:4.0.0" + "@lerna/npm-install": "npm:4.0.0" + "@lerna/package-graph": "npm:4.0.0" + "@lerna/pulse-till-done": "npm:4.0.0" + "@lerna/rimraf-dir": "npm:4.0.0" + "@lerna/run-lifecycle": "npm:4.0.0" + "@lerna/run-topologically": "npm:4.0.0" + "@lerna/symlink-binary": "npm:4.0.0" + "@lerna/symlink-dependencies": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + dedent: "npm:^0.7.0" + get-port: "npm:^5.1.1" + multimatch: "npm:^5.0.0" + npm-package-arg: "npm:^8.1.0" + npmlog: "npm:^4.1.2" + p-map: "npm:^4.0.0" + p-map-series: "npm:^2.1.0" + p-waterfall: "npm:^2.1.1" + read-package-tree: "npm:^5.3.1" + semver: "npm:^7.3.4" + checksum: 16da64bf541045250fc1c9ac385e1837af62b6d5a08dc64ca2c502afd7a97feba8039496e93cc6f8b679d648daa035ffbf76f86c90c7158df68259f78cf77e50 + languageName: node + linkType: hard + +"@lerna/changed@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/changed@npm:4.0.0" + dependencies: + "@lerna/collect-updates": "npm:4.0.0" + "@lerna/command": "npm:4.0.0" + "@lerna/listable": "npm:4.0.0" + "@lerna/output": "npm:4.0.0" + checksum: 9442f0f9d40fb1cce344ddef07f7d04377712f1926eaefba212fe04d7213605b69c7a4b0a7abe286bbc9c079e766166a9994d6c42c6e9a2460332ae0e351502f + languageName: node + linkType: hard + +"@lerna/check-working-tree@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/check-working-tree@npm:4.0.0" + dependencies: + "@lerna/collect-uncommitted": "npm:4.0.0" + "@lerna/describe-ref": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + checksum: 415a681069b9bffd2f68628a68b4710ccd7e394d70437e592f515c590972a378b99ee1984c6137b9170ef796571e3f7568c45dc3e3fe8d2e527dcf6be89f946b + languageName: node + linkType: hard + +"@lerna/child-process@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/child-process@npm:4.0.0" + dependencies: + chalk: "npm:^4.1.0" + execa: "npm:^5.0.0" + strong-log-transformer: "npm:^2.1.0" + checksum: 85a9d2302691e9348b5b7fd848dcf93101188859257bfc0315dabf96f6b385ee269d1d127f3c44dfd3f64c39247b3e4995f03ca0b70d2bcd44da8acc904c0cab + languageName: node + linkType: hard + +"@lerna/clean@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/clean@npm:4.0.0" + dependencies: + "@lerna/command": "npm:4.0.0" + "@lerna/filter-options": "npm:4.0.0" + "@lerna/prompt": "npm:4.0.0" + "@lerna/pulse-till-done": "npm:4.0.0" + "@lerna/rimraf-dir": "npm:4.0.0" + p-map: "npm:^4.0.0" + p-map-series: "npm:^2.1.0" + p-waterfall: "npm:^2.1.1" + checksum: 83e4b1945fff7c10a03780eae1348d956f2c318e158374d5dce995d549a3ebbb87e4e36b81e4383a2748e9ca3285e87202c0c1af3480f308ce16c152041e08f9 + languageName: node + linkType: hard + +"@lerna/cli@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/cli@npm:4.0.0" + dependencies: + "@lerna/global-options": "npm:4.0.0" + dedent: "npm:^0.7.0" + npmlog: "npm:^4.1.2" + yargs: "npm:^16.2.0" + checksum: bb6638381543bc99c77acd6d0c6169c0f8072a34b0830f0a082aeabe5968aa605501676aa1ad663a480d91a115b218098ec6da48da2e6e0cf64f2750acd97ca2 + languageName: node + linkType: hard + +"@lerna/collect-uncommitted@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/collect-uncommitted@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + chalk: "npm:^4.1.0" + npmlog: "npm:^4.1.2" + checksum: b35b82312c9f68b16ee8447790c5a1998794772fe3592ae606fd227243693e54e5892d1884e01ea91a0288561881ca80b06507ccb15897557ef9818bfd27b634 + languageName: node + linkType: hard + +"@lerna/collect-updates@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/collect-updates@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@lerna/describe-ref": "npm:4.0.0" + minimatch: "npm:^3.0.4" + npmlog: "npm:^4.1.2" + slash: "npm:^3.0.0" + checksum: d4fcdf35f9f8590e9247013710b30e5931af78c98a802d701d7991edf5e6f6ced4bed96e99b70bc3e926e125a16b9a2a0f9f0b4692dacd9751ddc0db96ed9484 + languageName: node + linkType: hard + +"@lerna/command@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/command@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@lerna/package-graph": "npm:4.0.0" + "@lerna/project": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + "@lerna/write-log-file": "npm:4.0.0" + clone-deep: "npm:^4.0.1" + dedent: "npm:^0.7.0" + execa: "npm:^5.0.0" + is-ci: "npm:^2.0.0" + npmlog: "npm:^4.1.2" + checksum: 6c901035f028103b317d17617956e9b1a7d5af2a33ff5d88dc533a5d00b5c6c99aa2842f0ef3043cb393133f49f66622392dc937105d50276f543f8e90a73101 + languageName: node + linkType: hard + +"@lerna/conventional-commits@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/conventional-commits@npm:4.0.0" + dependencies: + "@lerna/validation-error": "npm:4.0.0" + conventional-changelog-angular: "npm:^5.0.12" + conventional-changelog-core: "npm:^4.2.2" + conventional-recommended-bump: "npm:^6.1.0" + fs-extra: "npm:^9.1.0" + get-stream: "npm:^6.0.0" + lodash.template: "npm:^4.5.0" + npm-package-arg: "npm:^8.1.0" + npmlog: "npm:^4.1.2" + pify: "npm:^5.0.0" + semver: "npm:^7.3.4" + checksum: b33764f891faa5b193a605a9320583641aab6098311052185f3d47bc75cc1e2f0397be09b2101b5f9406ab6cced554d1d9397c20b45871c2bc62ba61be043756 + languageName: node + linkType: hard + +"@lerna/create-symlink@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/create-symlink@npm:4.0.0" + dependencies: + cmd-shim: "npm:^4.1.0" + fs-extra: "npm:^9.1.0" + npmlog: "npm:^4.1.2" + checksum: e28aa42bccd4c14e2466624d533d7e4bd66eb67c3c0f5fb8ac0f4c39e66b461e6599145a7d2bfd7e2ccb5f0fa105516de94fd74ccb571fe7c508910c5dbc97e7 + languageName: node + linkType: hard + +"@lerna/create@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/create@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@lerna/command": "npm:4.0.0" + "@lerna/npm-conf": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + dedent: "npm:^0.7.0" + fs-extra: "npm:^9.1.0" + globby: "npm:^11.0.2" + init-package-json: "npm:^2.0.2" + npm-package-arg: "npm:^8.1.0" + p-reduce: "npm:^2.1.0" + pacote: "npm:^11.2.6" + pify: "npm:^5.0.0" + semver: "npm:^7.3.4" + slash: "npm:^3.0.0" + validate-npm-package-license: "npm:^3.0.4" + validate-npm-package-name: "npm:^3.0.0" + whatwg-url: "npm:^8.4.0" + yargs-parser: "npm:20.2.4" + checksum: dcf362c5779dd53e4220ffa8f10117e5a3a5b9505ceddd31f379f3a9bc9c75de82c7aec24e08b77ea124c8d433d62fdb199de96d6a4e017da25d538c52a319bb + languageName: node + linkType: hard + +"@lerna/describe-ref@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/describe-ref@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + npmlog: "npm:^4.1.2" + checksum: 8f25619c6d12424c0239f9839782315c020869985f89b02b2f5b78e0eeed70dfa4445eb6ca2e0cd4fa709f88eaac48e86a3091d4647283111157f67e810ffc5e + languageName: node + linkType: hard + +"@lerna/diff@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/diff@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@lerna/command": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + npmlog: "npm:^4.1.2" + checksum: e7a6798c6840c608cf5436826b280df69a6925ab01e7062651ae954aefe6e9b2f7f64a03b5fca1224a0ad823a6e9db8d15529826f5401a943c14aa95dcc4c1b8 + languageName: node + linkType: hard + +"@lerna/exec@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/exec@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@lerna/command": "npm:4.0.0" + "@lerna/filter-options": "npm:4.0.0" + "@lerna/profiler": "npm:4.0.0" + "@lerna/run-topologically": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + p-map: "npm:^4.0.0" + checksum: 8a416a8b702de8f209aea4b0bf0fc8b414b5cee677d0f4c1e5c582e5ffbe6371f652d912df8f14d8ce720a2e63ba7aacba4ef3cbe588df3ed2d4ff1916a73dc3 + languageName: node + linkType: hard + +"@lerna/filter-options@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/filter-options@npm:4.0.0" + dependencies: + "@lerna/collect-updates": "npm:4.0.0" + "@lerna/filter-packages": "npm:4.0.0" + dedent: "npm:^0.7.0" + npmlog: "npm:^4.1.2" + checksum: be84a7ed5fc0b04c2dacc6d863ba5a1ae5a52745c7a70864e3bb401668af84280bfd8fe0dcb52b3a1e48b6a8e9cb9359cd6ca1d043917d667f38cd48d262cf92 + languageName: node + linkType: hard + +"@lerna/filter-packages@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/filter-packages@npm:4.0.0" + dependencies: + "@lerna/validation-error": "npm:4.0.0" + multimatch: "npm:^5.0.0" + npmlog: "npm:^4.1.2" + checksum: 01e1829f0f6dcbfbfea091421ce030d83ea8db36ca4e556f6005467f5b874a0d2b85b91ccea2265e22a3752b80cf49df27d0735fbdb66b2772a032fa08e50eeb + languageName: node + linkType: hard + +"@lerna/get-npm-exec-opts@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/get-npm-exec-opts@npm:4.0.0" + dependencies: + npmlog: "npm:^4.1.2" + checksum: 8b09bdcffc9da36b9194dba27619d888c1556482dc38598dd243f645cd7d2a404b60f4153322f05e9b7a8105d641ecc23e13fef7d86ac4f8a4818592dbeb5e55 + languageName: node + linkType: hard + +"@lerna/get-packed@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/get-packed@npm:4.0.0" + dependencies: + fs-extra: "npm:^9.1.0" + ssri: "npm:^8.0.1" + tar: "npm:^6.1.0" + checksum: 9d98709c49d7a0e28bbba9de02660ca9a5befec313850cb1e138ccd9a2d2fb0c35b1d2cd79f8d54afaebd7779b54974921c452ecee9d9dadf1d72cbec162440e + languageName: node + linkType: hard + +"@lerna/github-client@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/github-client@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@octokit/plugin-enterprise-rest": "npm:^6.0.1" + "@octokit/rest": "npm:^18.1.0" + git-url-parse: "npm:^11.4.4" + npmlog: "npm:^4.1.2" + checksum: ff9657b023da3993be73aae0e937d8b069b7736ca2ac3ccd5c47281609f974bb4eaf2ec63985980cd4bd3668bfa5c4fe6f97897a01a1a921c1b1b86200088003 + languageName: node + linkType: hard + +"@lerna/gitlab-client@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/gitlab-client@npm:4.0.0" + dependencies: + node-fetch: "npm:^2.6.1" + npmlog: "npm:^4.1.2" + whatwg-url: "npm:^8.4.0" + checksum: a8ee3f87eda96c3044feed866909e8d6402030bbb7d9f7a56e188fbb5483f61e5a880540a0d6c42a0954619d3f53c431fcdf7f2499b640874b6a4546489c857a + languageName: node + linkType: hard + +"@lerna/global-options@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/global-options@npm:4.0.0" + checksum: eb7989d23c39a3fc475d42e74ebb073ef355c1a297c05e353113f103d1d5fa1d40a0b4f72f687bf6408c9946f99959711535f789d75fbbae10a12138a217729e + languageName: node + linkType: hard + +"@lerna/has-npm-version@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/has-npm-version@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + semver: "npm:^7.3.4" + checksum: 21230b49ccf5de1c27eca3a9c41cf8f144da3b5b49aa208b66aebf03f950092c1d146ab2cdc6390a815fa0f28db798c240a60c6ecfab3540a1f073470f525257 + languageName: node + linkType: hard + +"@lerna/import@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/import@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@lerna/command": "npm:4.0.0" + "@lerna/prompt": "npm:4.0.0" + "@lerna/pulse-till-done": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + dedent: "npm:^0.7.0" + fs-extra: "npm:^9.1.0" + p-map-series: "npm:^2.1.0" + checksum: af62e1d10e0dfbfb5e7cdb8fe370c87538d4344d2b2d3b9616abbd7503db81bb903a2368baf8fc1edc91acc12c1282f7943e84d347080608f77d20b30354a0e7 + languageName: node + linkType: hard + +"@lerna/info@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/info@npm:4.0.0" + dependencies: + "@lerna/command": "npm:4.0.0" + "@lerna/output": "npm:4.0.0" + envinfo: "npm:^7.7.4" + checksum: 1eeceb8dd19c8998ad574917960428e466da36f7196fad5fcaabf82eb3c393f6d4b9664803af0a5ded7ed2631d31a1e5467e9f4ce80eec929cc31b39225610b4 + languageName: node + linkType: hard + +"@lerna/init@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/init@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@lerna/command": "npm:4.0.0" + fs-extra: "npm:^9.1.0" + p-map: "npm:^4.0.0" + write-json-file: "npm:^4.3.0" + checksum: 2380deda57c7aeea47dba02ff296aa70385e86cb39868451613c65e418984b9701436788af0194357f2548765ebefbcd8d7d7fd6f669ea1aedbcbc22d8ef3a4d + languageName: node + linkType: hard + +"@lerna/link@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/link@npm:4.0.0" + dependencies: + "@lerna/command": "npm:4.0.0" + "@lerna/package-graph": "npm:4.0.0" + "@lerna/symlink-dependencies": "npm:4.0.0" + p-map: "npm:^4.0.0" + slash: "npm:^3.0.0" + checksum: 4889dbe490e8813284abf349c948a56cd88735537ffe10102b5aa42d1994247af7c4286a6e23ccc9854f976809e1293663410aba3968ec69b2968b242b2a1968 + languageName: node + linkType: hard + +"@lerna/list@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/list@npm:4.0.0" + dependencies: + "@lerna/command": "npm:4.0.0" + "@lerna/filter-options": "npm:4.0.0" + "@lerna/listable": "npm:4.0.0" + "@lerna/output": "npm:4.0.0" + checksum: bee3827862639a86b133fafe5918b2086085af8afb0e13e8e9fd30aefd562a7f75600bb9ce4c4a5914c3c3d5cfbede417d82f2ff323956cfa8d605750c459d89 + languageName: node + linkType: hard + +"@lerna/listable@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/listable@npm:4.0.0" + dependencies: + "@lerna/query-graph": "npm:4.0.0" + chalk: "npm:^4.1.0" + columnify: "npm:^1.5.4" + checksum: 5ec85ec247ecda00cf76d327b5fd5b4449be3061a0f2a3dc72f1c42dc6f1559a13f56024051e594b597fa9d90f62a2fc0818aa153b949b1a36d7650153af7cfb + languageName: node + linkType: hard + +"@lerna/log-packed@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/log-packed@npm:4.0.0" + dependencies: + byte-size: "npm:^7.0.0" + columnify: "npm:^1.5.4" + has-unicode: "npm:^2.0.1" + npmlog: "npm:^4.1.2" + checksum: 2eba7081f69fca830ae3db5d7bbade03f497bcb653560ca520dd0658edc90b3e3145869c7cdbc9753417550521438367c3d9353b11d19475afe35d695b802a66 + languageName: node + linkType: hard + +"@lerna/npm-conf@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/npm-conf@npm:4.0.0" + dependencies: + config-chain: "npm:^1.1.12" + pify: "npm:^5.0.0" + checksum: 5f14e9926ff8ff537125099dce6fca9e53ec5ec77040226647787ddfb7ac92350007935c533b2c30b31860cf8acc51f268b4ef153f90d8032794ba4db8be8ffd + languageName: node + linkType: hard + +"@lerna/npm-dist-tag@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/npm-dist-tag@npm:4.0.0" + dependencies: + "@lerna/otplease": "npm:4.0.0" + npm-package-arg: "npm:^8.1.0" + npm-registry-fetch: "npm:^9.0.0" + npmlog: "npm:^4.1.2" + checksum: f445b40687d83e64b3c5d251d8117bf75ab52a99d22817d94a36d3c3556248976d656805e6dceb2c709a17cde95027e839bc90bf8063fa143af85b146910ff54 + languageName: node + linkType: hard + +"@lerna/npm-install@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/npm-install@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@lerna/get-npm-exec-opts": "npm:4.0.0" + fs-extra: "npm:^9.1.0" + npm-package-arg: "npm:^8.1.0" + npmlog: "npm:^4.1.2" + signal-exit: "npm:^3.0.3" + write-pkg: "npm:^4.0.0" + checksum: 167c4c0800fdfcfa1e3463cae35a45455ae6c2c0b49d9fb482859a1801d5106015d68f324c33c06bd026ad8b316a3a309a6108c532f8b5542482176378af1fcf + languageName: node + linkType: hard + +"@lerna/npm-publish@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/npm-publish@npm:4.0.0" + dependencies: + "@lerna/otplease": "npm:4.0.0" + "@lerna/run-lifecycle": "npm:4.0.0" + fs-extra: "npm:^9.1.0" + libnpmpublish: "npm:^4.0.0" + npm-package-arg: "npm:^8.1.0" + npmlog: "npm:^4.1.2" + pify: "npm:^5.0.0" + read-package-json: "npm:^3.0.0" + checksum: 950ddf11e5b31409ff14c8cd817a5336d3f1594fc4f4f25808ee2383bdeefeedc4ff875d3050a49c2a47cd20ce56b2a4d2af50d11d373d74ae992c7d1b0097ad + languageName: node + linkType: hard + +"@lerna/npm-run-script@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/npm-run-script@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + "@lerna/get-npm-exec-opts": "npm:4.0.0" + npmlog: "npm:^4.1.2" + checksum: cddacbb2ad51d5139aa1af05eb05469b9e40b81a353c100a8780be2595165e44a52d2408aacd9f8eea6a41d198ecf37c4e0331802e317ab9e823a632308213ab + languageName: node + linkType: hard + +"@lerna/otplease@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/otplease@npm:4.0.0" + dependencies: + "@lerna/prompt": "npm:4.0.0" + checksum: e6063e4ba17948e897e1ed3925ab51396a62c5feb74b8039c20765bfdf550b97d1cad686a5d1ac97da96e52b78869498b90b8980b8960f2ce56c444564739984 + languageName: node + linkType: hard + +"@lerna/output@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/output@npm:4.0.0" + dependencies: + npmlog: "npm:^4.1.2" + checksum: 9cb4efdd3fcfdd1a7a849d0faaf3db36b6bf562fa6e7e0e669ac5cb224b30a3aa326daa77c969a297252a295b0f2172843624cd92f3293e9f87d5751d37d5e41 + languageName: node + linkType: hard + +"@lerna/pack-directory@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/pack-directory@npm:4.0.0" + dependencies: + "@lerna/get-packed": "npm:4.0.0" + "@lerna/package": "npm:4.0.0" + "@lerna/run-lifecycle": "npm:4.0.0" + npm-packlist: "npm:^2.1.4" + npmlog: "npm:^4.1.2" + tar: "npm:^6.1.0" + temp-write: "npm:^4.0.0" + checksum: e9cf85ed4a2cc766ede2dbd1f131ca5441aab05f0af710b3eaa59af48f334932fb5bf17e3845cf2c4830aff01e4dc97ef4bcd70caf2a4cc9c246555f2c49a4c3 + languageName: node + linkType: hard + +"@lerna/package-graph@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/package-graph@npm:4.0.0" + dependencies: + "@lerna/prerelease-id-from-version": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + npm-package-arg: "npm:^8.1.0" + npmlog: "npm:^4.1.2" + semver: "npm:^7.3.4" + checksum: 833d44ddab8eb32162ca12e7640c1366ec5d80069422246f3f96a4790fa226d7c54261ceb8d6d9cfcc703d968a74c8c3b7e1ef2389c5ef06a828acb537eca0f1 + languageName: node + linkType: hard + +"@lerna/package@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/package@npm:4.0.0" + dependencies: + load-json-file: "npm:^6.2.0" + npm-package-arg: "npm:^8.1.0" + write-pkg: "npm:^4.0.0" + checksum: 8b6b0a771a86f993af22fe1435db6c2953e7e39112557b5256bdfaf834daa2f8f5819fa062e6a8d3af95a061a034d84355cac79c355ce1c51076920f4a5ad426 + languageName: node + linkType: hard + +"@lerna/prerelease-id-from-version@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/prerelease-id-from-version@npm:4.0.0" + dependencies: + semver: "npm:^7.3.4" + checksum: b4870215b94eacc50b917555998f36f4f2b1ab534f10f483a3210173c110e1c00b87daee8ebceabd2f393b9e1b1c57c3235f0a6765d8ba29749ddcfb7ddc33ca + languageName: node + linkType: hard + +"@lerna/profiler@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/profiler@npm:4.0.0" + dependencies: + fs-extra: "npm:^9.1.0" + npmlog: "npm:^4.1.2" + upath: "npm:^2.0.1" + checksum: a66325db14014391c271cc6fcf34de060a90cfa6f96e07b29279881cc4d40cc50021a02617747a9af122d9bb06a0c80c49d176ac470f9de1e5a327e62236af91 + languageName: node + linkType: hard + +"@lerna/project@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/project@npm:4.0.0" + dependencies: + "@lerna/package": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + cosmiconfig: "npm:^7.0.0" + dedent: "npm:^0.7.0" + dot-prop: "npm:^6.0.1" + glob-parent: "npm:^5.1.1" + globby: "npm:^11.0.2" + load-json-file: "npm:^6.2.0" + npmlog: "npm:^4.1.2" + p-map: "npm:^4.0.0" + resolve-from: "npm:^5.0.0" + write-json-file: "npm:^4.3.0" + checksum: d789dcd905974da1476a25c0a8186f535c70d421b10a105e4bb78ec6396e82eca1c72232a867f7c8478443dd5006df657809474ad36028838a777ae78c69757d + languageName: node + linkType: hard + +"@lerna/prompt@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/prompt@npm:4.0.0" + dependencies: + inquirer: "npm:^7.3.3" + npmlog: "npm:^4.1.2" + checksum: 22ea4c663940645fd08d8db13cc58f5ba3e0c2e8d733262461f17a63a8bfb03a567c488cc11b924350697ef8f9e2abc7302d5c8752f5dd1cb5fa47f48558a041 + languageName: node + linkType: hard + +"@lerna/publish@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/publish@npm:4.0.0" + dependencies: + "@lerna/check-working-tree": "npm:4.0.0" + "@lerna/child-process": "npm:4.0.0" + "@lerna/collect-updates": "npm:4.0.0" + "@lerna/command": "npm:4.0.0" + "@lerna/describe-ref": "npm:4.0.0" + "@lerna/log-packed": "npm:4.0.0" + "@lerna/npm-conf": "npm:4.0.0" + "@lerna/npm-dist-tag": "npm:4.0.0" + "@lerna/npm-publish": "npm:4.0.0" + "@lerna/otplease": "npm:4.0.0" + "@lerna/output": "npm:4.0.0" + "@lerna/pack-directory": "npm:4.0.0" + "@lerna/prerelease-id-from-version": "npm:4.0.0" + "@lerna/prompt": "npm:4.0.0" + "@lerna/pulse-till-done": "npm:4.0.0" + "@lerna/run-lifecycle": "npm:4.0.0" + "@lerna/run-topologically": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + "@lerna/version": "npm:4.0.0" + fs-extra: "npm:^9.1.0" + libnpmaccess: "npm:^4.0.1" + npm-package-arg: "npm:^8.1.0" + npm-registry-fetch: "npm:^9.0.0" + npmlog: "npm:^4.1.2" + p-map: "npm:^4.0.0" + p-pipe: "npm:^3.1.0" + pacote: "npm:^11.2.6" + semver: "npm:^7.3.4" + checksum: cf23f07071e505af5e88fa9df4595632a3a0cc22a862d634831a89d87daaf75720b43025e043241e33a0de58e3aa2324a3ee182d65dcd76a61ff9359575fb0ac + languageName: node + linkType: hard + +"@lerna/pulse-till-done@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/pulse-till-done@npm:4.0.0" + dependencies: + npmlog: "npm:^4.1.2" + checksum: 6a1fd372cdccb97b15ada1495cfce8cf124e67d0265803dffd47541d343d909cf47edad8d18513c911aabac8fdb0726d48c5841e8aea1bec820e2b475a29717d + languageName: node + linkType: hard + +"@lerna/query-graph@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/query-graph@npm:4.0.0" + dependencies: + "@lerna/package-graph": "npm:4.0.0" + checksum: 028daea415e14b8d4b3e63780269be76a6a7b1731747ec24e4125d66ff45bceebc2855db7962516adc056887d2c52153e38f646185651554287c1bf3975e642c + languageName: node + linkType: hard + +"@lerna/resolve-symlink@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/resolve-symlink@npm:4.0.0" + dependencies: + fs-extra: "npm:^9.1.0" + npmlog: "npm:^4.1.2" + read-cmd-shim: "npm:^2.0.0" + checksum: 5819360d83da2e358e964c51a55c32a3e8cbde128b3cd3bb1b3fcf8873d52f292fe1c831c720b1c5c69de57fe308ec46a6f035c303f9a07327d95f106ce135c1 + languageName: node + linkType: hard + +"@lerna/rimraf-dir@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/rimraf-dir@npm:4.0.0" + dependencies: + "@lerna/child-process": "npm:4.0.0" + npmlog: "npm:^4.1.2" + path-exists: "npm:^4.0.0" + rimraf: "npm:^3.0.2" + checksum: a31f783f14811f87d5a2e03adb5d6d0fbc131bc31cfe6e9d0602abe7bc0472b7a4f1dd137bcc719a6a19f435fb6a11237d16d4704b9925affcc1a7ff74502821 + languageName: node + linkType: hard + +"@lerna/run-lifecycle@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/run-lifecycle@npm:4.0.0" + dependencies: + "@lerna/npm-conf": "npm:4.0.0" + npm-lifecycle: "npm:^3.1.5" + npmlog: "npm:^4.1.2" + checksum: b826c16a219cfd398193701e613b0a21478802eed18df540a5d397873e42db2acbbf9d075ce5ecf01d301a644b4dcbc0bb24d2c217ebfc38fc2b22a07f4c9162 + languageName: node + linkType: hard + +"@lerna/run-topologically@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/run-topologically@npm:4.0.0" + dependencies: + "@lerna/query-graph": "npm:4.0.0" + p-queue: "npm:^6.6.2" + checksum: 3ef4a5dacb5b768b1c68c530b7e73af90fddefaf2c2d5427420ade01e10ac8662e7d330dcaf9ec0c94714223a6698752b7edb3c4807826a7c868b338f8fcad95 + languageName: node + linkType: hard + +"@lerna/run@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/run@npm:4.0.0" + dependencies: + "@lerna/command": "npm:4.0.0" + "@lerna/filter-options": "npm:4.0.0" + "@lerna/npm-run-script": "npm:4.0.0" + "@lerna/output": "npm:4.0.0" + "@lerna/profiler": "npm:4.0.0" + "@lerna/run-topologically": "npm:4.0.0" + "@lerna/timer": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + p-map: "npm:^4.0.0" + checksum: 908014083ce9f3000bb83103b9b307ec6eb2651f76a2cd34d0c6c0ff226d359f5608fc36de9fc7dc8d1ce0732ce055875f97e33ae0923c66817494c32c8093e0 + languageName: node + linkType: hard + +"@lerna/symlink-binary@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/symlink-binary@npm:4.0.0" + dependencies: + "@lerna/create-symlink": "npm:4.0.0" + "@lerna/package": "npm:4.0.0" + fs-extra: "npm:^9.1.0" + p-map: "npm:^4.0.0" + checksum: d457a8ef53da014815ffe70379a0375f1a005c12e369e861a5850fe7d679e017b2a2f029c256c3fbc0903c6978d2652eb6f3561bc06ce49bc71986fc0261d395 + languageName: node + linkType: hard + +"@lerna/symlink-dependencies@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/symlink-dependencies@npm:4.0.0" + dependencies: + "@lerna/create-symlink": "npm:4.0.0" + "@lerna/resolve-symlink": "npm:4.0.0" + "@lerna/symlink-binary": "npm:4.0.0" + fs-extra: "npm:^9.1.0" + p-map: "npm:^4.0.0" + p-map-series: "npm:^2.1.0" + checksum: c6abc8de621c6d651e728bdfdeed7f8a6ef98297598cd142e654014be6c570a5fc770126fdf04c80704d190ed6ecad659dd955174293643b303afd62d4c5232c + languageName: node + linkType: hard + +"@lerna/timer@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/timer@npm:4.0.0" + checksum: 3cb861b2314eaa2f5a094ed6444f7736cdd16eb172c84ec0794136f2532178eaab9e414ba653dec6e0243fc50ba51c5b1f4ade26706b3bece6ec453640db4fff + languageName: node + linkType: hard + +"@lerna/validation-error@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/validation-error@npm:4.0.0" + dependencies: + npmlog: "npm:^4.1.2" + checksum: 721d13055364bd45006fd1804fc8ffbafa780aaff44517c38b2c078bf6350b6d1c34c9ed7e2ed5b3b9c59ffd743ba40bd3bda55945ee030286455de5524198c8 + languageName: node + linkType: hard + +"@lerna/version@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/version@npm:4.0.0" + dependencies: + "@lerna/check-working-tree": "npm:4.0.0" + "@lerna/child-process": "npm:4.0.0" + "@lerna/collect-updates": "npm:4.0.0" + "@lerna/command": "npm:4.0.0" + "@lerna/conventional-commits": "npm:4.0.0" + "@lerna/github-client": "npm:4.0.0" + "@lerna/gitlab-client": "npm:4.0.0" + "@lerna/output": "npm:4.0.0" + "@lerna/prerelease-id-from-version": "npm:4.0.0" + "@lerna/prompt": "npm:4.0.0" + "@lerna/run-lifecycle": "npm:4.0.0" + "@lerna/run-topologically": "npm:4.0.0" + "@lerna/validation-error": "npm:4.0.0" + chalk: "npm:^4.1.0" + dedent: "npm:^0.7.0" + load-json-file: "npm:^6.2.0" + minimatch: "npm:^3.0.4" + npmlog: "npm:^4.1.2" + p-map: "npm:^4.0.0" + p-pipe: "npm:^3.1.0" + p-reduce: "npm:^2.1.0" + p-waterfall: "npm:^2.1.1" + semver: "npm:^7.3.4" + slash: "npm:^3.0.0" + temp-write: "npm:^4.0.0" + write-json-file: "npm:^4.3.0" + checksum: fa0de0b3cec2f152664789fec2f055a3c60e3c2d617d8f3fc80839877d2aa999825ad9b78fcfa0859b9abedd0a3084e7eedfdd4d55f1efeeb7b126eb2745cd65 + languageName: node + linkType: hard + +"@lerna/write-log-file@npm:4.0.0": + version: 4.0.0 + resolution: "@lerna/write-log-file@npm:4.0.0" + dependencies: + npmlog: "npm:^4.1.2" + write-file-atomic: "npm:^3.0.3" + checksum: 3f90fb5eff8aa9bf6bbe4ecabfe6213d796a2c9eeae40aec408443cbe648124985bde381535117b7a56b91deeb7349153126fc1ca8ddc91635226f02adad0112 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 7b89590598476dda88e79c473766b67c682aae6e0ab0213491daa6083dcc0c171f86b3868f5506f22c09aa5ea69ad7dfb78f4bf39a8dca375d89a42f408645b3 + languageName: node + linkType: hard + +"@npmcli/ci-detect@npm:^1.0.0": + version: 1.4.0 + resolution: "@npmcli/ci-detect@npm:1.4.0" + checksum: 85fe58ade8b79c995ce113e7379e0d0e026fe2a304392c6c49944b67c0f2eff73b2fdb5777bd0bfc4dbe52fb3713cb6af425d5514b677e5bdebb454f24051b2f + languageName: node + linkType: hard + +"@npmcli/fs@npm:^1.0.0": + version: 1.1.1 + resolution: "@npmcli/fs@npm:1.1.1" + dependencies: + "@gar/promisify": "npm:^1.0.1" + semver: "npm:^7.3.5" + checksum: 4143c317a7542af9054018b71601e3c3392e6704e884561229695f099a71336cbd580df9a9ffb965d0024bf0ed593189ab58900fd1714baef1c9ee59c738c3e2 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e + languageName: node + linkType: hard + +"@npmcli/git@npm:^2.1.0": + version: 2.1.0 + resolution: "@npmcli/git@npm:2.1.0" + dependencies: + "@npmcli/promise-spawn": "npm:^1.3.2" + lru-cache: "npm:^6.0.0" + mkdirp: "npm:^1.0.4" + npm-pick-manifest: "npm:^6.1.1" + promise-inflight: "npm:^1.0.1" + promise-retry: "npm:^2.0.1" + semver: "npm:^7.3.5" + which: "npm:^2.0.2" + checksum: c35d8cb479daa53a2c5b3f3733407f36f3481275e43bd71d3997dea203a721cd9b77a47e178d1d85467e0c0780962a94e7f2bb663c94292ffc2c38f651060d87 + languageName: node + linkType: hard + +"@npmcli/installed-package-contents@npm:^1.0.6": + version: 1.0.7 + resolution: "@npmcli/installed-package-contents@npm:1.0.7" + dependencies: + npm-bundled: "npm:^1.1.1" + npm-normalize-package-bin: "npm:^1.0.1" + bin: + installed-package-contents: index.js + checksum: 69c23b489ebfc90a28f6ee5293256bf6dae656292c8e13d52cd770fee2db2c9ecbeb7586387cd9006bc1968439edd5c75aeeb7d39ba0c8eb58905c3073bee067 + languageName: node + linkType: hard + +"@npmcli/move-file@npm:^1.0.1": + version: 1.1.2 + resolution: "@npmcli/move-file@npm:1.1.2" + dependencies: + mkdirp: "npm:^1.0.4" + rimraf: "npm:^3.0.2" + checksum: 02e946f3dafcc6743132fe2e0e2b585a96ca7265653a38df5a3e53fcf26c7c7a57fc0f861d7c689a23fdb6d6836c7eea5050c8086abf3c994feb2208d1514ff0 + languageName: node + linkType: hard + +"@npmcli/node-gyp@npm:^1.0.2": + version: 1.0.3 + resolution: "@npmcli/node-gyp@npm:1.0.3" + checksum: 25441497f0919c9a7c147649e0017920b8e8d14ae417602f9968f9e6d7e3e9eff44d5c6101d8070929657fff438f2e34d66919f3aead24d396ff7cf24187d55a + languageName: node + linkType: hard + +"@npmcli/promise-spawn@npm:^1.2.0, @npmcli/promise-spawn@npm:^1.3.2": + version: 1.3.2 + resolution: "@npmcli/promise-spawn@npm:1.3.2" + dependencies: + infer-owner: "npm:^1.0.4" + checksum: 2ef7231c978c237e5475a51390d2416e30c0362cf1b0a75fe56dbca07c693d6eac80b4be7b668c001a79ceeafed7896617463b88f20ded47f3201ce1528d85ee + languageName: node + linkType: hard + +"@npmcli/run-script@npm:^1.8.2": + version: 1.8.6 + resolution: "@npmcli/run-script@npm:1.8.6" + dependencies: + "@npmcli/node-gyp": "npm:^1.0.2" + "@npmcli/promise-spawn": "npm:^1.3.2" + node-gyp: "npm:^7.1.0" + read-package-json-fast: "npm:^2.0.1" + checksum: 825ee9556c910d0fb17c31eb3ced35fb9b78cdb72ef40239fdc548699392baab620a3a1a5f81719266c1d4933c0c8644121d8ee230a1a32304f4b4e381f07216 + languageName: node + linkType: hard + +"@octokit/auth-token@npm:^2.4.4": + version: 2.5.0 + resolution: "@octokit/auth-token@npm:2.5.0" + dependencies: + "@octokit/types": "npm:^6.0.3" + checksum: e9f757b6acdee91885dab97069527c86829da0dc60476c38cdff3a739ff47fd026262715965f91e84ec9d01bc43d02678bc8ed472a85395679af621b3ddbe045 + languageName: node + linkType: hard + +"@octokit/core@npm:^3.5.1": + version: 3.6.0 + resolution: "@octokit/core@npm:3.6.0" + dependencies: + "@octokit/auth-token": "npm:^2.4.4" + "@octokit/graphql": "npm:^4.5.8" + "@octokit/request": "npm:^5.6.3" + "@octokit/request-error": "npm:^2.0.5" + "@octokit/types": "npm:^6.0.3" + before-after-hook: "npm:^2.2.0" + universal-user-agent: "npm:^6.0.0" + checksum: 78d9799a57fe9cf155cce485ba8b7ec32f05024350bf5dd8ab5e0da8995cc22168c39dbbbcfc29bc6c562dd482c1c4a3064f466f49e2e9ce4efad57cf28a7360 + languageName: node + linkType: hard + +"@octokit/endpoint@npm:^6.0.1": + version: 6.0.12 + resolution: "@octokit/endpoint@npm:6.0.12" + dependencies: + "@octokit/types": "npm:^6.0.3" + is-plain-object: "npm:^5.0.0" + universal-user-agent: "npm:^6.0.0" + checksum: b2d9c91f00ab7c997338d08a06bfd12a67d86060bc40471f921ba424e4de4e5a0a1117631f2a8a8787107d89d631172dd157cb5e2633674b1ae3a0e2b0dcfa3e + languageName: node + linkType: hard + +"@octokit/graphql@npm:^4.5.8": + version: 4.8.0 + resolution: "@octokit/graphql@npm:4.8.0" + dependencies: + "@octokit/request": "npm:^5.6.0" + "@octokit/types": "npm:^6.0.3" + universal-user-agent: "npm:^6.0.0" + checksum: 2cfa0cbc636465d729f4a6a5827f7d36bed0fc9ea270a79427a431f1672fd109f463ca4509aeb3eb02342b91592ff06f318b39d6866d7424d2a16b0bfc01e62e + languageName: node + linkType: hard + +"@octokit/openapi-types@npm:^12.11.0": + version: 12.11.0 + resolution: "@octokit/openapi-types@npm:12.11.0" + checksum: b3bb3684d9686ef948d8805ab56f85818f36e4cb64ef97b8e48dc233efefef22fe0bddd9da705fb628ea618a1bebd62b3d81b09a3f7dce9522f124d998041896 + languageName: node + linkType: hard + +"@octokit/plugin-enterprise-rest@npm:^6.0.1": + version: 6.0.1 + resolution: "@octokit/plugin-enterprise-rest@npm:6.0.1" + checksum: 26bd0a30582954efcd29b41e16698db79e9d20e3f88c4069b43b183223cee69862621f18b6a7a1c9257b1cd07c24477e403b75c74688660ecf31d467b9d8fd9e + languageName: node + linkType: hard + +"@octokit/plugin-paginate-rest@npm:^2.16.8": + version: 2.21.3 + resolution: "@octokit/plugin-paginate-rest@npm:2.21.3" + dependencies: + "@octokit/types": "npm:^6.40.0" + peerDependencies: + "@octokit/core": ">=2" + checksum: a16f7ed56db00ea9b72f77735e8d9463ddc84d017cb95c2767026c60a209f7c4176502c592847cf61613eb2f25dafe8d5437c01ad296660ebbfb2c821ef805e9 + languageName: node + linkType: hard + +"@octokit/plugin-request-log@npm:^1.0.4": + version: 1.0.4 + resolution: "@octokit/plugin-request-log@npm:1.0.4" + peerDependencies: + "@octokit/core": ">=3" + checksum: 7238585445555db553912e0cdef82801c89c6e5cbc62c23ae086761c23cc4a403d6c3fddd20348bbd42fb7508e2c2fce370eb18fdbe3fbae2c0d2c8be974f4cc + languageName: node + linkType: hard + +"@octokit/plugin-rest-endpoint-methods@npm:^5.12.0": + version: 5.16.2 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:5.16.2" + dependencies: + "@octokit/types": "npm:^6.39.0" + deprecation: "npm:^2.3.1" + peerDependencies: + "@octokit/core": ">=3" + checksum: 32bfb30241140ad9bf17712856e1946374fb8d6040adfd5b9ea862e7149e5d2a38e0e037d3b468af34f7f2561129a6f170cffeb2a6225e548b04934e2c05eb93 + languageName: node + linkType: hard + +"@octokit/request-error@npm:^2.0.5, @octokit/request-error@npm:^2.1.0": + version: 2.1.0 + resolution: "@octokit/request-error@npm:2.1.0" + dependencies: + "@octokit/types": "npm:^6.0.3" + deprecation: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: eb50eb2734aa903f1e855ac5887bb76d6f237a3aaa022b09322a7676c79bb8020259b25f84ab895c4fc7af5cc736e601ec8cc7e9040ca4629bac8cb393e91c40 + languageName: node + linkType: hard + +"@octokit/request@npm:^5.6.0, @octokit/request@npm:^5.6.3": + version: 5.6.3 + resolution: "@octokit/request@npm:5.6.3" + dependencies: + "@octokit/endpoint": "npm:^6.0.1" + "@octokit/request-error": "npm:^2.1.0" + "@octokit/types": "npm:^6.16.1" + is-plain-object: "npm:^5.0.0" + node-fetch: "npm:^2.6.7" + universal-user-agent: "npm:^6.0.0" + checksum: a546dc05665c6cf8184ae7c4ac3ed4f0c339c2170dd7e2beeb31a6e0a9dd968ca8ad960edbd2af745e585276e692c9eb9c6dbf1a8c9d815eb7b7fd282f3e67fc + languageName: node + linkType: hard + +"@octokit/rest@npm:^18.1.0": + version: 18.12.0 + resolution: "@octokit/rest@npm:18.12.0" + dependencies: + "@octokit/core": "npm:^3.5.1" + "@octokit/plugin-paginate-rest": "npm:^2.16.8" + "@octokit/plugin-request-log": "npm:^1.0.4" + "@octokit/plugin-rest-endpoint-methods": "npm:^5.12.0" + checksum: e649baf7ccc3de57e5aeffb88e2888b023ffc693dee91c4db58dcb7b5481348bc5b0e6a49a176354c3150e3fa4e02c43a5b1d2be02492909b3f6dcfa5f63e444 + languageName: node + linkType: hard + +"@octokit/types@npm:^6.0.3, @octokit/types@npm:^6.16.1, @octokit/types@npm:^6.39.0, @octokit/types@npm:^6.40.0": + version: 6.41.0 + resolution: "@octokit/types@npm:6.41.0" + dependencies: + "@octokit/openapi-types": "npm:^12.11.0" + checksum: 81cfa58e5524bf2e233d75a346e625fd6e02a7b919762c6ddb523ad6fb108943ef9d34c0298ff3c5a44122e449d9038263bc22959247fd6ff8894a48888ac705 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@pkgr/utils@npm:^2.3.1": + version: 2.4.1 + resolution: "@pkgr/utils@npm:2.4.1" + dependencies: + cross-spawn: "npm:^7.0.3" + fast-glob: "npm:^3.2.12" + is-glob: "npm:^4.0.3" + open: "npm:^9.1.0" + picocolors: "npm:^1.0.0" + tslib: "npm:^2.5.0" + checksum: 0ddbb8265b508bcc4e020054960b88324212e1c4b697153211842b8e85167af430b2761459d5e0b5c960668987e92818343b2bec6ee9140b5b3f560d8e68bbfe + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.25.16": + version: 0.25.24 + resolution: "@sinclair/typebox@npm:0.25.24" + checksum: 2faf9878f3a65a1f2855add80b0fe8c6fe83f084ea1ab432fa7506e7c85c55ae121c4af516d089b5737f5fad23b3628fcc83a6a5df29030c3f611185ce0388ac + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.0 + resolution: "@sinonjs/commons@npm:3.0.0" + dependencies: + type-detect: "npm:4.0.8" + checksum: 1df9cd257942f4e4960dfb9fd339d9e97b6a3da135f3d5b8646562918e863809cb8e00268535f4f4723535d2097881c8fc03d545c414d8555183376cfc54ee84 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.2.0 + resolution: "@sinonjs/fake-timers@npm:10.2.0" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 9f4726e7799a409d51d6760af3b65dac061b4f5c0b69b3af4caf79ecc3012dacae1f40078d915f9cec1ecd81d84a41619a98d4878bb2ef9f3ed66c16c2f5f833 + languageName: node + linkType: hard + +"@tootallnate/once@npm:1": + version: 1.1.2 + resolution: "@tootallnate/once@npm:1.1.2" + checksum: 8fe4d006e90422883a4fa9339dd05a83ff626806262e1710cee5758d493e8cbddf2db81c0e4690636dc840b02c9fda62877866ea774ebd07c1777ed5fafbdec6 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: c176a2c1e1b16be120c328300ea910df15fb9a5277010116d26818272341a11483c5a80059389d04edacf6fd2d03d4687ad3660870fdd1cc0b7109e160adb220 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.1 + resolution: "@types/babel__core@npm:7.20.1" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: c83402fc7ef8abd1f94ffe350b8bde9a35ccb6c3624bc8e39b6a7e1a675d112f6b70ac1b05391a579ca3b126baffe66b0b94f954edef086c4482b97d293c3659 + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.4 + resolution: "@types/babel__generator@npm:7.6.4" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: e0051b450e4ba2df0a7e386f08df902a4e920f6f8d6f185d69ddbe9b0e2e2d3ae434bb51e437bc0fca2a9a0f5dc4ca44d3a1941ef75e74371e8be5bf64416fe4 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.1 + resolution: "@types/babel__template@npm:7.4.1" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 6f180e96c39765487f27e861d43eebed341ec7a2fc06cdf5a52c22872fae67f474ca165d149c708f4fd9d5482beb66c0a92f77411b234bb30262ed2303e50b1a + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.1 + resolution: "@types/babel__traverse@npm:7.20.1" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 5a6a3a26be090573309527184a31f1b82ef55f3d73d811c15f181d323e471305f2390651a04d49d4cd4ca41bbeabb53c9f7862a8e09eab5a0f8910a6aec6e867 + languageName: node + linkType: hard + +"@types/better-sqlite3@npm:^7.6.9": + version: 7.6.9 + resolution: "@types/better-sqlite3@npm:7.6.9" + dependencies: + "@types/node": "npm:*" + checksum: 7d77add3993968982374cd73586a100fc5b9c29570a167b5798a415744983041d9ae3dcbdfd83fcf807247b777e3b8dc4e045fb7dae4a3d8484c9366ab371680 + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.6 + resolution: "@types/graceful-fs@npm:4.1.6" + dependencies: + "@types/node": "npm:*" + checksum: b1d32c5ae7bd52cf60e29df20407904c4312a39612e7ec2ee23c1e3731c1cfe31d97c6941bf6cb52f5f929d50d86d92dd506436b63fafa833181d439b628885e + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.4 + resolution: "@types/istanbul-lib-coverage@npm:2.0.4" + checksum: af5f6b64e788331ed3f7b2e2613cb6ca659c58b8500be94bbda8c995ad3da9216c006f1cfe6f66b321c39392b1bda18b16e63cef090a77d24a00b4bd5ba3b018 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.0 + resolution: "@types/istanbul-lib-report@npm:3.0.0" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 7ced458631276a28082ee40645224c3cdd8b861961039ff811d841069171c987ec7e50bc221845ec0d04df0022b2f457a21fb2f816dab2fbe64d59377b32031f + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.1 + resolution: "@types/istanbul-reports@npm:3.0.1" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: e147f0db9346a0cae9a359220bc76f7c78509fb6979a2597feb24d64b6e8328d2d26f9d152abbd59c6bca721e4ea2530af20116d01df50815efafd1e151fd777 + languageName: node + linkType: hard + +"@types/jest@npm:^29.5.1": + version: 29.5.2 + resolution: "@types/jest@npm:29.5.2" + dependencies: + expect: "npm:^29.0.0" + pretty-format: "npm:^29.0.0" + checksum: e85525fe83a0792632a31ca32968b33a0014d617442e9a515357d2aa8890052ef622b1f6fd25d48f4f1a3ab806bed94e6d9b056dea23a897464e0e35957ff654 + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.9": + version: 7.0.12 + resolution: "@types/json-schema@npm:7.0.12" + checksum: 2c39946ae321fe42d085c61a85872a81bbee70f9b2054ad344e8811dfc478fdbaf1ebf5f2989bb87c895ba2dfc3b1dcba85db11e467bbcdc023708814207791c + languageName: node + linkType: hard + +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac + languageName: node + linkType: hard + +"@types/minimatch@npm:^3.0.3": + version: 3.0.5 + resolution: "@types/minimatch@npm:3.0.5" + checksum: a1a19ba342d6f39b569510f621ae4bbe972dc9378d15e9a5e47904c440ee60744f5b09225bc73be1c6490e3a9c938eee69eb53debf55ce1f15761201aa965f97 + languageName: node + linkType: hard + +"@types/minimist@npm:^1.2.0": + version: 1.2.2 + resolution: "@types/minimist@npm:1.2.2" + checksum: f220f57f682bbc3793dab4518f8e2180faa79d8e2589c79614fd777d7182be203ba399020c3a056a115064f5d57a065004a32b522b2737246407621681b24137 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 20.2.5 + resolution: "@types/node@npm:20.2.5" + checksum: 1c3db8a4ceb5e5d12e7cb140e37c14a16ce013084c6d65579b91cefbe0ecaca57d85093d968172b11c3d1d95bcbc5d972b08aa3dc3935206fb39bc6c10751102 + languageName: node + linkType: hard + +"@types/node@npm:^16.18.31": + version: 16.18.34 + resolution: "@types/node@npm:16.18.34" + checksum: d6572e12b2200a813b2e0944add0abb8ac59d51a0cf28651dd1dde9de4d43e9d4c2c41fd7cf910d0c3bd8e13d10047f58211a53e76780279fc6d284137d3b001 + languageName: node + linkType: hard + +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.1 + resolution: "@types/normalize-package-data@npm:2.4.1" + checksum: c90b163741f27a1a4c3b1869d7d5c272adbd355eb50d5f060f9ce122ce4342cf35f5b0005f55ef780596cacfeb69b7eee54cd3c2e02d37f75e664945b6e75fc6 + languageName: node + linkType: hard + +"@types/parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "@types/parse-json@npm:4.0.0" + checksum: 1d3012ab2fcdad1ba313e1d065b737578f6506c8958e2a7a5bdbdef517c7e930796cb1599ee067d5dee942fb3a764df64b5eef7e9ae98548d776e86dcffba985 + languageName: node + linkType: hard + +"@types/prettier@npm:^2.1.5": + version: 2.7.3 + resolution: "@types/prettier@npm:2.7.3" + checksum: 0960b5c1115bb25e979009d0b44c42cf3d792accf24085e4bfce15aef5794ea042e04e70c2139a2c3387f781f18c89b5706f000ddb089e9a4a2ccb7536a2c5f0 + languageName: node + linkType: hard + +"@types/semver@npm:^7.3.12": + version: 7.5.0 + resolution: "@types/semver@npm:7.5.0" + checksum: ca4ba4642b5972b6e88e73c5bc02bbaceb8d76bce71748d86e3e95042d4e5a44603113a1dcd2cb9b73ad6f91f6e4ab73185eb41bbfc9c73b11f0ed3db3b7443a + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.1 + resolution: "@types/stack-utils@npm:2.0.1" + checksum: 3327ee919a840ffe907bbd5c1d07dfd79137dd9732d2d466cf717ceec5bb21f66296173c53bb56cff95fae4185b9cd6770df3e9745fe4ba528bbc4975f54d13f + languageName: node + linkType: hard + +"@types/ws@npm:^7.4.7": + version: 7.4.7 + resolution: "@types/ws@npm:7.4.7" + dependencies: + "@types/node": "npm:*" + checksum: f1f53febd8623a85cef2652949acd19d83967e350ea15a851593e3033501750a1e04f418552e487db90a3d48611a1cff3ffcf139b94190c10f2fd1e1dc95ff10 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.0 + resolution: "@types/yargs-parser@npm:21.0.0" + checksum: cb89f3bb2e8002f1479a65a934e825be4cc18c50b350bbc656405d41cf90b8a299b105e7da497d7eb1aa460472a07d1e5a389f3af0862f1d1252279cfcdd017c + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.24 + resolution: "@types/yargs@npm:17.0.24" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: fbebf57e1d04199e5e7eb0c67a402566fa27177ee21140664e63da826408793d203d262b48f8f41d4a7665126393d2e952a463e960e761226def247d9bbcdbd0 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^5.59.6": + version: 5.59.8 + resolution: "@typescript-eslint/eslint-plugin@npm:5.59.8" + dependencies: + "@eslint-community/regexpp": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:5.59.8" + "@typescript-eslint/type-utils": "npm:5.59.8" + "@typescript-eslint/utils": "npm:5.59.8" + debug: "npm:^4.3.4" + grapheme-splitter: "npm:^1.0.4" + ignore: "npm:^5.2.0" + natural-compare-lite: "npm:^1.4.0" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 491f88984dd032f309d84b41af6a227a9da944ad6c806b868e71122bd55ad355d8738e7925019f54929784ba631ae9b186a028b194bdb9bad72d122229c029e4 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.59.6": + version: 5.59.8 + resolution: "@typescript-eslint/parser@npm:5.59.8" + dependencies: + "@typescript-eslint/scope-manager": "npm:5.59.8" + "@typescript-eslint/types": "npm:5.59.8" + "@typescript-eslint/typescript-estree": "npm:5.59.8" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 710daf64331d5bc198c22c66c1fdd06db2300487f655d161f0e59971fcd0c70661a7059ff7e3cf2ed66fc72d6674a3f4a317d5d5778ce6605d18e831b0a7039e + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.59.8": + version: 5.59.8 + resolution: "@typescript-eslint/scope-manager@npm:5.59.8" + dependencies: + "@typescript-eslint/types": "npm:5.59.8" + "@typescript-eslint/visitor-keys": "npm:5.59.8" + checksum: 164ea98d0d7dd4dd0c462eb7238266b2260af63fd29b96746dd978322114c7ebf31ba697c424397e3fb36027704e1c5d788cb6049a6ccb52fec8c6c134d7503b + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.59.8": + version: 5.59.8 + resolution: "@typescript-eslint/type-utils@npm:5.59.8" + dependencies: + "@typescript-eslint/typescript-estree": "npm:5.59.8" + "@typescript-eslint/utils": "npm:5.59.8" + debug: "npm:^4.3.4" + tsutils: "npm:^3.21.0" + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 70c64edb564d4c5270cb8cea226544eebcf0f0a394c185a3c5b5bfd9df2e97e0396fa6324ba58da3136d99d12adcfe5f21243aa6c997734e6daa154a6708ae60 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.59.8": + version: 5.59.8 + resolution: "@typescript-eslint/types@npm:5.59.8" + checksum: 3f5000f556b4fe45c16e00b24d18c0f8930a214e61a0302daf3ef952a7a45342d9e63119626bd0556b252a6345e1fa423e34908eaf08560756f6c747dcffb56a + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.59.8": + version: 5.59.8 + resolution: "@typescript-eslint/typescript-estree@npm:5.59.8" + dependencies: + "@typescript-eslint/types": "npm:5.59.8" + "@typescript-eslint/visitor-keys": "npm:5.59.8" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: a6ec2654c5c8c0bead99e1a43936a56e9bd0e1422b993fcd9d603ff31fe4701e9562fbc6d0f2b4d50a7d113d27d5fb68c428f78b938bd110b0112ed4df81ed72 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.59.8, @typescript-eslint/utils@npm:^5.10.0": + version: 5.59.8 + resolution: "@typescript-eslint/utils@npm:5.59.8" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@types/json-schema": "npm:^7.0.9" + "@types/semver": "npm:^7.3.12" + "@typescript-eslint/scope-manager": "npm:5.59.8" + "@typescript-eslint/types": "npm:5.59.8" + "@typescript-eslint/typescript-estree": "npm:5.59.8" + eslint-scope: "npm:^5.1.1" + semver: "npm:^7.3.7" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 20b859508942b79111ddbea8e777864fa76a5597b217bff921ba0e9ad245f71cff7ed598d18f384f441d4b433cfae0645654455fa38f313e24869fa062582964 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.59.8": + version: 5.59.8 + resolution: "@typescript-eslint/visitor-keys@npm:5.59.8" + dependencies: + "@typescript-eslint/types": "npm:5.59.8" + eslint-visitor-keys: "npm:^3.3.0" + checksum: 0e7cdb5c0e9106bbb77bb599d9a6464306d7cfa1b35435810c5d59b951f3b65ac3a1a829894e328e43d411da189247568eb24d28dd9ceca95dfc3f19011b889f + languageName: node + linkType: hard + +"@ulixee/commons@npm:2.0.0-alpha.25, @ulixee/commons@workspace:commons": + version: 0.0.0-use.local + resolution: "@ulixee/commons@workspace:commons" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/better-sqlite3": "npm:^7.6.9" + bech32: "npm:^2.0.0" + devtools-protocol: "npm:^0.0.1137505" + https-proxy-agent: "npm:^5.0.0" + semver: "npm:^7.3.7" + source-map-js: "npm:^1.0.2" + languageName: unknown + linkType: soft + +"@ulixee/crypto@npm:2.0.0-alpha.25, @ulixee/crypto@workspace:crypto": + version: 0.0.0-use.local + resolution: "@ulixee/crypto@workspace:crypto" + dependencies: + "@ulixee/commons": "npm:2.0.0-alpha.25" + "@ulixee/crypto": "npm:2.0.0-alpha.25" + "@ulixee/specification": "npm:2.0.0-alpha.25" + bignumber.js: "npm:^9.0.2" + commander: "npm:^9.3.0" + bin: + crypto: ./bin/cli.js + languageName: unknown + linkType: soft + +"@ulixee/net@workspace:net": + version: 0.0.0-use.local + resolution: "@ulixee/net@workspace:net" + dependencies: + "@types/ws": "npm:^7.4.7" + "@ulixee/commons": "npm:2.0.0-alpha.25" + ws: "npm:^7.4.6" + languageName: unknown + linkType: soft + +"@ulixee/repo-tools@npm:^1.0.26": + version: 1.0.26 + resolution: "@ulixee/repo-tools@npm:1.0.26" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:^5.59.6" + "@typescript-eslint/parser": "npm:^5.59.6" + copyfiles: "npm:^2.4.1" + eslint: "npm:^8.17.0" + eslint-config-airbnb-base: "npm:^15.0.0" + eslint-config-airbnb-typescript: "npm:^17.0.0" + eslint-config-prettier: "npm:^8.5.0" + eslint-import-resolver-typescript: "npm:^3.5.5" + eslint-plugin-eslint-comments: "npm:^3.2.0" + eslint-plugin-import: "npm:^2.27.5" + eslint-plugin-jest: "npm:^27.2.1" + eslint-plugin-jsx-a11y: "npm:^6.5.1" + eslint-plugin-monorepo-cop: "npm:^1.0.2" + eslint-plugin-prettier: "npm:^4.2.1" + eslint-plugin-promise: "npm:^6.1.1" + prettier: "npm:^2.6.2" + pretty-quick: "npm:^3.1.0" + typescript: "npm:^5.0.4" + bin: + ulx-repo-adjust-paths: bin/paths.js + ulx-repo-after-build: bin/after-build.js + ulx-repo-version-bump: bin/version-bump.js + ulx-repo-version-check: bin/version-check.js + checksum: edcdc75f0481d7fd7d44f171438fc10b8bf20d58c7b188ca3fdd2527e89737b83ffa98c9973714e840bc03e132a8207fd94b7df0161a75d0afa530a1ea9968f4 + languageName: node + linkType: hard + +"@ulixee/schema@workspace:schema": + version: 0.0.0-use.local + resolution: "@ulixee/schema@workspace:schema" + dependencies: + moment: "npm:^2.29.4" + typescript: "npm:^5.0.4" + languageName: unknown + linkType: soft + +"@ulixee/shared-monorepo@workspace:.": + version: 0.0.0-use.local + resolution: "@ulixee/shared-monorepo@workspace:." + dependencies: + "@commitlint/cli": "npm:^17.6.3" + "@commitlint/config-conventional": "npm:^17.6.3" + "@types/jest": "npm:^29.5.1" + "@types/node": "npm:^16.18.31" + "@ulixee/repo-tools": "npm:^1.0.26" + cross-env: "npm:^7.0.3" + husky: "npm:^8.0.3" + jest: "npm:^29.5.0" + lerna: "npm:^4.0.0" + lint-staged: "npm:^13.2.2" + shx: "npm:^0.3.3" + typescript: "npm:~4.7.3" + languageName: unknown + linkType: soft + +"@ulixee/specification@npm:2.0.0-alpha.25, @ulixee/specification@workspace:specification": + version: 0.0.0-use.local + resolution: "@ulixee/specification@workspace:specification" + dependencies: + zod: "npm:^3.20.2" + languageName: unknown + linkType: soft + +"JSONStream@npm:^1.0.4": + version: 1.3.5 + resolution: "JSONStream@npm:1.3.5" + dependencies: + jsonparse: "npm:^1.2.0" + through: "npm:>=2.2.7 <3" + bin: + JSONStream: ./bin.js + checksum: 0f54694da32224d57b715385d4a6b668d2117379d1f3223dc758459246cca58fdc4c628b83e8a8883334e454a0a30aa198ede77c788b55537c1844f686a751f2 + languageName: node + linkType: hard + +"abbrev@npm:1": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: 3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: dbe92f5b2452c93e960c5594e666dd1fae141b965ff2cb4a1e1d0381e3e4db4274c5ce4ffa3d681a86ca2a8d4e29d5efc0670a08e23fd2800051ea387df56ca2 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.8.0": + version: 8.8.2 + resolution: "acorn@npm:8.8.2" + bin: + acorn: bin/acorn + checksum: b5c54e736af5ed753911c6752fafd02d0a74cf4d55be606bd81fe71faba4f986dc090952329931ac2aba165803fd0005c59eeef08f9c6c689e8dc420031f3df0 + languageName: node + linkType: hard + +"add-stream@npm:^1.0.0": + version: 1.0.0 + resolution: "add-stream@npm:1.0.0" + checksum: 985014a14e76ca4cb24e0fc58bb1556794cf38c5c8937de335a10584f50a371dc48e1c34a59391c7eb9c1fc908b4b86764df5d2756f701df6ba95d1ca2f63ddc + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: "npm:^4.3.4" + checksum: fc974ab57ffdd8421a2bc339644d312a9cca320c20c3393c9d8b1fd91731b9bbabdb985df5fc860f5b79d81c3e350daa3fcb31c5c07c0bb385aafc817df004ce + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.1.3": + version: 4.3.0 + resolution: "agentkeepalive@npm:4.3.0" + dependencies: + debug: "npm:^4.1.0" + depd: "npm:^2.0.0" + humanize-ms: "npm:^1.2.1" + checksum: 61cbdab12d45e82e9ae515b0aa8d09617b66f72409e541a646dd7be4b7260d335d7f56a38079ad305bf0ffb8405592a459faf1294111289107f48352a20c2799 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"ajv@npm:^6.10.0, ajv@npm:^6.12.3, ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ajv@npm:^8.11.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: "npm:^3.1.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.2.2" + checksum: ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-regex@npm:^2.0.0": + version: 2.1.1 + resolution: "ansi-regex@npm:2.1.1" + checksum: 78cebaf50bce2cb96341a7230adf28d804611da3ce6bf338efa7b72f06cc6ff648e29f80cd95e582617ba58d5fdbec38abfeed3500a98bce8381a9daec7c548b + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df + languageName: node + linkType: hard + +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"aproba@npm:^1.0.3": + version: 1.2.0 + resolution: "aproba@npm:1.2.0" + checksum: 2d34f008c9edfa991f42fe4b667d541d38a474a39ae0e24805350486d76744cd91ee45313283c1d39a055b14026dd0fc4d0cbfc13f210855d59d7e8b5a61dc51 + languageName: node + linkType: hard + +"aproba@npm:^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5 + languageName: node + linkType: hard + +"are-we-there-yet@npm:~1.1.2": + version: 1.1.7 + resolution: "are-we-there-yet@npm:1.1.7" + dependencies: + delegates: "npm:^1.0.0" + readable-stream: "npm:^2.0.6" + checksum: 03cb45f2892767773c86a616205fc67feb8dfdd56685d1b34999cfa6c0d2aebe73ec0e6ba88a406422b998dea24138337fdb9a3f9b172d7c2a7f75d02f3df088 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"aria-query@npm:^5.1.3": + version: 5.1.3 + resolution: "aria-query@npm:5.1.3" + dependencies: + deep-equal: "npm:^2.0.5" + checksum: edcbc8044c4663d6f88f785e983e6784f98cb62b4ba1e9dd8d61b725d0203e4cfca38d676aee984c31f354103461102a3d583aa4fbe4fd0a89b679744f4e5faf + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + is-array-buffer: "npm:^3.0.1" + checksum: 12f84f6418b57a954caa41654e5e63e019142a4bbb2c6829ba86d1ba65d31ccfaf1461d1743556fd32b091fac34ff44d9dfbdb001402361c45c373b2c86f5c20 + languageName: node + linkType: hard + +"array-differ@npm:^3.0.0": + version: 3.0.0 + resolution: "array-differ@npm:3.0.0" + checksum: c0d924cc2b7e3f5a0e6ae932e8941c5fddc0412bcecf8d5152641910e60f5e1c1e87da2b32083dec2f92f9a8f78e916ea68c22a0579794ba49886951ae783123 + languageName: node + linkType: hard + +"array-ify@npm:^1.0.0": + version: 1.0.0 + resolution: "array-ify@npm:1.0.0" + checksum: 75c9c072faac47bd61779c0c595e912fe660d338504ac70d10e39e1b8a4a0c9c87658703d619b9d1b70d324177ae29dc8d07dda0d0a15d005597bc4c5a59c70c + languageName: node + linkType: hard + +"array-includes@npm:^3.1.5, array-includes@npm:^3.1.6": + version: 3.1.6 + resolution: "array-includes@npm:3.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + get-intrinsic: "npm:^1.1.3" + is-string: "npm:^1.0.7" + checksum: d0caeaa57bea7d14b8480daee30cf8611899321006b15a6cd872b831bd7aaed7649f8764e060d01c5d33b8d9e998e5de5c87f4901874e1c1f467f429b7db2929 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.1": + version: 1.3.1 + resolution: "array.prototype.flat@npm:1.3.1" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + es-shim-unscopables: "npm:^1.0.0" + checksum: 8eda91d6925cc84b73ebf5a3d406ff28745d93a22ef6a0afb967755107081a937cf6c4555d3c18354870b2c5366c0ff51b3f597c11079e689869810a418b1b4f + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.1": + version: 1.3.1 + resolution: "array.prototype.flatmap@npm:1.3.1" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + es-shim-unscopables: "npm:^1.0.0" + checksum: 2bd58a0e79d5d90cb4f5ef0e287edf8b28e87c65428f54025ac6b7b4c204224b92811c266f296c53a2dbc93872117c0fcea2e51d3c9e8cecfd5024d4a4a57db4 + languageName: node + linkType: hard + +"array.prototype.reduce@npm:^1.0.5": + version: 1.0.5 + resolution: "array.prototype.reduce@npm:1.0.5" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + es-array-method-boxes-properly: "npm:^1.0.0" + is-string: "npm:^1.0.7" + checksum: 0c6c589d22d6cda4a32458c6fd57a41f420a4fa6cd184a3f6fe7b507f457bc4a073aff6accd595bcd6ac29cad856e7ac306549f127acdb098f401eea13c54901 + languageName: node + linkType: hard + +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: c35c8d1a81bcd5474c0c57fe3f4bad1a4d46a5fa353cedcff7a54da315df60db71829e69104b859dff96c5d68af46bd2be259fe5e50dc6aa9df3b36bea0383ab + languageName: node + linkType: hard + +"arrify@npm:^2.0.1": + version: 2.0.1 + resolution: "arrify@npm:2.0.1" + checksum: 3fb30b5e7c37abea1907a60b28a554d2f0fc088757ca9bf5b684786e583fdf14360721eb12575c1ce6f995282eab936712d3c4389122682eafab0e0b57f78dbb + languageName: node + linkType: hard + +"asap@npm:^2.0.0": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d + languageName: node + linkType: hard + +"asn1@npm:~0.2.3": + version: 0.2.6 + resolution: "asn1@npm:0.2.6" + dependencies: + safer-buffer: "npm:~2.1.0" + checksum: 00c8a06c37e548762306bcb1488388d2f76c74c36f70c803f0c081a01d3bdf26090fc088cd812afc5e56a6d49e33765d451a5f8a68ab9c2b087eba65d2e980e0 + languageName: node + linkType: hard + +"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": + version: 1.0.0 + resolution: "assert-plus@npm:1.0.0" + checksum: b194b9d50c3a8f872ee85ab110784911e696a4d49f7ee6fc5fb63216dedbefd2c55999c70cb2eaeb4cf4a0e0338b44e9ace3627117b5bf0d42460e9132f21b91 + languageName: node + linkType: hard + +"ast-types-flow@npm:^0.0.7": + version: 0.0.7 + resolution: "ast-types-flow@npm:0.0.7" + checksum: f381529f2da535949ba6cceddbdfaa33b4d5105842e147ec63582f560ea9ecc1a08f66457664f3109841d3053641fa8b9fa94ba607f1ea9f6c804fe5dee44a1d + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.5": + version: 1.0.5 + resolution: "available-typed-arrays@npm:1.0.5" + checksum: c4df567ca72d2754a6cbad20088f5f98b1065b3360178169fa9b44ea101af62c0f423fc3854fa820fd6895b6b9171b8386e71558203103ff8fc2ad503fdcc660 + languageName: node + linkType: hard + +"aws-sign2@npm:~0.7.0": + version: 0.7.0 + resolution: "aws-sign2@npm:0.7.0" + checksum: 021d2cc5547d4d9ef1633e0332e746a6f447997758b8b68d6fb33f290986872d2bff5f0c37d5832f41a7229361f093cd81c40898d96ed153493c0fb5cd8575d2 + languageName: node + linkType: hard + +"aws4@npm:^1.8.0": + version: 1.12.0 + resolution: "aws4@npm:1.12.0" + checksum: 1e39c266f53b04daf88e112de93a6006375b386a1b7ab6197260886e39abd012aa90bdd87949c3bf9c30754846031f6d5d8ac4f8676628097c11065b5d39847a + languageName: node + linkType: hard + +"axe-core@npm:^4.6.2": + version: 4.7.2 + resolution: "axe-core@npm:4.7.2" + checksum: 8dfc61f038fbd9623ae8a264c8a475d887113a027fb440a2b377b82ffd300e71d1a0bcf042ff13b517a8d548b34c44b4159eff693725c5d7cde240d0aa68feac + languageName: node + linkType: hard + +"axobject-query@npm:^3.1.1": + version: 3.1.1 + resolution: "axobject-query@npm:3.1.1" + dependencies: + deep-equal: "npm:^2.0.5" + checksum: fff3175a22fd1f41fceb7ae0cd25f6594a0d7fba28c2335dd904538b80eb4e1040432564a3c643025cd2bb748f68d35aaabffb780b794da97ecfc748810b25ad + languageName: node + linkType: hard + +"babel-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-jest@npm:29.5.0" + dependencies: + "@jest/transform": "npm:^29.5.0" + "@types/babel__core": "npm:^7.1.14" + babel-plugin-istanbul: "npm:^6.1.1" + babel-preset-jest: "npm:^29.5.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + slash: "npm:^3.0.0" + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 1114d3935e0f62b72e155ac79916214c078e798561be3b03d12ddd862f2849becc8516f89046719161ec457bded35d2e1fd7ddfb207a6169dd18bbb2a67ee987 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-instrument: "npm:^5.0.4" + test-exclude: "npm:^6.0.0" + checksum: 1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-plugin-jest-hoist@npm:29.5.0" + dependencies: + "@babel/template": "npm:^7.3.3" + "@babel/types": "npm:^7.3.3" + "@types/babel__core": "npm:^7.1.14" + "@types/babel__traverse": "npm:^7.0.6" + checksum: 385547c4d81647848dc3e86fecf4381032be99ed97d87aee78d422631f651042600371ee31e37ec9bb6f4a0a4f296b3b5798d69c410626ea94eae76d9c64da63 + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.0.1 + resolution: "babel-preset-current-node-syntax@npm:1.0.1" + dependencies: + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.8.3" + "@babel/plugin-syntax-import-meta": "npm:^7.8.3" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-top-level-await": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 5ba39a3a0e6c37d25e56a4fb843be632dac98d54706d8a0933f9bcb1a07987a96d55c2b5a6c11788a74063fb2534fe68c1f1dbb6c93626850c785e0938495627 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-preset-jest@npm:29.5.0" + dependencies: + babel-plugin-jest-hoist: "npm:^29.5.0" + babel-preset-current-node-syntax: "npm:^1.0.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 752b8682c8cf55bca46d870003f4ce43a4ba0fcaa1138ff7f0e02340628e221810b0c2c3e77a7d5070168dc163eb11907f6c9256f187242abe0f14219d1f6b12 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"bcrypt-pbkdf@npm:^1.0.0": + version: 1.0.2 + resolution: "bcrypt-pbkdf@npm:1.0.2" + dependencies: + tweetnacl: "npm:^0.14.3" + checksum: ddfe85230b32df25aeebfdccfbc61d3bc493ace49c884c9c68575de1f5dcf733a5d7de9def3b0f318b786616b8d85bad50a28b1da1750c43e0012c93badcc148 + languageName: node + linkType: hard + +"bech32@npm:^2.0.0": + version: 2.0.0 + resolution: "bech32@npm:2.0.0" + checksum: 45e7cc62758c9b26c05161b4483f40ea534437cf68ef785abadc5b62a2611319b878fef4f86ddc14854f183b645917a19addebc9573ab890e19194bc8f521942 + languageName: node + linkType: hard + +"before-after-hook@npm:^2.2.0": + version: 2.2.3 + resolution: "before-after-hook@npm:2.2.3" + checksum: 0488c4ae12df758ca9d49b3bb27b47fd559677965c52cae7b335784724fb8bf96c42b6e5ba7d7afcbc31facb0e294c3ef717cc41c5bc2f7bd9e76f8b90acd31c + languageName: node + linkType: hard + +"big-integer@npm:^1.6.44": + version: 1.6.51 + resolution: "big-integer@npm:1.6.51" + checksum: c8139662d57f8833a44802f4b65be911679c569535ea73c5cfd3c1c8994eaead1b84b6f63e1db63833e4d4cacb6b6a9e5522178113dfdc8e4c81ed8436f1e8cc + languageName: node + linkType: hard + +"bignumber.js@npm:^9.0.2": + version: 9.1.1 + resolution: "bignumber.js@npm:9.1.1" + checksum: 950312b15d038ae06028c8a6901fb4efd57fa889ada8c887cebd856e79f2fc9667641bebfb2e2ea4cc694e663fd55c1fe6e62a7e8fe40bbdebdf92269537b802 + languageName: node + linkType: hard + +"bplist-parser@npm:^0.2.0": + version: 0.2.0 + resolution: "bplist-parser@npm:0.2.0" + dependencies: + big-integer: "npm:^1.6.44" + checksum: ce79c69e0f6efe506281e7c84e3712f7d12978991675b6e3a58a295b16f13ca81aa9b845c335614a545e0af728c8311b6aa3142af76ba1cb616af9bbac5c4a9f + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: "npm:^7.0.1" + checksum: 321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 + languageName: node + linkType: hard + +"browserslist@npm:^4.21.3": + version: 4.21.7 + resolution: "browserslist@npm:4.21.7" + dependencies: + caniuse-lite: "npm:^1.0.30001489" + electron-to-chromium: "npm:^1.4.411" + node-releases: "npm:^2.0.12" + update-browserslist-db: "npm:^1.0.11" + bin: + browserslist: cli.js + checksum: c523a982ef5d4141907795bbb72d7e2c5df79b2c6e495ef8ff6405b6734a2f16529a7f54c86b113085cad8a3359ac2fc6a478e86ae715084ba7384b9344b2ef5 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: "npm:^0.4.0" + checksum: 24d8dfb7b6d457d73f32744e678a60cc553e4ec0e9e1a01cf614b44d85c3c87e188d3cc78ef0442ce5032ee6818de20a0162ba1074725c0d08908f62ea979227 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"builtins@npm:^1.0.3": + version: 1.0.3 + resolution: "builtins@npm:1.0.3" + checksum: 493afcc1db0a56d174cc85bebe5ca69144f6fdd0007d6cbe6b2434185314c79d83cb867e492b56aa5cf421b4b8a8135bf96ba4c3ce71994cf3da154d1ea59747 + languageName: node + linkType: hard + +"bundle-name@npm:^3.0.0": + version: 3.0.0 + resolution: "bundle-name@npm:3.0.0" + dependencies: + run-applescript: "npm:^5.0.0" + checksum: 57bc7f8b025d83961b04db2f1eff6a87f2363c2891f3542a4b82471ff8ebb5d484af48e9784fcdb28ef1d48bb01f03d891966dc3ef58758e46ea32d750ce40f8 + languageName: node + linkType: hard + +"byline@npm:^5.0.0": + version: 5.0.0 + resolution: "byline@npm:5.0.0" + checksum: 33fb64cd84440b3652a99a68d732c56ef18a748ded495ba38e7756a242fab0d4654b9b8ce269fd0ac14c5f97aa4e3c369613672b280a1f60b559b34223105c85 + languageName: node + linkType: hard + +"byte-size@npm:^7.0.0": + version: 7.0.1 + resolution: "byte-size@npm:7.0.1" + checksum: 3edcd515b61e9c43a90aa33fdca37a2d11faa0d24e87d3a55f738398d247cd632efc0b346c026bd70f8a57a20bb8469e24136aeaef6f2e72e716e093d6b3b031 + languageName: node + linkType: hard + +"cacache@npm:^15.0.5, cacache@npm:^15.2.0": + version: 15.3.0 + resolution: "cacache@npm:15.3.0" + dependencies: + "@npmcli/fs": "npm:^1.0.0" + "@npmcli/move-file": "npm:^1.0.1" + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + glob: "npm:^7.1.4" + infer-owner: "npm:^1.0.4" + lru-cache: "npm:^6.0.0" + minipass: "npm:^3.1.1" + minipass-collect: "npm:^1.0.2" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.2" + mkdirp: "npm:^1.0.3" + p-map: "npm:^4.0.0" + promise-inflight: "npm:^1.0.1" + rimraf: "npm:^3.0.2" + ssri: "npm:^8.0.1" + tar: "npm:^6.0.2" + unique-filename: "npm:^1.1.1" + checksum: 886fcc0acc4f6fd5cd142d373d8276267bc6d655d7c4ce60726fbbec10854de3395ee19bbf9e7e73308cdca9fdad0ad55060ff3bd16c6d4165c5b8d21515e1d8 + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.2 + resolution: "cacache@npm:18.0.2" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 7992665305cc251a984f4fdbab1449d50e88c635bc43bf2785530c61d239c61b349e5734461baa461caaee65f040ab14e2d58e694f479c0810cffd181ba5eabc + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind@npm:1.0.2" + dependencies: + function-bind: "npm:^1.1.1" + get-intrinsic: "npm:^1.0.2" + checksum: 74ba3f31e715456e22e451d8d098779b861eba3c7cac0d9b510049aced70d75c231ba05071f97e1812c98e34e2bee734c0c6126653e0088c2d9819ca047f4073 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"camelcase-keys@npm:^6.2.2": + version: 6.2.2 + resolution: "camelcase-keys@npm:6.2.2" + dependencies: + camelcase: "npm:^5.3.1" + map-obj: "npm:^4.0.0" + quick-lru: "npm:^4.0.1" + checksum: bf1a28348c0f285c6c6f68fb98a9d088d3c0269fed0cdff3ea680d5a42df8a067b4de374e7a33e619eb9d5266a448fe66c2dd1f8e0c9209ebc348632882a3526 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001489": + version: 1.0.30001492 + resolution: "caniuse-lite@npm:1.0.30001492" + checksum: df7ad55d2475ff6561e84e2f21c8da45fe02ba539d493d5a77214aeaf264632cf74084a8eb13bfd2cb0c9fbde0ff6af4acbd923b8590eb6b2920ba44fcac9b2d + languageName: node + linkType: hard + +"caseless@npm:~0.12.0": + version: 0.12.0 + resolution: "caseless@npm:0.12.0" + checksum: ccf64bcb6c0232cdc5b7bd91ddd06e23a4b541f138336d4725233ac538041fb2f29c2e86c3c4a7a61ef990b665348db23a047060b9414c3a6603e9fa61ad4626 + languageName: node + linkType: hard + +"chalk@npm:5.2.0": + version: 5.2.0 + resolution: "chalk@npm:5.2.0" + checksum: 8a519b35c239f96e041b7f1ed8fdd79d3ca2332a8366cb957378b8a1b8a4cdfb740d19628e8bf74654d4c0917aa10cf39c20752e177a1304eac29a1168a740e9 + languageName: node + linkType: hard + +"chalk@npm:^2.0.0": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + languageName: node + linkType: hard + +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: ee650b0a065b3d7a6fda258e75d3a86fc8e4effa55871da730a9e42ccb035bf5fd203525e5a1ef45ec2582ecc4f65b47eb11357c526b84dd29a14fb162c414d2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e + languageName: node + linkType: hard + +"chardet@npm:^0.7.0": + version: 0.7.0 + resolution: "chardet@npm:0.7.0" + checksum: 96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d + languageName: node + linkType: hard + +"chownr@npm:^1.1.4": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"ci-info@npm:^2.0.0": + version: 2.0.0 + resolution: "ci-info@npm:2.0.0" + checksum: 8c5fa3830a2bcee2b53c2e5018226f0141db9ec9f7b1e27a5c57db5512332cde8a0beb769bcbaf0d8775a78afbf2bb841928feca4ea6219638a5b088f9884b46 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.8.0 + resolution: "ci-info@npm:3.8.0" + checksum: 0d3052193b58356372b34ab40d2668c3e62f1006d5ca33726d1d3c423853b19a85508eadde7f5908496fb41448f465263bf61c1ee58b7832cb6a924537e3863a + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.2.2 + resolution: "cjs-module-lexer@npm:1.2.2" + checksum: 83330e1feda2e3699b8c305bfa8f841b41822049393f5eefeb574e60bde556e2a251ee9b7971cde0cb47ac4f7823bf4ab4a6005b8471f86ad9f5509eefb66cbd + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-truncate@npm:^2.1.0": + version: 2.1.0 + resolution: "cli-truncate@npm:2.1.0" + dependencies: + slice-ansi: "npm:^3.0.0" + string-width: "npm:^4.2.0" + checksum: dfaa3df675bcef7a3254773de768712b590250420345a4c7ac151f041a4bacb4c25864b1377bee54a39b5925a030c00eabf014e312e3a4ac130952ed3b3879e9 + languageName: node + linkType: hard + +"cli-truncate@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-truncate@npm:3.1.0" + dependencies: + slice-ansi: "npm:^5.0.0" + string-width: "npm:^5.0.0" + checksum: a19088878409ec0e5dc2659a5166929629d93cfba6d68afc9cde2282fd4c751af5b555bf197047e31c87c574396348d011b7aa806fec29c4139ea4f7f00b324c + languageName: node + linkType: hard + +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 125a62810e59a2564268c80fdff56c23159a7690c003e34aeb2e68497dccff26911998ff49c33916fcfdf71e824322cc3953e3f7b48b27267c7a062c81348a9a + languageName: node + linkType: hard + +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 6035f5daf7383470cef82b3d3db00bec70afb3423538c50394386ffbbab135e26c3689c41791f911fa71b62d13d3863c712fdd70f0fbdffd938a1e6fd09aac00 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: "npm:^2.0.4" + kind-of: "npm:^6.0.2" + shallow-clone: "npm:^3.0.0" + checksum: 637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b + languageName: node + linkType: hard + +"cmd-shim@npm:^4.1.0": + version: 4.1.0 + resolution: "cmd-shim@npm:4.1.0" + dependencies: + mkdirp-infer-owner: "npm:^2.0.0" + checksum: 9cb911c768a5894473e72d87e682fdfb9bc8f8097cc21bbbf1120a69f8c2edda3f72135beb41cbc75ec3fe113a96c3d6b37c652df800208e6fe71ed97a0cc602 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: 33f6b234084e46e6e369b6f0b07949392651b4dde70fc6a592a8d3dafa08d5bb32e3981a02f31f6fc323a26bc03a4c063a9d56834848695bda7611c2417ea2e6 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.1 + resolution: "collect-v8-coverage@npm:1.0.1" + checksum: df8192811a773d10978fd25060124e4228d9a86bab40de3f18df5ce1a3730832351a52ba1c0e3915d5bd638298fc7bc9723760d25f534462746e269a6f0ac91c + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"colorette@npm:^2.0.19": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + +"columnify@npm:^1.5.4": + version: 1.6.0 + resolution: "columnify@npm:1.6.0" + dependencies: + strip-ansi: "npm:^6.0.1" + wcwidth: "npm:^1.0.0" + checksum: 25b90b59129331bbb8b0c838f8df69924349b83e8eab9549f431062a20a39094b8d744bb83265be38fd5d03140ce4bfbd85837c293f618925e83157ae9535f1d + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.6, combined-stream@npm:~1.0.6": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 + languageName: node + linkType: hard + +"commander@npm:^9.3.0": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: 5f7784fbda2aaec39e89eb46f06a999e00224b3763dc65976e05929ec486e174fe9aac2655f03ba6a5e83875bd173be5283dc19309b7c65954701c02025b3c1d + languageName: node + linkType: hard + +"compare-func@npm:^2.0.0": + version: 2.0.0 + resolution: "compare-func@npm:2.0.0" + dependencies: + array-ify: "npm:^1.0.0" + dot-prop: "npm:^5.1.0" + checksum: 78bd4dd4ed311a79bd264c9e13c36ed564cde657f1390e699e0f04b8eee1fc06ffb8698ce2dfb5fbe7342d509579c82d4e248f08915b708f77f7b72234086cc3 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"concat-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "concat-stream@npm:2.0.0" + dependencies: + buffer-from: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.0.2" + typedarray: "npm:^0.0.6" + checksum: 29565dd9198fe1d8cf57f6cc71527dbc6ad67e12e4ac9401feb389c53042b2dceedf47034cbe702dfc4fd8df3ae7e6bfeeebe732cc4fa2674e484c13f04c219a + languageName: node + linkType: hard + +"config-chain@npm:^1.1.12": + version: 1.1.13 + resolution: "config-chain@npm:1.1.13" + dependencies: + ini: "npm:^1.3.4" + proto-list: "npm:~1.2.1" + checksum: 39d1df18739d7088736cc75695e98d7087aea43646351b028dfabd5508d79cf6ef4c5bcd90471f52cd87ae470d1c5490c0a8c1a292fbe6ee9ff688061ea0963e + languageName: node + linkType: hard + +"confusing-browser-globals@npm:^1.0.10": + version: 1.0.11 + resolution: "confusing-browser-globals@npm:1.0.11" + checksum: 475d0a284fa964a5182b519af5738b5b64bf7e413cfd703c1b3496bf6f4df9f827893a9b221c0ea5873c1476835beb1e0df569ba643eff0734010c1eb780589e + languageName: node + linkType: hard + +"console-control-strings@npm:^1.0.0, console-control-strings@npm:~1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 + languageName: node + linkType: hard + +"conventional-changelog-angular@npm:^5.0.11, conventional-changelog-angular@npm:^5.0.12": + version: 5.0.13 + resolution: "conventional-changelog-angular@npm:5.0.13" + dependencies: + compare-func: "npm:^2.0.0" + q: "npm:^1.5.1" + checksum: bca711b835fe01d75e3500b738f6525c91a12096218e917e9fd81bf9accf157f904fee16f88c523fd5462fb2a7cb1d060eb79e9bc9a3ccb04491f0c383b43231 + languageName: node + linkType: hard + +"conventional-changelog-conventionalcommits@npm:^5.0.0": + version: 5.0.0 + resolution: "conventional-changelog-conventionalcommits@npm:5.0.0" + dependencies: + compare-func: "npm:^2.0.0" + lodash: "npm:^4.17.15" + q: "npm:^1.5.1" + checksum: 02cc9313b44953332e9d45833615675cbc4d0f4129b27ea7218f8f4fc2f35124748725969c0cb3dc645713d19684540b87c5af25bd17ce3dccd7ef4e05e42442 + languageName: node + linkType: hard + +"conventional-changelog-core@npm:^4.2.2": + version: 4.2.4 + resolution: "conventional-changelog-core@npm:4.2.4" + dependencies: + add-stream: "npm:^1.0.0" + conventional-changelog-writer: "npm:^5.0.0" + conventional-commits-parser: "npm:^3.2.0" + dateformat: "npm:^3.0.0" + get-pkg-repo: "npm:^4.0.0" + git-raw-commits: "npm:^2.0.8" + git-remote-origin-url: "npm:^2.0.0" + git-semver-tags: "npm:^4.1.1" + lodash: "npm:^4.17.15" + normalize-package-data: "npm:^3.0.0" + q: "npm:^1.5.1" + read-pkg: "npm:^3.0.0" + read-pkg-up: "npm:^3.0.0" + through2: "npm:^4.0.0" + checksum: 4c9f30350250298d9bbb56988b3093ec7de593499a796609c5877115533362815434ff6df3493649e20b1b40399fef3d42032f39e8279bb8df192b89e6e32e69 + languageName: node + linkType: hard + +"conventional-changelog-preset-loader@npm:^2.3.4": + version: 2.3.4 + resolution: "conventional-changelog-preset-loader@npm:2.3.4" + checksum: a978bcd5fc2eb12b56bc03ec59705af32e521fd27b98a209a26767c2078d423e7d8e30c09d45547371631790f0387453434c73c4541521a7473dce14d5360c7d + languageName: node + linkType: hard + +"conventional-changelog-writer@npm:^5.0.0": + version: 5.0.1 + resolution: "conventional-changelog-writer@npm:5.0.1" + dependencies: + conventional-commits-filter: "npm:^2.0.7" + dateformat: "npm:^3.0.0" + handlebars: "npm:^4.7.7" + json-stringify-safe: "npm:^5.0.1" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + semver: "npm:^6.0.0" + split: "npm:^1.0.0" + through2: "npm:^4.0.0" + bin: + conventional-changelog-writer: cli.js + checksum: 268b56a3e4db07ad24da7134788c889ecd024cf2e7c0bfe8ca76f83e5db79f057538c45500b052a77b7933c4d0f47e2e807c6e756cbd5ad9db365744c9ce0e7f + languageName: node + linkType: hard + +"conventional-commits-filter@npm:^2.0.7": + version: 2.0.7 + resolution: "conventional-commits-filter@npm:2.0.7" + dependencies: + lodash.ismatch: "npm:^4.4.0" + modify-values: "npm:^1.0.0" + checksum: df06fb29285b473614f5094e983d26fcc14cd0f64b2cbb2f65493fc8bd47c077c2310791d26f4b2b719e9585aaade95370e73230bff6647163164a18b9dfaa07 + languageName: node + linkType: hard + +"conventional-commits-parser@npm:^3.2.0, conventional-commits-parser@npm:^3.2.2": + version: 3.2.4 + resolution: "conventional-commits-parser@npm:3.2.4" + dependencies: + JSONStream: "npm:^1.0.4" + is-text-path: "npm:^1.0.1" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + split2: "npm:^3.0.0" + through2: "npm:^4.0.0" + bin: + conventional-commits-parser: cli.js + checksum: 122d7d7f991a04c8e3f703c0e4e9a25b2ecb20906f497e4486cb5c2acd9c68f6d9af745f7e79cb407538f50e840b33399274ac427b20971b98b335d1b66d3d17 + languageName: node + linkType: hard + +"conventional-recommended-bump@npm:^6.1.0": + version: 6.1.0 + resolution: "conventional-recommended-bump@npm:6.1.0" + dependencies: + concat-stream: "npm:^2.0.0" + conventional-changelog-preset-loader: "npm:^2.3.4" + conventional-commits-filter: "npm:^2.0.7" + conventional-commits-parser: "npm:^3.2.0" + git-raw-commits: "npm:^2.0.8" + git-semver-tags: "npm:^4.1.1" + meow: "npm:^8.0.0" + q: "npm:^1.5.1" + bin: + conventional-recommended-bump: cli.js + checksum: 649e6230be7e96e057a542a2695710aeaee356297d307691b3398e0f18d596b4a5b3ba56307755e779d8687a13b2466844300c649eb23f44fe5f1db9f923f3f4 + languageName: node + linkType: hard + +"convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: 281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"copyfiles@npm:^2.4.1": + version: 2.4.1 + resolution: "copyfiles@npm:2.4.1" + dependencies: + glob: "npm:^7.0.5" + minimatch: "npm:^3.0.3" + mkdirp: "npm:^1.0.4" + noms: "npm:0.0.0" + through2: "npm:^2.0.1" + untildify: "npm:^4.0.0" + yargs: "npm:^16.1.0" + bin: + copyfiles: copyfiles + copyup: copyfiles + checksum: e65cd055ec9acc14997b0ace83973d73f8d9c68167cbf4293c40b52d100af09a8c8da329042d52dc33422c0a8cbf74c6efb25e9ae088667721653659bd67bf57 + languageName: node + linkType: hard + +"core-util-is@npm:1.0.2": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: 980a37a93956d0de8a828ce508f9b9e3317039d68922ca79995421944146700e4aaf490a6dbfebcb1c5292a7184600c7710b957d724be1e37b8254c6bc0fe246 + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"cosmiconfig-typescript-loader@npm:^4.0.0": + version: 4.3.0 + resolution: "cosmiconfig-typescript-loader@npm:4.3.0" + peerDependencies: + "@types/node": "*" + cosmiconfig: ">=7" + ts-node: ">=10" + typescript: ">=3" + checksum: 15a0bad3befdc3bf1fddda4876068971508f8dc7e2fb24b16aa0641e1d629bf48f35ff23b87a01177d25e7d5ad8522b995eab76bf44180a27b9245b9eeb4f140 + languageName: node + linkType: hard + +"cosmiconfig@npm:^7.0.0": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.2.1" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.10.0" + checksum: b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 + languageName: node + linkType: hard + +"cosmiconfig@npm:^8.0.0": + version: 8.1.3 + resolution: "cosmiconfig@npm:8.1.3" + dependencies: + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + checksum: 80144be230b89857e7c4cafd59ba8feb3f5f7e6dae90faa324629fdecf9a6fc3f5b4106c3623f69a1a3d77cb11ef90e5ab65a67f21d73ffda3d76b18f8e4e6c2 + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + +"cross-env@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-env@npm:7.0.3" + dependencies: + cross-spawn: "npm:^7.0.1" + bin: + cross-env: src/bin/cross-env.js + cross-env-shell: src/bin/cross-env-shell.js + checksum: f3765c25746c69fcca369655c442c6c886e54ccf3ab8c16847d5ad0e91e2f337d36eedc6599c1227904bf2a228d721e690324446876115bc8e7b32a866735ecf + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + languageName: node + linkType: hard + +"damerau-levenshtein@npm:^1.0.8": + version: 1.0.8 + resolution: "damerau-levenshtein@npm:1.0.8" + checksum: 4c2647e0f42acaee7d068756c1d396e296c3556f9c8314bac1ac63ffb236217ef0e7e58602b18bb2173deec7ec8e0cac8e27cccf8f5526666b4ff11a13ad54a3 + languageName: node + linkType: hard + +"dargs@npm:^7.0.0": + version: 7.0.0 + resolution: "dargs@npm:7.0.0" + checksum: ec7f6a8315a8fa2f8b12d39207615bdf62b4d01f631b96fbe536c8ad5469ab9ed710d55811e564d0d5c1d548fc8cb6cc70bf0939f2415790159f5a75e0f96c92 + languageName: node + linkType: hard + +"dashdash@npm:^1.12.0": + version: 1.14.1 + resolution: "dashdash@npm:1.14.1" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: 64589a15c5bd01fa41ff7007e0f2c6552c5ef2028075daa16b188a3721f4ba001841bf306dfc2eee6e2e6e7f76b38f5f17fb21fa847504192290ffa9e150118a + languageName: node + linkType: hard + +"dateformat@npm:^3.0.0": + version: 3.0.3 + resolution: "dateformat@npm:3.0.3" + checksum: 2effb8bef52ff912f87a05e4adbeacff46353e91313ad1ea9ed31412db26849f5a0fcc7e3ce36dbfb84fc6c881a986d5694f84838ad0da7000d5150693e78678 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"debuglog@npm:^1.0.1": + version: 1.0.1 + resolution: "debuglog@npm:1.0.1" + checksum: d98ac9abe6a528fcbb4d843b1caf5a9116998c76e1263d8ff4db2c086aa96fa7ea4c752a81050fa2e4304129ef330e6e4dc9dd4d47141afd7db80bf699f08219 + languageName: node + linkType: hard + +"decamelize-keys@npm:^1.1.0": + version: 1.1.1 + resolution: "decamelize-keys@npm:1.1.1" + dependencies: + decamelize: "npm:^1.1.0" + map-obj: "npm:^1.0.0" + checksum: 4ca385933127437658338c65fb9aead5f21b28d3dd3ccd7956eb29aab0953b5d3c047fbc207111672220c71ecf7a4d34f36c92851b7bbde6fca1a02c541bdd7d + languageName: node + linkType: hard + +"decamelize@npm:^1.1.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: 85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 + languageName: node + linkType: hard + +"decode-uri-component@npm:^0.2.0": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 1f4fa54eb740414a816b3f6c24818fbfcabd74ac478391e9f4e2282c994127db02010ce804f3d08e38255493cfe68608b3f5c8e09fd6efc4ae46c807691f7a31 + languageName: node + linkType: hard + +"dedent@npm:^0.7.0": + version: 0.7.0 + resolution: "dedent@npm:0.7.0" + checksum: 7c3aa00ddfe3e5fcd477958e156156a5137e3bb6ff1493ca05edff4decf29a90a057974cc77e75951f8eb801c1816cb45aea1f52d628cdd000b82b36ab839d1b + languageName: node + linkType: hard + +"deep-equal@npm:^2.0.5": + version: 2.2.1 + resolution: "deep-equal@npm:2.2.1" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + call-bind: "npm:^1.0.2" + es-get-iterator: "npm:^1.1.3" + get-intrinsic: "npm:^1.2.0" + is-arguments: "npm:^1.1.1" + is-array-buffer: "npm:^3.0.2" + is-date-object: "npm:^1.0.5" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + isarray: "npm:^2.0.5" + object-is: "npm:^1.1.5" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.5.0" + side-channel: "npm:^1.0.4" + which-boxed-primitive: "npm:^1.0.2" + which-collection: "npm:^1.0.1" + which-typed-array: "npm:^1.1.9" + checksum: 9e32606f0e24ef4d6b100c68cadae81495c3638944e933afc4b8389b042e95c5fe1381492cf7a6d385bcbae564c9cfb7086f37f277e37521a632b008a6b208dc + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"default-browser-id@npm:^3.0.0": + version: 3.0.0 + resolution: "default-browser-id@npm:3.0.0" + dependencies: + bplist-parser: "npm:^0.2.0" + untildify: "npm:^4.0.0" + checksum: 8db3ab882eb3e1e8b59d84c8641320e6c66d8eeb17eb4bb848b7dd549b1e6fd313988e4a13542e95fbaeff03f6e9dedc5ad191ad4df7996187753eb0d45c00b7 + languageName: node + linkType: hard + +"default-browser@npm:^4.0.0": + version: 4.0.0 + resolution: "default-browser@npm:4.0.0" + dependencies: + bundle-name: "npm:^3.0.0" + default-browser-id: "npm:^3.0.0" + execa: "npm:^7.1.1" + titleize: "npm:^3.0.0" + checksum: 7c8848badc139ecf9d878e562bc4e7ab4301e51ba120b24d8dcb14739c30152115cc612065ac3ab73c02aace4afa29db5a044257b2f0cf234f16e3a58f6c925e + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: "npm:^1.0.2" + checksum: 9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a + languageName: node + linkType: hard + +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 5ab0b2bf3fa58b3a443140bbd4cd3db1f91b985cc8a246d330b9ac3fc0b6a325a6d82bddc0b055123d745b3f9931afeea74a5ec545439a1630b9c8512b0eeb49 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0": + version: 1.2.0 + resolution: "define-properties@npm:1.2.0" + dependencies: + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 34b58cae4651936a3c8c720310ce393a3227f5123640ab5402e7d6e59bb44f8295b789cb5d74e7513682b2e60ff20586d6f52b726d964d617abffa3da76344e0 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 + languageName: node + linkType: hard + +"depd@npm:^2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c + languageName: node + linkType: hard + +"deprecation@npm:^2.0.0, deprecation@npm:^2.3.1": + version: 2.3.1 + resolution: "deprecation@npm:2.3.1" + checksum: 23d688ba66b74d09b908c40a76179418acbeeb0bfdf218c8075c58ad8d0c315130cb91aa3dffb623aa3a411a3569ce56c6460de6c8d69071c17fe6dd2442f032 + languageName: node + linkType: hard + +"detect-indent@npm:^5.0.0": + version: 5.0.0 + resolution: "detect-indent@npm:5.0.0" + checksum: 58d985dd5b4d5e5aad6fe7d8ecc74538fa92c807c894794b8505569e45651bf01a38755b65d9d3d17e512239a26d3131837cbef43cf4226968d5abf175bbcc9d + languageName: node + linkType: hard + +"detect-indent@npm:^6.0.0": + version: 6.1.0 + resolution: "detect-indent@npm:6.1.0" + checksum: dd83cdeda9af219cf77f5e9a0dc31d828c045337386cfb55ce04fad94ba872ee7957336834154f7647b89b899c3c7acc977c57a79b7c776b506240993f97acc7 + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + +"devtools-protocol@npm:^0.0.1137505": + version: 0.0.1137505 + resolution: "devtools-protocol@npm:0.0.1137505" + checksum: 49423ff2d5535ea85fe7a841453ddd1be3fcbb2d17ffc55b55927f4ffd7b6d4035f4dfdde8bfaed3a1db383d3af410f91689d37dcc3d2a8faf8034f883c19776 + languageName: node + linkType: hard + +"dezalgo@npm:^1.0.0": + version: 1.0.4 + resolution: "dezalgo@npm:1.0.4" + dependencies: + asap: "npm:^2.0.0" + wrappy: "npm:1" + checksum: 8a870ed42eade9a397e6141fe5c025148a59ed52f1f28b1db5de216b4d57f0af7a257070c3af7ce3d5508c1ce9dd5009028a76f4b2cc9370dc56551d2355fad8 + languageName: node + linkType: hard + +"diff-sequences@npm:^29.4.3": + version: 29.4.3 + resolution: "diff-sequences@npm:29.4.3" + checksum: 183800b9fd8523a05a3a50ade0fafe81d4b8a8ac113b077d2bc298052ccdc081e3b896f19bf65768b536daebd8169a493c4764cb70a2195e14c442c12538d121 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + +"dot-prop@npm:^5.1.0": + version: 5.3.0 + resolution: "dot-prop@npm:5.3.0" + dependencies: + is-obj: "npm:^2.0.0" + checksum: 93f0d343ef87fe8869320e62f2459f7e70f49c6098d948cc47e060f4a3f827d0ad61e83cb82f2bd90cd5b9571b8d334289978a43c0f98fea4f0e99ee8faa0599 + languageName: node + linkType: hard + +"dot-prop@npm:^6.0.1": + version: 6.0.1 + resolution: "dot-prop@npm:6.0.1" + dependencies: + is-obj: "npm:^2.0.0" + checksum: 30e51ec6408978a6951b21e7bc4938aad01a86f2fdf779efe52330205c6bb8a8ea12f35925c2029d6dc9d1df22f916f32f828ce1e9b259b1371c580541c22b5a + languageName: node + linkType: hard + +"duplexer@npm:^0.1.1": + version: 0.1.2 + resolution: "duplexer@npm:0.1.2" + checksum: c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"ecc-jsbn@npm:~0.1.1": + version: 0.1.2 + resolution: "ecc-jsbn@npm:0.1.2" + dependencies: + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.1.0" + checksum: 6cf168bae1e2dad2e46561d9af9cbabfbf5ff592176ad4e9f0f41eaaf5fe5e10bb58147fe0a804de62b1ee9dad42c28810c88d652b21b6013c47ba8efa274ca1 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.411": + version: 1.4.418 + resolution: "electron-to-chromium@npm:1.4.418" + checksum: 97dca2d406fa5e1e505b3550cfc5ec7b7f511db7ac1c95abf2e08e8db75d4d54e2b3fe966a50fcf740564d9163d20520c6090bc51d79e2201f3e7eba72458f21 + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.12, encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.12.0": + version: 5.14.1 + resolution: "enhanced-resolve@npm:5.14.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 65edb495492817fcdc2f8755f911835c4a5ea706377e9a57bbdacace14167c1413ad4d12630d23b850e80e2671b9a46603e562b9321546d1eca664ac24170906 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"envinfo@npm:^7.7.4": + version: 7.8.1 + resolution: "envinfo@npm:7.8.1" + bin: + envinfo: dist/cli.js + checksum: 01efe7fcf55d4b84a146bc638ef89a89a70b610957db64636ac7cc4247d627eeb1c808ed79d3cfbe3d4fed5e8ba3d61db79c1ca1a3fea9f38639561eefd68733 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4, es-abstract@npm:^1.21.2": + version: 1.21.2 + resolution: "es-abstract@npm:1.21.2" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + es-set-tostringtag: "npm:^2.0.1" + es-to-primitive: "npm:^1.2.1" + function.prototype.name: "npm:^1.1.5" + get-intrinsic: "npm:^1.2.0" + get-symbol-description: "npm:^1.0.0" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has: "npm:^1.0.3" + has-property-descriptors: "npm:^1.0.0" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + internal-slot: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.2" + is-callable: "npm:^1.2.7" + is-negative-zero: "npm:^2.0.2" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + is-string: "npm:^1.0.7" + is-typed-array: "npm:^1.1.10" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.12.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.4.3" + safe-regex-test: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.7" + string.prototype.trimend: "npm:^1.0.6" + string.prototype.trimstart: "npm:^1.0.6" + typed-array-length: "npm:^1.0.4" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.9" + checksum: 7dc2c882bafbb13609b9c35c29f0717ebf5a4dbde23a73803be821f349aa38d55f324318ccebb6da83c074260622f11d0a7f4cd1e0e19f52cc03b6b5386693fb + languageName: node + linkType: hard + +"es-array-method-boxes-properly@npm:^1.0.0": + version: 1.0.0 + resolution: "es-array-method-boxes-properly@npm:1.0.0" + checksum: 4b7617d3fbd460d6f051f684ceca6cf7e88e6724671d9480388d3ecdd72119ddaa46ca31f2c69c5426a82e4b3091c1e81867c71dcdc453565cd90005ff2c382d + languageName: node + linkType: hard + +"es-get-iterator@npm:^1.1.3": + version: 1.1.3 + resolution: "es-get-iterator@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.3" + has-symbols: "npm:^1.0.3" + is-arguments: "npm:^1.1.1" + is-map: "npm:^2.0.2" + is-set: "npm:^2.0.2" + is-string: "npm:^1.0.7" + isarray: "npm:^2.0.5" + stop-iteration-iterator: "npm:^1.0.0" + checksum: ebd11effa79851ea75d7f079405f9d0dc185559fd65d986c6afea59a0ff2d46c2ed8675f19f03dce7429d7f6c14ff9aede8d121fbab78d75cfda6a263030bac0 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.1 + resolution: "es-set-tostringtag@npm:2.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + has: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.0" + checksum: 9af096365e3861bb29755cc5f76f15f66a7eab0e83befca396129090c1d9737e54090278b8e5357e97b5f0a5b0459fca07c40c6740884c2659cbf90ef8e508cc + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0": + version: 1.0.0 + resolution: "es-shim-unscopables@npm:1.0.0" + dependencies: + has: "npm:^1.0.3" + checksum: d54a66239fbd19535b3e50333913260394f14d2d7adb136a95396a13ca584bab400cf9cb2ffd9232f3fe2f0362540bd3a708240c493e46e13fe0b90cfcfedc3d + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: "npm:^1.1.4" + is-date-object: "npm:^1.0.1" + is-symbol: "npm:^1.0.2" + checksum: 0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: afd02e6ca91ffa813e1108b5e7756566173d6bc0d1eb951cb44d6b21702ec17c1cf116cfe75d4a2b02e05acb0b808a7a9387d0d1ca5cf9c04ad03a8445c3e46d + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-config-airbnb-base@npm:^15.0.0": + version: 15.0.0 + resolution: "eslint-config-airbnb-base@npm:15.0.0" + dependencies: + confusing-browser-globals: "npm:^1.0.10" + object.assign: "npm:^4.1.2" + object.entries: "npm:^1.1.5" + semver: "npm:^6.3.0" + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + checksum: 93639d991654414756f82ad7860aac30b0dc6797277b7904ddb53ed88a32c470598696bbc6c503e066414024d305221974d3769e6642de65043bedf29cbbd30f + languageName: node + linkType: hard + +"eslint-config-airbnb-typescript@npm:^17.0.0": + version: 17.0.0 + resolution: "eslint-config-airbnb-typescript@npm:17.0.0" + dependencies: + eslint-config-airbnb-base: "npm:^15.0.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^5.13.0 + "@typescript-eslint/parser": ^5.0.0 + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + checksum: 9a8ce73c5a52ff1f82842ff95fca9313bb826ade8733d2dc25aa65781969282a5825fb5ac1b89c9d2e18da439aa3dc03486c2c405158559d0b1400e08593557e + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^8.5.0": + version: 8.8.0 + resolution: "eslint-config-prettier@npm:8.8.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 9e3bb602184b7ec59239d2f901b1594cd7cc59ff38c3ddcd812137817e50840f4d65d62b61c515c7eae86d85f8b6fb2ebda659a3f83b2f2c5da75feb15531508 + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.7": + version: 0.3.7 + resolution: "eslint-import-resolver-node@npm:0.3.7" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.11.0" + resolve: "npm:^1.22.1" + checksum: 39c562b59ec8dfd6b85ffa52273dbf0edb661b616463e2c453c60b2398b0a76f268f15f949a1648046c9c996d29599b57f6266df4b5d3562bff1088ded3672d5 + languageName: node + linkType: hard + +"eslint-import-resolver-typescript@npm:^3.5.5": + version: 3.5.5 + resolution: "eslint-import-resolver-typescript@npm:3.5.5" + dependencies: + debug: "npm:^4.3.4" + enhanced-resolve: "npm:^5.12.0" + eslint-module-utils: "npm:^2.7.4" + get-tsconfig: "npm:^4.5.0" + globby: "npm:^13.1.3" + is-core-module: "npm:^2.11.0" + is-glob: "npm:^4.0.3" + synckit: "npm:^0.8.5" + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + checksum: 6cdbfae5be1087b2f18fd82939697f085a9b766e518494c45efd84b3eba3e2640f00e155b824cff4d1d9d518b46cc86082e7c72a37c784b22f5064d55c634724 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.7.4": + version: 2.8.0 + resolution: "eslint-module-utils@npm:2.8.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: c7a8d1a58d76ec8217a8fea49271ec8132d1b9390965a75f6a4ecbc9e5983d742195b46d2e4378231d2186801439fe1aa5700714b0bfd4eb17aac6e1b65309df + languageName: node + linkType: hard + +"eslint-plugin-eslint-comments@npm:^3.2.0": + version: 3.2.0 + resolution: "eslint-plugin-eslint-comments@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + ignore: "npm:^5.0.5" + peerDependencies: + eslint: ">=4.19.1" + checksum: c71db824592dc8ea498021572a0bd33d763ef26126bdb3b84a027ca75a1adbe0894ec95024f7de39ef12308560e62cbf8af0d06ffe472be5ba8bd9169c928e96 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.27.5": + version: 2.27.5 + resolution: "eslint-plugin-import@npm:2.27.5" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + array.prototype.flatmap: "npm:^1.3.1" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.7" + eslint-module-utils: "npm:^2.7.4" + has: "npm:^1.0.3" + is-core-module: "npm:^2.11.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.values: "npm:^1.1.6" + resolve: "npm:^1.22.1" + semver: "npm:^6.3.0" + tsconfig-paths: "npm:^3.14.1" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: e561e79889ad3c662e305ca9a9b273a5baf8f492dad8198e42987efc4f0532c0d49caee206e78e057cec3365b36f9cef8340915e9f08adec5f29c9d631e6f691 + languageName: node + linkType: hard + +"eslint-plugin-jest@npm:^27.2.1": + version: 27.2.1 + resolution: "eslint-plugin-jest@npm:27.2.1" + dependencies: + "@typescript-eslint/utils": "npm:^5.10.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^5.0.0 + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + jest: + optional: true + checksum: eaa298ddcae3f28b0989207d50e8cece0399283e3c1664f8686f6ff6a9dabee637e8e5f77278e319389d808cdc94f7de49a5705ce3d2fbc0a782ae3cd06ec17c + languageName: node + linkType: hard + +"eslint-plugin-jsx-a11y@npm:^6.5.1": + version: 6.7.1 + resolution: "eslint-plugin-jsx-a11y@npm:6.7.1" + dependencies: + "@babel/runtime": "npm:^7.20.7" + aria-query: "npm:^5.1.3" + array-includes: "npm:^3.1.6" + array.prototype.flatmap: "npm:^1.3.1" + ast-types-flow: "npm:^0.0.7" + axe-core: "npm:^4.6.2" + axobject-query: "npm:^3.1.1" + damerau-levenshtein: "npm:^1.0.8" + emoji-regex: "npm:^9.2.2" + has: "npm:^1.0.3" + jsx-ast-utils: "npm:^3.3.3" + language-tags: "npm:=1.0.5" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.6" + object.fromentries: "npm:^2.0.6" + semver: "npm:^6.3.0" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: 41ad3d0c8036b36cd475685c1ad639157f403b16e8ac23c07f1dbe0226ccf8458f2805cbd5cc8e56856a5d8a356f3276e3139274d819476ccad80c41b9245502 + languageName: node + linkType: hard + +"eslint-plugin-monorepo-cop@npm:^1.0.2": + version: 1.0.2 + resolution: "eslint-plugin-monorepo-cop@npm:1.0.2" + dependencies: + read-pkg-up: "npm:^6.0.0" + requireindex: "npm:~1.1.0" + checksum: 393d32aaa1d47fa57db46b452a33286c6f76bc2d2a7a0d2a368cacd07cd67a4f395a658159927f98b73c9ee4d1155492f699c9e01d3cec68a5781d53f5f6184e + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-plugin-prettier@npm:4.2.1" + dependencies: + prettier-linter-helpers: "npm:^1.0.0" + peerDependencies: + eslint: ">=7.28.0" + prettier: ">=2.0.0" + peerDependenciesMeta: + eslint-config-prettier: + optional: true + checksum: c5e7316baeab9d96ac39c279f16686e837277e5c67a8006c6588bcff317edffdc1532fb580441eb598bc6770f6444006756b68a6575dff1cd85ebe227252d0b7 + languageName: node + linkType: hard + +"eslint-plugin-promise@npm:^6.1.1": + version: 6.1.1 + resolution: "eslint-plugin-promise@npm:6.1.1" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: ec705741c110cd1cb4d702776e1c7f7fe60b671b71f706c88054ab443cf2767aae5a663928fb426373ba1095eaeda312a740a4f880546631f0e0727f298b3393 + languageName: node + linkType: hard + +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.0": + version: 7.2.0 + resolution: "eslint-scope@npm:7.2.0" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 5b48a3cc2485a3a58ca0bdecfb557c349009308a9b2afb24d070b1c0c254d445ee86d78bfee2c4ed6d1b8944307604a987c92f6d7e611e29de5d06256747a0ff + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": + version: 3.4.1 + resolution: "eslint-visitor-keys@npm:3.4.1" + checksum: b4ebd35aed5426cd81b1fb92487825f1acf47a31e91d76597a3ee0664d69627140c4dafaf9b319cfeb1f48c1113a393e21a734c669e6565a72e6fcc311bd9911 + languageName: node + linkType: hard + +"eslint@npm:^8.17.0": + version: 8.41.0 + resolution: "eslint@npm:8.41.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.4.0" + "@eslint/eslintrc": "npm:^2.0.3" + "@eslint/js": "npm:8.41.0" + "@humanwhocodes/config-array": "npm:^0.11.8" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + ajv: "npm:^6.10.0" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.0" + eslint-visitor-keys: "npm:^3.4.1" + espree: "npm:^9.5.2" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.0.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.1" + strip-ansi: "npm:^6.0.1" + strip-json-comments: "npm:^3.1.0" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: d71832b235bebaa67c09019dee32bf8393c5e12155e91131c4606670eb9836fbff31e11364408258cb75e2bde8a4dfa0c042aa6145bb23cd800a42e63ca4a035 + languageName: node + linkType: hard + +"espree@npm:^9.5.2": + version: 9.5.2 + resolution: "espree@npm:9.5.2" + dependencies: + acorn: "npm:^8.8.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 6885e57b3dcea3f65211403a10077a80a57f03e6c8b45c1e1db4bc5958e0fdb5c358819c88898ea67655d25fb646836182f688156e124a05610e714d3fcb6822 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"eventemitter3@npm:^4.0.4": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b + languageName: node + linkType: hard + +"execa@npm:^4.0.0": + version: 4.1.0 + resolution: "execa@npm:4.1.0" + dependencies: + cross-spawn: "npm:^7.0.0" + get-stream: "npm:^5.0.0" + human-signals: "npm:^1.1.1" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.0" + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + strip-final-newline: "npm:^2.0.0" + checksum: 02211601bb1c52710260edcc68fb84c3c030dc68bafc697c90ada3c52cc31375337de8c24826015b8382a58d63569ffd203b79c94fef217d65503e3e8d2c52ba + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"execa@npm:^7.0.0, execa@npm:^7.1.1": + version: 7.1.1 + resolution: "execa@npm:7.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.1" + human-signals: "npm:^4.3.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^3.0.7" + strip-final-newline: "npm:^3.0.0" + checksum: 0da5ee1c895b62142bc3d1567d1974711c28c2cfa6bae96e1923379bd597e476d762a13f282f92815d8ebfa33407949634fa32a0d6db8334a20e625fe11d4351 + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 + languageName: node + linkType: hard + +"expect@npm:^29.0.0, expect@npm:^29.5.0": + version: 29.5.0 + resolution: "expect@npm:29.5.0" + dependencies: + "@jest/expect-utils": "npm:^29.5.0" + jest-get-type: "npm:^29.4.3" + jest-matcher-utils: "npm:^29.5.0" + jest-message-util: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + checksum: 3c9382967217ad1453e9271e0da3f83c4aeb12272968007b90fc5873340e7fb64bf4852e1522bdf27556623d031ce62f82aaac09e485a15c6d0589d50999422d + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"extend@npm:~3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 + languageName: node + linkType: hard + +"external-editor@npm:^3.0.3": + version: 3.1.0 + resolution: "external-editor@npm:3.1.0" + dependencies: + chardet: "npm:^0.7.0" + iconv-lite: "npm:^0.4.24" + tmp: "npm:^0.0.33" + checksum: c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 + languageName: node + linkType: hard + +"extsprintf@npm:1.3.0": + version: 1.3.0 + resolution: "extsprintf@npm:1.3.0" + checksum: f75114a8388f0cbce68e277b6495dc3930db4dde1611072e4a140c24e204affd77320d004b947a132e9a3b97b8253017b2b62dce661975fb0adced707abf1ab5 + languageName: node + linkType: hard + +"extsprintf@npm:^1.2.0": + version: 1.4.1 + resolution: "extsprintf@npm:1.4.1" + checksum: e10e2769985d0e9b6c7199b053a9957589d02e84de42832c295798cb422a025e6d4a92e0259c1fb4d07090f5bfde6b55fd9f880ac5855bd61d775f8ab75a7ab0 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 08604fb8ef6442ce74068bef3c3104382bb1f5ab28cf75e4ee904662778b60ad620e1405e692b7edea598ef445f5d387827a965ba034e1892bf54b1dfde97f26 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: "npm:^1.0.4" + checksum: 5ce4f83afa5f88c9379e67906b4d31bc7694a30826d6cc8d0f0473c966929017fda65c2174b0ec89f064ede6ace6c67f8a4fe04cef42119b6a55b0d465554c24 + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: "npm:2.1.1" + checksum: feae89ac148adb8f6ae8ccd87632e62b13563e6fb114cacb5265c51f585b17e2e268084519fb2edd133872f1d47a18e6bfd7e5e08625c0d41b93149694187581 + languageName: node + linkType: hard + +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + languageName: node + linkType: hard + +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: 071e0886b2b50238ca5026c5bbf58c26a7c1a1f720773b8c7813d16ba93d0200de977af14ac143c5ac18f666b2cfc83073f3a5fe6a4e996c49e0863d5500fccf + languageName: node + linkType: hard + +"find-up@npm:^2.0.0": + version: 2.1.0 + resolution: "find-up@npm:2.1.0" + dependencies: + locate-path: "npm:^2.0.0" + checksum: c080875c9fe28eb1962f35cbe83c683796a0321899f1eed31a37577800055539815de13d53495049697d3ba313013344f843bb9401dd337a1b832be5edfc6840 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.0.4 + resolution: "flat-cache@npm:3.0.4" + dependencies: + flatted: "npm:^3.1.0" + rimraf: "npm:^3.0.2" + checksum: f274dcbadb09ad8d7b6edf2ee9b034bc40bf0c12638f6c4084e9f1d39208cb104a5ebbb24b398880ef048200eaa116852f73d2d8b72e8c9627aba8c3e27ca057 + languageName: node + linkType: hard + +"flatted@npm:^3.1.0": + version: 3.2.7 + resolution: "flatted@npm:3.2.7" + checksum: 207a87c7abfc1ea6928ea16bac84f9eaa6d44d365620ece419e5c41cf44a5e9902b4c1f59c9605771b10e4565a0cb46e99d78e0464e8aabb42c97de880642257 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: "npm:^1.1.3" + checksum: 22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + languageName: node + linkType: hard + +"forever-agent@npm:~0.6.1": + version: 0.6.1 + resolution: "forever-agent@npm:0.6.1" + checksum: 364f7f5f7d93ab661455351ce116a67877b66f59aca199559a999bd39e3cfadbfbfacc10415a915255e2210b30c23febe9aec3ca16bf2d1ff11c935a1000e24c + languageName: node + linkType: hard + +"form-data@npm:~2.3.2": + version: 2.3.3 + resolution: "form-data@npm:2.3.3" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.6" + mime-types: "npm:^2.1.12" + checksum: 706ef1e5649286b6a61e5bb87993a9842807fd8f149cd2548ee807ea4fb882247bdf7f6e64ac4720029c0cd5c80343de0e22eee1dc9e9882e12db9cc7bc016a4 + languageName: node + linkType: hard + +"fs-extra@npm:^11.0.0": + version: 11.1.1 + resolution: "fs-extra@npm:11.1.1" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: a2480243d7dcfa7d723c5f5b24cf4eba02a6ccece208f1524a2fbde1c629492cfb9a59e4b6d04faff6fbdf71db9fdc8ef7f396417a02884195a625f5d8dc9427 + languageName: node + linkType: hard + +"fs-extra@npm:^9.1.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: "npm:^1.0.0" + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 + languageName: node + linkType: hard + +"fs-minipass@npm:^1.2.7": + version: 1.2.7 + resolution: "fs-minipass@npm:1.2.7" + dependencies: + minipass: "npm:^2.6.0" + checksum: c8259ce8caab360f16b8c3774fd09dd1d5240d6f3f78fd8efa0a215b5f40edfa90e7b5b5ddc2335a4c50885e29d5983f9fe6ac3ac19320e6917a21dbb9f05c64 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: "npm:latest" + checksum: be78a3efa3e181cda3cf7a4637cb527bcebb0bd0ea0440105a3bb45b86f9245b307dc10a2507e8f4498a7d4ec349d1910f4d73e4d4495b16103106e07eee735b + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: 60b74b2407e1942e1ed7f8c284f8ef714d0689dcfce5319985a5b7da3fc727f40b4a59ec72dc55aa83365ad7b8fa4fac3a30d93c850a2b452f29ae03dbc10a1e + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.19.0" + functions-have-names: "npm:^1.2.2" + checksum: b75fb8c5261f03a54f7cb53a8c99e0c40297efc3cf750c51d3a2e56f6741701c14eda51986d30c24063136a4c32d1643df9d1dd2f2a14b64fa011edd3e7117ae + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + languageName: node + linkType: hard + +"gauge@npm:~2.7.3": + version: 2.7.4 + resolution: "gauge@npm:2.7.4" + dependencies: + aproba: "npm:^1.0.3" + console-control-strings: "npm:^1.0.0" + has-unicode: "npm:^2.0.0" + object-assign: "npm:^4.1.0" + signal-exit: "npm:^3.0.0" + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + wide-align: "npm:^1.1.0" + checksum: d606346e2e47829e0bc855d0becb36c4ce492feabd61ae92884b89e07812dd8a67a860ca30ece3a4c2e9f2c73bd68ba2b8e558ed362432ffd86de83c08847f84 + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": + version: 1.2.1 + resolution: "get-intrinsic@npm:1.2.1" + dependencies: + function-bind: "npm:^1.1.1" + has: "npm:^1.0.3" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + checksum: 49eab47f9de8f1a4f9b458b8b74ee5199fb2614414a91973eb175e07db56b52b6df49b255cc7ff704cb0786490fb93bfe8f2ad138b590a8de09b47116a366bc9 + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be + languageName: node + linkType: hard + +"get-pkg-repo@npm:^4.0.0": + version: 4.2.1 + resolution: "get-pkg-repo@npm:4.2.1" + dependencies: + "@hutson/parse-repository-url": "npm:^3.0.0" + hosted-git-info: "npm:^4.0.0" + through2: "npm:^2.0.0" + yargs: "npm:^16.2.0" + bin: + get-pkg-repo: src/cli.js + checksum: 1338d2e048a594da4a34e7dd69d909376d72784f5ba50963a242b4b35db77533786f618b3f6a9effdee2af20af4917a3b7cf12533b4575d7f9c163886be1fb62 + languageName: node + linkType: hard + +"get-port@npm:^5.1.1": + version: 5.1.1 + resolution: "get-port@npm:5.1.1" + checksum: 2873877a469b24e6d5e0be490724a17edb39fafc795d1d662e7bea951ca649713b4a50117a473f9d162312cb0e946597bd0e049ed2f866e79e576e8e213d3d1c + languageName: node + linkType: hard + +"get-stream@npm:^5.0.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.1" + checksum: 23bc3b44c221cdf7669a88230c62f4b9e30393b61eb21ba4400cb3e346801bd8f95fe4330ee78dbae37aecd874646d53e3e76a17a654d0c84c77f6690526d6bb + languageName: node + linkType: hard + +"get-tsconfig@npm:^4.5.0": + version: 4.6.0 + resolution: "get-tsconfig@npm:4.6.0" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 6480197512fc97e4bc049fc23943d78ef5f034e6a3c7c7dbc1d16d8a2091aa08b72122ebf29c2dc815842266f966cf0c12000dc9151e632296feb9e1a285b854 + languageName: node + linkType: hard + +"getpass@npm:^0.1.1": + version: 0.1.7 + resolution: "getpass@npm:0.1.7" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: c13f8530ecf16fc509f3fa5cd8dd2129ffa5d0c7ccdf5728b6022d52954c2d24be3706b4cdf15333eec52f1fbb43feb70a01dabc639d1d10071e371da8aaa52f + languageName: node + linkType: hard + +"git-raw-commits@npm:^2.0.11, git-raw-commits@npm:^2.0.8": + version: 2.0.11 + resolution: "git-raw-commits@npm:2.0.11" + dependencies: + dargs: "npm:^7.0.0" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + split2: "npm:^3.0.0" + through2: "npm:^4.0.0" + bin: + git-raw-commits: cli.js + checksum: c9cee7ce11a6703098f028d7e47986d5d3e4147d66640086734d6ee2472296b8711f91b40ad458e95acac1bc33cf2898059f1dc890f91220ff89c5fcc609ab64 + languageName: node + linkType: hard + +"git-remote-origin-url@npm:^2.0.0": + version: 2.0.0 + resolution: "git-remote-origin-url@npm:2.0.0" + dependencies: + gitconfiglocal: "npm:^1.0.0" + pify: "npm:^2.3.0" + checksum: 3a846ce98ed36b2d0b801e8ec1ab299a236cfc6fa264bfdf9f42301abfdfd8715c946507fd83a10b9db449eb609ac6f8a2a341daf52e3af0000367487f486355 + languageName: node + linkType: hard + +"git-semver-tags@npm:^4.1.1": + version: 4.1.1 + resolution: "git-semver-tags@npm:4.1.1" + dependencies: + meow: "npm:^8.0.0" + semver: "npm:^6.0.0" + bin: + git-semver-tags: cli.js + checksum: cd8c91c666901f8dd6381f4cef2aec32aa3f39e517bd8d8491f9133adf956dde9e0487d510fa0f12042fa474f21a8a88b4aa56db8b473979c7491109c57b7016 + languageName: node + linkType: hard + +"git-up@npm:^4.0.0": + version: 4.0.5 + resolution: "git-up@npm:4.0.5" + dependencies: + is-ssh: "npm:^1.3.0" + parse-url: "npm:^6.0.0" + checksum: 8141b99734ed64f21946c3645324ebad010dd83d1e9f8fe1230686604ded8376cda9ae7859500712f576fe281d61edba955f11a8e63ba1e1813208e1fdcf6813 + languageName: node + linkType: hard + +"git-url-parse@npm:^11.4.4": + version: 11.6.0 + resolution: "git-url-parse@npm:11.6.0" + dependencies: + git-up: "npm:^4.0.0" + checksum: 63786d71b7eb86e21a570ff3f3087c26f0b8e16de024b5dffd03556688ec418943e4a638769925eb7265b21be2aade59c77205fcd026b49aba432a5a2150e497 + languageName: node + linkType: hard + +"gitconfiglocal@npm:^1.0.0": + version: 1.0.0 + resolution: "gitconfiglocal@npm:1.0.0" + dependencies: + ini: "npm:^1.3.2" + checksum: cfcb16344834113199f209f2758ced778dc30e075ddb49b5dde659b4dd2deadee824db0a1b77e1303cb594d9e8b2240da18c67705f657aa76affb444aa349005 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.1, glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.5" + minimatch: "npm:^9.0.1" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry: "npm:^1.10.1" + bin: + glob: dist/esm/bin.mjs + checksum: 13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + languageName: node + linkType: hard + +"glob@npm:^7.0.0, glob@npm:^7.0.5, glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"global-dirs@npm:^0.1.1": + version: 0.1.1 + resolution: "global-dirs@npm:0.1.1" + dependencies: + ini: "npm:^1.3.4" + checksum: 3608072e58962396c124ad5a1cfb3f99ee76c998654a3432d82977b3c3eeb09dc8a5a2a9849b2b8113906c8d0aad89ce362c22e97cec5fe34405bbf4f3cdbe7a + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.20.0 + resolution: "globals@npm:13.20.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 9a028f136f1e7a3574689f430f7d57faa0d699c4c7e92ade00b02882a892be31c314d50dff07b48e607283013117bb8a997406d03a1f7ab4a33a005eb16efd6c + languageName: node + linkType: hard + +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: "npm:^1.1.3" + checksum: 0db6e9af102a5254630351557ac15e6909bc7459d3e3f6b001e59fe784c96d31108818f032d9095739355a88467459e6488ff16584ee6250cd8c27dec05af4b0 + languageName: node + linkType: hard + +"globby@npm:^11.0.2, globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 + languageName: node + linkType: hard + +"globby@npm:^13.1.3": + version: 13.1.4 + resolution: "globby@npm:13.1.4" + dependencies: + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.11" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: cbf4ce32ea7fba37be8c4749a2f69c2803b70a57e40a968b57343cc74daced8c87a7cdea038f69eda95fe17df8ebf75346d18e188c2bc4948f081bbbc655c323 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: 505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"grapheme-splitter@npm:^1.0.4": + version: 1.0.4 + resolution: "grapheme-splitter@npm:1.0.4" + checksum: 108415fb07ac913f17040dc336607772fcea68c7f495ef91887edddb0b0f5ff7bc1d1ab181b125ecb2f0505669ef12c9a178a3bbd2dd8e042d8c5f1d7c90331a + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"handlebars@npm:^4.7.7": + version: 4.7.7 + resolution: "handlebars@npm:4.7.7" + dependencies: + minimist: "npm:^1.2.5" + neo-async: "npm:^2.6.0" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 4c0913fc0018a2a2e358ee94e4fe83f071762b8bec51a473d187e6642e94e569843adcf550ffe329554c63ad450c062f3a05447bd2e3fff5ebfe698e214225c6 + languageName: node + linkType: hard + +"har-schema@npm:^2.0.0": + version: 2.0.0 + resolution: "har-schema@npm:2.0.0" + checksum: 3856cb76152658e0002b9c2b45b4360bb26b3e832c823caed8fcf39a01096030bf09fa5685c0f7b0f2cb3ecba6e9dce17edaf28b64a423d6201092e6be56e592 + languageName: node + linkType: hard + +"har-validator@npm:~5.1.3": + version: 5.1.5 + resolution: "har-validator@npm:5.1.5" + dependencies: + ajv: "npm:^6.12.3" + har-schema: "npm:^2.0.0" + checksum: f1d606eb1021839e3a905be5ef7cca81c2256a6be0748efb8fefc14312214f9e6c15d7f2eaf37514104071207d84f627b68bb9f6178703da4e06fbd1a0649a5e + languageName: node + linkType: hard + +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: febc3343a1ad575aedcc112580835b44a89a89e01f400b4eda6e8110869edfdab0b00cd1bd4c3bfec9475a57e79e0b355aecd5be46454b6a62b9a359af60e564 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.1.1" + checksum: d4ca882b6960d6257bd28baa3ddfa21f068d260411004a093b30ca357c740e11e985771c85216a6d1eef4161e862657f48c4758ec8ab515223b3895200ad164b + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: c8a8fe411f810b23a564bd5546a8f3f0fff6f1b692740eb7a2fdc9df716ef870040806891e2f23ff4653f1083e3895bf12088703dd1a0eac3d9202d3a4768cd0 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-tostringtag@npm:1.0.0" + dependencies: + has-symbols: "npm:^1.0.2" + checksum: 1cdba76b7d13f65198a92b8ca1560ba40edfa09e85d182bf436d928f3588a9ebd260451d569f0ed1b849c4bf54f49c862aa0d0a77f9552b1855bb6deb526c011 + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.0, has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: "npm:^1.1.1" + checksum: e1da0d2bd109f116b632f27782cf23182b42f14972ca9540e4c5aa7e52647407a0a4a76937334fddcb56befe94a3494825ec22b19b51f5e5507c3153fd1a5e1b + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + +"hosted-git-info@npm:^4.0.0, hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" + dependencies: + lru-cache: "npm:^6.0.0" + checksum: 150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^4.0.1": + version: 4.0.1 + resolution: "http-proxy-agent@npm:4.0.1" + dependencies: + "@tootallnate/once": "npm:1" + agent-base: "npm:6" + debug: "npm:4" + checksum: 4fa4774d65b5331814b74ac05cefea56854fc0d5989c80b13432c1b0d42a14c9f4342ca3ad9f0359a52e78da12b1744c9f8a28e50042136ea9171675d972a5fd + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: a11574ff39436cee3c7bc67f259444097b09474605846ddd8edf0bf4ad8644be8533db1aa463426e376865047d05dc22755e638632819317c0c2f1b2196657c8 + languageName: node + linkType: hard + +"http-signature@npm:~1.2.0": + version: 1.2.0 + resolution: "http-signature@npm:1.2.0" + dependencies: + assert-plus: "npm:^1.0.0" + jsprim: "npm:^1.2.2" + sshpk: "npm:^1.7.0" + checksum: 582f7af7f354429e1fb19b3bbb9d35520843c69bb30a25b88ca3c5c2c10715f20ae7924e20cffbed220b1d3a726ef4fe8ccc48568d5744db87be9a79887d6733 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 7735eb90073db087e7e79312e3d97c8c04baf7ea7ca7b013382b6a45abbaa61b281041a98f4e13c8c80d88f843785bcc84ba189165b4b4087b1e3496ba656d77 + languageName: node + linkType: hard + +"human-signals@npm:^1.1.1": + version: 1.1.1 + resolution: "human-signals@npm:1.1.1" + checksum: 18810ed239a7a5e23fb6c32d0fd4be75d7cd337a07ad59b8dbf0794cb0761e6e628349ee04c409e605fe55344716eab5d0a47a62ba2a2d0d367c89a2b4247b1e + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"human-signals@npm:^4.3.0": + version: 4.3.1 + resolution: "human-signals@npm:4.3.1" + checksum: 40498b33fe139f5cc4ef5d2f95eb1803d6318ac1b1c63eaf14eeed5484d26332c828de4a5a05676b6c83d7b9e57727c59addb4b1dea19cb8d71e83689e5b336c + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: "npm:^2.0.0" + checksum: f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a + languageName: node + linkType: hard + +"husky@npm:^8.0.3": + version: 8.0.3 + resolution: "husky@npm:8.0.3" + bin: + husky: lib/bin.js + checksum: 6722591771c657b91a1abb082e07f6547eca79144d678e586828ae806499d90dce2a6aee08b66183fd8b085f19d20e0990a2ad396961746b4c8bd5bdb619d668 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ignore-walk@npm:^3.0.3": + version: 3.0.4 + resolution: "ignore-walk@npm:3.0.4" + dependencies: + minimatch: "npm:^3.0.4" + checksum: 690372b433887796fa3badd25babab7daf60a1882259dcc130ec78eea79745c2416322e10d1a96b367071204471c532647d20b11cd7ab70bd9b49879e461f956 + languageName: node + linkType: hard + +"ignore@npm:^5.0.5, ignore@npm:^5.1.4, ignore@npm:^5.2.0": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 7c7cd90edd9fea6e037f9b9da4b01bf0a86b198ce78345f9bbd983929d68ff14830be31111edc5d70c264921f4962404d75b7262b4d9cc3bc12381eccbd03096 + languageName: node + linkType: hard + +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: c67ecea72f775fe8684ca3d057e54bdb2ae28c14bf261d2607c269c18ea0da7b730924c06262eca9aed4b8ab31e31d65bc60b50e7296c85908a56e2f7d41ecd2 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: a7b241e3149c26e37474e3435779487f42f36883711f198c45794703c7556bc38af224088bd4d1a221a45b8208ae2c2bcf86200383621434d0c099304481c5b9 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.1, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ini@npm:^1.3.2, ini@npm:^1.3.4": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + +"init-package-json@npm:^2.0.2": + version: 2.0.5 + resolution: "init-package-json@npm:2.0.5" + dependencies: + npm-package-arg: "npm:^8.1.5" + promzard: "npm:^0.3.0" + read: "npm:~1.0.1" + read-package-json: "npm:^4.1.1" + semver: "npm:^7.3.5" + validate-npm-package-license: "npm:^3.0.4" + validate-npm-package-name: "npm:^3.0.0" + checksum: 6a0b3971b7154b3fc7802675e54deba58da7165b66e7527abed7b1af856dbccccedf1fd2f212ab6308f33a5c1edae0a7f01d53ec4986930c2706623c3ebe0492 + languageName: node + linkType: hard + +"inquirer@npm:^7.3.3": + version: 7.3.3 + resolution: "inquirer@npm:7.3.3" + dependencies: + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^3.0.0" + external-editor: "npm:^3.0.3" + figures: "npm:^3.0.0" + lodash: "npm:^4.17.19" + mute-stream: "npm:0.0.8" + run-async: "npm:^2.4.0" + rxjs: "npm:^6.6.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + through: "npm:^2.3.6" + checksum: 96e75974cfd863fe6653c075e41fa5f1a290896df141189816db945debabcd92d3277145f11aef8d2cfca5409ab003ccdd18a099744814057b52a2f27aeb8c94 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5": + version: 1.0.5 + resolution: "internal-slot@npm:1.0.5" + dependencies: + get-intrinsic: "npm:^1.2.0" + has: "npm:^1.0.3" + side-channel: "npm:^1.0.4" + checksum: 66d8a66b4b5310c042e8ad00ce895dc55cb25165a3a7da0d7862ca18d69d3b1ba86511b4bf3baf4273d744d3f6e9154574af45189ef11135a444945309e39e4a + languageName: node + linkType: hard + +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 08c5ad30032edeec638485bc3f6db7d0094d9b3e85e0f950866600af3c52e9fd69715416d29564731c479d9f4d43ff3e4d302a178196bdc0e6837ec147640450 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: 8d186cc5585f57372847ae29b6eba258c68862055e18a75cc4933327232cb5c107f89800ce29715d542eef2c254fbb68b382e780a7414f9ee7caf60b7a473958 + languageName: node + linkType: hard + +"is-arguments@npm:^1.1.1": + version: 1.1.1 + resolution: "is-arguments@npm:1.1.1" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 5ff1f341ee4475350adfc14b2328b38962564b7c2076be2f5bac7bd9b61779efba99b9f844a7b82ba7654adccf8e8eb19d1bb0cc6d1c1a085e498f6793d4328f + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.0" + is-typed-array: "npm:^1.1.10" + checksum: 40ed13a5f5746ac3ae2f2e463687d9b5a3f5fd0086f970fb4898f0253c2a5ec2e3caea2d664dd8f54761b1c1948609702416921a22faebe160c7640a9217c80e + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: "npm:^1.0.1" + checksum: eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + languageName: node + linkType: hard + +"is-ci@npm:^2.0.0": + version: 2.0.0 + resolution: "is-ci@npm:2.0.0" + dependencies: + ci-info: "npm:^2.0.0" + bin: + is-ci: bin.js + checksum: 17de4e2cd8f993c56c86472dd53dd9e2c7f126d0ee55afe610557046cdd64de0e8feadbad476edc9eeff63b060523b8673d9094ed2ab294b59efb5a66dd05a9a + languageName: node + linkType: hard + +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.5.0": + version: 2.12.1 + resolution: "is-core-module@npm:2.12.1" + dependencies: + has: "npm:^1.0.3" + checksum: ff1d0dfc0b7851310d289398e416eb92ae8a9ac7ea8b8b9737fa8c0725f5a78c5f3db6edd4dff38c9ed731f3aaa1f6410a320233fcb52a2c8f1cf58eebf10a4b + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e + languageName: node + linkType: hard + +"is-docker@npm:^2.0.0": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc + languageName: node + linkType: hard + +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: "npm:^1.0.0" + checksum: 12acfcf16142f2d431bf6af25d68569d3198e81b9799b4ae41058247aafcc666b0127d64384ea28e67a746372611fcbe9b802f69175287aba466da3eddd5ba0f + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^4.0.0": + version: 4.0.0 + resolution: "is-fullwidth-code-point@npm:4.0.0" + checksum: df2a717e813567db0f659c306d61f2f804d480752526886954a2a3e2246c7745fd07a52b5fecf2b68caf0a6c79dcdace6166fdf29cc76ed9975cc334f0a018b8 + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: 2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"is-map@npm:^2.0.1, is-map@npm:^2.0.2": + version: 2.0.2 + resolution: "is-map@npm:2.0.2" + checksum: 119ff9137a37fd131a72fab3f4ab8c9d6a24b0a1ee26b4eff14dc625900d8675a97785eea5f4174265e2006ed076cc24e89f6e57ebd080a48338d914ec9168a5 + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: eda024c158f70f2017f3415e471b818d314da5ef5be68f801b16314d4a4b6304a74cbed778acf9e2f955bb9c1c5f2935c1be0c7c99e1ad12286f45366217b6a3 + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-obj@npm:^2.0.0": + version: 2.0.0 + resolution: "is-obj@npm:2.0.0" + checksum: 85044ed7ba8bd169e2c2af3a178cacb92a97aa75de9569d02efef7f443a824b5e153eba72b9ae3aca6f8ce81955271aa2dc7da67a8b720575d3e38104208cb4e + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.0.0, is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c + languageName: node + linkType: hard + +"is-plain-obj@npm:^2.0.0": + version: 2.1.0 + resolution: "is-plain-obj@npm:2.1.0" + checksum: e5c9814cdaa627a9ad0a0964ded0e0491bfd9ace405c49a5d63c88b30a162f1512c069d5b80997893c4d0181eadc3fed02b4ab4b81059aba5620bfcdfdeb9c53 + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: "npm:^3.0.1" + checksum: f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 + languageName: node + linkType: hard + +"is-set@npm:^2.0.1, is-set@npm:^2.0.2": + version: 2.0.2 + resolution: "is-set@npm:2.0.2" + checksum: 5f8bd1880df8c0004ce694e315e6e1e47a3452014be792880bb274a3b2cdb952fdb60789636ca6e084c7947ca8b7ae03ccaf54c93a7fcfed228af810559e5432 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: cfeee6f171f1b13e6cbc6f3b6cc44e192b93df39f3fcb31aa66ffb1d2df3b91e05664311659f9701baba62f5e98c83b0673c628e7adc30f55071c4874fcdccec + languageName: node + linkType: hard + +"is-ssh@npm:^1.3.0": + version: 1.4.0 + resolution: "is-ssh@npm:1.4.0" + dependencies: + protocols: "npm:^2.0.1" + checksum: 3eb30d1bcb4507cd25562e7ac61a1c0aa31772134c67cec9c3afe6f4d57ec17e8c2892600a608e8e583f32f53f36465b8968c0305f2855cfbff95acfd049e113 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: eb2f7127af02ee9aa2a0237b730e47ac2de0d4e76a4a905a50a11557f2339df5765eaea4ceb8029f1efa978586abe776908720bfcb1900c20c6ec5145f6f29d8 + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: "npm:^1.0.2" + checksum: 9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 + languageName: node + linkType: hard + +"is-text-path@npm:^1.0.1": + version: 1.0.1 + resolution: "is-text-path@npm:1.0.1" + dependencies: + text-extensions: "npm:^1.0.0" + checksum: 61c8650c29548febb6bf69e9541fc11abbbb087a0568df7bc471ba264e95fb254def4e610631cbab4ddb0a1a07949d06416f4ebeaf37875023fb184cdb87ee84 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": + version: 1.1.10 + resolution: "is-typed-array@npm:1.1.10" + dependencies: + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.0" + checksum: b71268a2e5f493f2b95af4cbfe7a65254a822f07d57f20c18f084347cd45f11810915fe37d7a6831fe4b81def24621a042fd1169ec558c50f830b591bc8c1f66 + languageName: node + linkType: hard + +"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.1": + version: 2.0.1 + resolution: "is-weakmap@npm:2.0.1" + checksum: 9c9fec9efa7bf5030a4a927f33fff2a6976b93646259f92b517d3646c073cc5b98283a162ce75c412b060a46de07032444b530f0a4c9b6e012ef8f1741c3a987 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.1": + version: 2.0.2 + resolution: "is-weakset@npm:2.0.2" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.1" + checksum: ef5136bd446ae4603229b897f73efd0720c6ab3ec6cc05c8d5c4b51aa9f95164713c4cad0a22ff1fedf04865ff86cae4648bc1d5eead4b6388e1150525af1cc1 + languageName: node + linkType: hard + +"is-wsl@npm:^2.2.0": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: "npm:^2.0.0" + checksum: a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e + languageName: node + linkType: hard + +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: 03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db + languageName: node + linkType: hard + +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: a6686a878735ca0a48e0d674dd6d8ad31aedfaf70f07920da16ceadc7577b46d67179a60b313f2e6860cb097a2c2eb3cbd0b89e921ae89199a59a17c3273d66f + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.0 + resolution: "istanbul-lib-coverage@npm:3.2.0" + checksum: 10ecb00a50cac2f506af8231ce523ffa1ac1310db0435c8ffaabb50c1d72539906583aa13c84f8835dc103998b9989edc3c1de989d2e2a96a91a9ba44e5db6b9 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^6.3.0" + checksum: 8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.0 + resolution: "istanbul-lib-report@npm:3.0.0" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^3.0.0" + supports-color: "npm:^7.1.0" + checksum: 81b0d5187c7603ed71bdea0b701a7329f8146549ca19aa26d91b4a163aea756f9d55c1a6dc1dcd087e24dfcb99baa69e266a68644fbfd5dc98107d6f6f5948d2 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.5 + resolution: "istanbul-reports@npm:3.1.5" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 3a147171bffdbd3034856410b6ec81637871d17d10986513328fec23df6b666f66bd08ea480f5b7a5b9f7e8abc30f3e3c2e7d1b661fc57cdc479aaaa677b1011 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-changed-files@npm:29.5.0" + dependencies: + execa: "npm:^5.0.0" + p-limit: "npm:^3.1.0" + checksum: 96334c78507a13c0f11f1360d893ade78fba7fd169825ca4acf7565156ceddd89b952be81c00378fa87ab642d3f44902c34a20f21b561e985e79f6e81fa7e9a8 + languageName: node + linkType: hard + +"jest-circus@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-circus@npm:29.5.0" + dependencies: + "@jest/environment": "npm:^29.5.0" + "@jest/expect": "npm:^29.5.0" + "@jest/test-result": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^0.7.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.5.0" + jest-matcher-utils: "npm:^29.5.0" + jest-message-util: "npm:^29.5.0" + jest-runtime: "npm:^29.5.0" + jest-snapshot: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.5.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 77f77b826941f67e9794e185072ee612cbddf53a1cfbf736de86176b7dc54e54aef151cf31b492adaef221f550924fd60dbaa01c9b939c3a4bfb46d8392c60a8 + languageName: node + linkType: hard + +"jest-cli@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-cli@npm:29.5.0" + dependencies: + "@jest/core": "npm:^29.5.0" + "@jest/test-result": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + jest-validate: "npm:^29.5.0" + prompts: "npm:^2.0.1" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: d63df7e329760bc036d11980883399de86b41a7fa93bbc2e79feef28284b096dec40afc21796504555ccbf32806bfc78cf64a63eac9093bb4f036b282b409863 + languageName: node + linkType: hard + +"jest-config@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-config@npm:29.5.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + babel-jest: "npm:^29.5.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.5.0" + jest-environment-node: "npm:^29.5.0" + jest-get-type: "npm:^29.4.3" + jest-regex-util: "npm:^29.4.3" + jest-resolve: "npm:^29.5.0" + jest-runner: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + jest-validate: "npm:^29.5.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.5.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 01780eb66815e3d31d237aab5d7611ea59e0cdf159cbab2a7c682cb08bde6d053c17a528547440fb1b0294c26ebfd5b54ad35d8c9439f6fae76960ee0bc90197 + languageName: node + linkType: hard + +"jest-diff@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-diff@npm:29.5.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.4.3" + jest-get-type: "npm:^29.4.3" + pretty-format: "npm:^29.5.0" + checksum: 00fda597fa6ee22774453c3cd35c2210bd7f749cf48ad7a41c13b898b2943c9c047842720eb928cdb949b9de87204d8d8987bf12aefdb2f0504f5f4112cab5b0 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-docblock@npm:29.4.3" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 25cdea8fe77ff09d958abd347e26dcd8766ca69d9935bc626a89d694c91d33be06d4c088b02e4b3f143f532f726a10dff0bfe1e2387a0972a95addf5d64ed407 + languageName: node + linkType: hard + +"jest-each@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-each@npm:29.5.0" + dependencies: + "@jest/types": "npm:^29.5.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.4.3" + jest-util: "npm:^29.5.0" + pretty-format: "npm:^29.5.0" + checksum: 214f6b5adfc0d6a3e837769018b7a7b69f41e99aac939fe4730bcca23f69e3566ed23706f95a396b20e63e6b9f90990053fc3c1662808036d4f41e4d6d32641d + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-environment-node@npm:29.5.0" + dependencies: + "@jest/environment": "npm:^29.5.0" + "@jest/fake-timers": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + jest-mock: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + checksum: 2e636a095ff9a9e0aa20fda5b4c06eebed8f3ba2411062bdf724b114eedafd49b880167998af9f77aa8aa68231621aebe3998389d73433e9553ea5735cad1e14 + languageName: node + linkType: hard + +"jest-get-type@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-get-type@npm:29.4.3" + checksum: 874b0ced6b1cc677ff7fcf0dc86d02674617a7d0b73d47097604fb3ca460178d16104efdd3837e8b8bf0520ad5d210838c07483b058802b457b8413e60628fd0 + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-haste-map@npm:29.5.0" + dependencies: + "@jest/types": "npm:^29.5.0" + "@types/graceful-fs": "npm:^4.1.3" + "@types/node": "npm:*" + anymatch: "npm:^3.0.3" + fb-watchman: "npm:^2.0.0" + fsevents: "npm:^2.3.2" + graceful-fs: "npm:^4.2.9" + jest-regex-util: "npm:^29.4.3" + jest-util: "npm:^29.5.0" + jest-worker: "npm:^29.5.0" + micromatch: "npm:^4.0.4" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 162edfa185478db9ebe7dff73f3475ef2c205d94fa2b0fc3b41aba4fc29bab274d4a76ca41ca20ea7d9d6ed2b0d8519e298cfffbf5cad6631412d8961c190612 + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-leak-detector@npm:29.5.0" + dependencies: + jest-get-type: "npm:^29.4.3" + pretty-format: "npm:^29.5.0" + checksum: d7db5d4a7cb676fc151f533d6887f3d6bbb4e35346346cbed0b5583c296b13af2d3c8434b30f62b0eb9c711718c7f4bd48496c47af3a20320ee162e33d64aaf2 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-matcher-utils@npm:29.5.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.5.0" + jest-get-type: "npm:^29.4.3" + pretty-format: "npm:^29.5.0" + checksum: 0a3ae95ef5c5c4ac2b2c503c2f57e173fa82725722e1fadcd902fd801afe17d9d36e9366820959465f553627bf1e481a0e4a540125f3b4371eec674b3557f7f3 + languageName: node + linkType: hard + +"jest-message-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-message-util@npm:29.5.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.5.0" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.5.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 706e89cacc89c090af584f4687c4e7f0616706481e468ec7c88270e07ae7458a829e477b7b3dff56b75d801f799d65eb2c28d6453c25dd02bea0fd98f0809dbb + languageName: node + linkType: hard + +"jest-mock@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-mock@npm:29.5.0" + dependencies: + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + jest-util: "npm:^29.5.0" + checksum: c5b71d397d6acd44d99cd48dad8ca76334fc5a27e120da72d264d7527a9efc7c6fc431d79de64d0b73aa0ab26a2d0712498e323d42b9e03bee05e983b0d2035c + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: 86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-regex-util@npm:29.4.3" + checksum: a7a4508bda47c5177e7337fb6fb22e9adab414ba141f224c9992c86973da1ccf5c69040e63636090ad26ef3a123d28bec950fa99496c157444b4f847e5e5a670 + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-resolve-dependencies@npm:29.5.0" + dependencies: + jest-regex-util: "npm:^29.4.3" + jest-snapshot: "npm:^29.5.0" + checksum: fbe513b7d905c4a70be17fd1cb4bd83da1e82cceb47ed7ceababbe11c75f1d0c18eadeb3f4ebb6997ba979f35fa18dfd02e1d57eb556675e47b35675fde0aac7 + languageName: node + linkType: hard + +"jest-resolve@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-resolve@npm:29.5.0" + dependencies: + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.5.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.5.0" + jest-validate: "npm:^29.5.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: e7ea3b1cf865a7e63ad297d0f43a093dde145f9ca72dc8e75b6c7eb3af60fe78e4f7d024fd92fa280419a4ca038d42a9268d4d5d512958d11347e680daca1f12 + languageName: node + linkType: hard + +"jest-runner@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-runner@npm:29.5.0" + dependencies: + "@jest/console": "npm:^29.5.0" + "@jest/environment": "npm:^29.5.0" + "@jest/test-result": "npm:^29.5.0" + "@jest/transform": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.4.3" + jest-environment-node: "npm:^29.5.0" + jest-haste-map: "npm:^29.5.0" + jest-leak-detector: "npm:^29.5.0" + jest-message-util: "npm:^29.5.0" + jest-resolve: "npm:^29.5.0" + jest-runtime: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + jest-watcher: "npm:^29.5.0" + jest-worker: "npm:^29.5.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 96f47976b9bcc0554455c200d02ebc1547b9a7749b05353c0d55aff535509032c0c12ea25ccc294350f62c14665dbc1e00b15e0d1c52207edfb807e4fec4a36a + languageName: node + linkType: hard + +"jest-runtime@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-runtime@npm:29.5.0" + dependencies: + "@jest/environment": "npm:^29.5.0" + "@jest/fake-timers": "npm:^29.5.0" + "@jest/globals": "npm:^29.5.0" + "@jest/source-map": "npm:^29.4.3" + "@jest/test-result": "npm:^29.5.0" + "@jest/transform": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.5.0" + jest-message-util: "npm:^29.5.0" + jest-mock: "npm:^29.5.0" + jest-regex-util: "npm:^29.4.3" + jest-resolve: "npm:^29.5.0" + jest-snapshot: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 9b5c0a97e1f24945059695e056188041730a3f1dc5924153e323eb7429244e10e7cc877b13d057869d6621c460deae11b77a2a2e9ab56e22b56864a3e44c4448 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-snapshot@npm:29.5.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/traverse": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.5.0" + "@jest/transform": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@types/babel__traverse": "npm:^7.0.6" + "@types/prettier": "npm:^2.1.5" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.5.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.5.0" + jest-get-type: "npm:^29.4.3" + jest-matcher-utils: "npm:^29.5.0" + jest-message-util: "npm:^29.5.0" + jest-util: "npm:^29.5.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.5.0" + semver: "npm:^7.3.5" + checksum: db9957d9c8607d75bb08302605331b5d90fa738fafeed820ab8ebcb2c90f9e62fb4fec0b4c826c04a37557cbb7a9ed26a10b0c74d46ffedce2d6ae8a9c891b00 + languageName: node + linkType: hard + +"jest-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-util@npm:29.5.0" + dependencies: + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: c7f1dc8ae82cd9614a31e09806499560b4812beb57589b214241dd213d3cc6d24417593aef2caf2d3d9694925438849fec371ff36ca8a7f1be8438fd41e83373 + languageName: node + linkType: hard + +"jest-validate@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-validate@npm:29.5.0" + dependencies: + "@jest/types": "npm:^29.5.0" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.4.3" + leven: "npm:^3.1.0" + pretty-format: "npm:^29.5.0" + checksum: 7aabde27a9b736df65902a1bb4ec63af518d4c95e12a910e7658140784168f08c662d5babe67dfa70d843dd2096bc08aa7090fef83c7a9d6bb0893793c3a599a + languageName: node + linkType: hard + +"jest-watcher@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-watcher@npm:29.5.0" + dependencies: + "@jest/test-result": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.5.0" + string-length: "npm:^4.0.1" + checksum: 6a2e71e720183303913fc34fc24a3f87fca7fcfa638bc6c9109a4808b36251a1cb7fe98b956eb0d9c9ead1ad47c3dc3745289ee89e62c6c615168e92282069ca + languageName: node + linkType: hard + +"jest-worker@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-worker@npm:29.5.0" + dependencies: + "@types/node": "npm:*" + jest-util: "npm:^29.5.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 4191ec3209cb1d838c931d47c7328fec7279eb7a5d40fa86bb3fac4d34cbad835349bc366150712259a274507fd210ddb450733032394d8e0b19640b3d3ac17d + languageName: node + linkType: hard + +"jest@npm:^29.5.0": + version: 29.5.0 + resolution: "jest@npm:29.5.0" + dependencies: + "@jest/core": "npm:^29.5.0" + "@jest/types": "npm:^29.5.0" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.5.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 32e29cfa2373530ed323ea65dfb4fd5172026349be48ebb7a2dc5660adadd1c68f6b0fe2b67cc3ee723cc34e2d4552a852730ac787251b406cf58e37a90f6dac + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"jsbn@npm:~0.1.0": + version: 0.1.1 + resolution: "jsbn@npm:0.1.1" + checksum: e046e05c59ff880ee4ef68902dbdcb6d2f3c5d60c357d4d68647dc23add556c31c0e5f41bdb7e69e793dd63468bd9e085da3636341048ef577b18f5b713877c0 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + languageName: node + linkType: hard + +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: 2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json-schema@npm:0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f + languageName: node + linkType: hard + +"json5@npm:^2.2.2": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + languageName: node + linkType: hard + +"jsonparse@npm:^1.2.0, jsonparse@npm:^1.3.1": + version: 1.3.1 + resolution: "jsonparse@npm:1.3.1" + checksum: 89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 + languageName: node + linkType: hard + +"jsprim@npm:^1.2.2": + version: 1.4.2 + resolution: "jsprim@npm:1.4.2" + dependencies: + assert-plus: "npm:1.0.0" + extsprintf: "npm:1.3.0" + json-schema: "npm:0.4.0" + verror: "npm:1.10.0" + checksum: 5e4bca99e90727c2040eb4c2190d0ef1fe51798ed5714e87b841d304526190d960f9772acc7108fa1416b61e1122bcd60e4460c91793dce0835df5852aab55af + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^3.3.3": + version: 3.3.3 + resolution: "jsx-ast-utils@npm:3.3.3" + dependencies: + array-includes: "npm:^3.1.5" + object.assign: "npm:^4.1.3" + checksum: fb69ce100931e50d42c8f72a01495b7d090064824ce481cf7746449609c148a29aae6984624cf9066ac14bdf7978f8774461e120d5b50fa90b3bfe0a0e21ff77 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b + languageName: node + linkType: hard + +"language-subtag-registry@npm:~0.3.2": + version: 0.3.22 + resolution: "language-subtag-registry@npm:0.3.22" + checksum: d1e09971260a7cd3b9fdeb190d33af0b6e99c8697013537d9aaa15f7856d9d83aee128ba8078e219df0a7cf4b8dd18d1a0c188f6543b500d92a2689d2d114b70 + languageName: node + linkType: hard + +"language-tags@npm:=1.0.5": + version: 1.0.5 + resolution: "language-tags@npm:1.0.5" + dependencies: + language-subtag-registry: "npm:~0.3.2" + checksum: 04215e821af9a8f1bc6c99ab5aa0a316c3fe1912ca3337eb28596316064bddd8edd22f2883d866069ebdf01b2002e504a760a336b2c728b6d30514e86744f76c + languageName: node + linkType: hard + +"lerna@npm:^4.0.0": + version: 4.0.0 + resolution: "lerna@npm:4.0.0" + dependencies: + "@lerna/add": "npm:4.0.0" + "@lerna/bootstrap": "npm:4.0.0" + "@lerna/changed": "npm:4.0.0" + "@lerna/clean": "npm:4.0.0" + "@lerna/cli": "npm:4.0.0" + "@lerna/create": "npm:4.0.0" + "@lerna/diff": "npm:4.0.0" + "@lerna/exec": "npm:4.0.0" + "@lerna/import": "npm:4.0.0" + "@lerna/info": "npm:4.0.0" + "@lerna/init": "npm:4.0.0" + "@lerna/link": "npm:4.0.0" + "@lerna/list": "npm:4.0.0" + "@lerna/publish": "npm:4.0.0" + "@lerna/run": "npm:4.0.0" + "@lerna/version": "npm:4.0.0" + import-local: "npm:^3.0.2" + npmlog: "npm:^4.1.2" + bin: + lerna: cli.js + checksum: d184d202f83e47338196bee42c712f7367409432749bfa4f152b0edc576b5f844f0df3d08bc3841c8982792772e4061d111e9760aebe741f98ae575382f98cea + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"libnpmaccess@npm:^4.0.1": + version: 4.0.3 + resolution: "libnpmaccess@npm:4.0.3" + dependencies: + aproba: "npm:^2.0.0" + minipass: "npm:^3.1.1" + npm-package-arg: "npm:^8.1.2" + npm-registry-fetch: "npm:^11.0.0" + checksum: 22b9a5eae8baa99ddd8317b4cb70353493f9f5cf30eb3968f542056311781a979a5b3a022536411c36a8ea501717f6f4ef08299ffac17b3f701211d22b0e5250 + languageName: node + linkType: hard + +"libnpmpublish@npm:^4.0.0": + version: 4.0.2 + resolution: "libnpmpublish@npm:4.0.2" + dependencies: + normalize-package-data: "npm:^3.0.2" + npm-package-arg: "npm:^8.1.2" + npm-registry-fetch: "npm:^11.0.0" + semver: "npm:^7.1.3" + ssri: "npm:^8.0.1" + checksum: 0605725631977af3c3a081620162539ea4652c6bcfdc903829e80517d450e6310e37a0374fe9924426bc04f1bc5b8bf632706e234c7c52953b6b253c9e81fe77 + languageName: node + linkType: hard + +"lilconfig@npm:2.1.0": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 64645641aa8d274c99338e130554abd6a0190533c0d9eb2ce7ebfaf2e05c7d9961f3ffe2bfa39efd3b60c521ba3dd24fa236fe2775fc38501bf82bf49d4678b8 + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d + languageName: node + linkType: hard + +"lint-staged@npm:^13.2.2": + version: 13.2.2 + resolution: "lint-staged@npm:13.2.2" + dependencies: + chalk: "npm:5.2.0" + cli-truncate: "npm:^3.1.0" + commander: "npm:^10.0.0" + debug: "npm:^4.3.4" + execa: "npm:^7.0.0" + lilconfig: "npm:2.1.0" + listr2: "npm:^5.0.7" + micromatch: "npm:^4.0.5" + normalize-path: "npm:^3.0.0" + object-inspect: "npm:^1.12.3" + pidtree: "npm:^0.6.0" + string-argv: "npm:^0.3.1" + yaml: "npm:^2.2.2" + bin: + lint-staged: bin/lint-staged.js + checksum: a3f43ad7a88b57cbdd5e15a6b484955092ecf8bfbb38b009ec47d52ef8d16961785ce85fd6fb49a2d57ec7feb54d6724f1b0b2732f425d0e39b17206a88f7f96 + languageName: node + linkType: hard + +"listr2@npm:^5.0.7": + version: 5.0.8 + resolution: "listr2@npm:5.0.8" + dependencies: + cli-truncate: "npm:^2.1.0" + colorette: "npm:^2.0.19" + log-update: "npm:^4.0.0" + p-map: "npm:^4.0.0" + rfdc: "npm:^1.3.0" + rxjs: "npm:^7.8.0" + through: "npm:^2.3.8" + wrap-ansi: "npm:^7.0.0" + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + checksum: 00f00ad18262909bafff21b42d2d94faa9ed3911d70094a12a1182e773533f9b3cfd78d83a81fdbfb7dbc42e3e3252093f504c822de152100a953a91f3adf7cb + languageName: node + linkType: hard + +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^4.0.0" + pify: "npm:^3.0.0" + strip-bom: "npm:^3.0.0" + checksum: 6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 + languageName: node + linkType: hard + +"load-json-file@npm:^6.2.0": + version: 6.2.0 + resolution: "load-json-file@npm:6.2.0" + dependencies: + graceful-fs: "npm:^4.1.15" + parse-json: "npm:^5.0.0" + strip-bom: "npm:^4.0.0" + type-fest: "npm:^0.6.0" + checksum: fcb46ef75bab917f37170ba76781a1690bf67144bb53931cb0ed8e4aa20ca439e9c354fcf3594aed531f47dbeb4a49800acab7fdffd553c402ac40c987706d7b + languageName: node + linkType: hard + +"locate-path@npm:^2.0.0": + version: 2.0.0 + resolution: "locate-path@npm:2.0.0" + dependencies: + p-locate: "npm:^2.0.0" + path-exists: "npm:^3.0.0" + checksum: 24efa0e589be6aa3c469b502f795126b26ab97afa378846cb508174211515633b770aa0ba610cab113caedab8d2a4902b061a08aaed5297c12ab6f5be4df0133 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash._reinterpolate@npm:^3.0.0": + version: 3.0.0 + resolution: "lodash._reinterpolate@npm:3.0.0" + checksum: cdf592374b5e9eb6d6290a9a07c7d90f6e632cca4949da2a26ae9897ab13f138f3294fd5e81de3e5d997717f6e26c06747a9ad3413c043fd36c0d87504d97da6 + languageName: node + linkType: hard + +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 + languageName: node + linkType: hard + +"lodash.isfunction@npm:^3.0.9": + version: 3.0.9 + resolution: "lodash.isfunction@npm:3.0.9" + checksum: e88620922f5f104819496884779ca85bfc542efb2946df661ab3e2cd38da5c8375434c6adbedfc76dd3c2b04075d2ba8ec215cfdedf08ddd2e3c3467e8a26ccd + languageName: node + linkType: hard + +"lodash.ismatch@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.ismatch@npm:4.4.0" + checksum: 8f96a5dc4b8d3fc5a033dcb259d0c3148a1044fa4d02b4a0e8dce0fa1f2ef3ec4ac131e20b5cb2c985a4e9bcb1c37c0aa5af2cef70094959389617347b8fc645 + languageName: node + linkType: hard + +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb + languageName: node + linkType: hard + +"lodash.kebabcase@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.kebabcase@npm:4.1.1" + checksum: da5d8f41dbb5bc723d4bf9203d5096ca8da804d6aec3d2b56457156ba6c8d999ff448d347ebd97490da853cb36696ea4da09a431499f1ee8deb17b094ecf4e33 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"lodash.mergewith@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.mergewith@npm:4.6.2" + checksum: 4adbed65ff96fd65b0b3861f6899f98304f90fd71e7f1eb36c1270e05d500ee7f5ec44c02ef979b5ddbf75c0a0b9b99c35f0ad58f4011934c4d4e99e5200b3b5 + languageName: node + linkType: hard + +"lodash.snakecase@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.snakecase@npm:4.1.1" + checksum: f0b3f2497eb20eea1a1cfc22d645ecaeb78ac14593eb0a40057977606d2f35f7aaff0913a06553c783b535aafc55b718f523f9eb78f8d5293f492af41002eaf9 + languageName: node + linkType: hard + +"lodash.startcase@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.startcase@npm:4.4.0" + checksum: bd82aa87a45de8080e1c5ee61128c7aee77bf7f1d86f4ff94f4a6d7438fc9e15e5f03374b947be577a93804c8ad6241f0251beaf1452bf716064eeb657b3a9f0 + languageName: node + linkType: hard + +"lodash.template@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.template@npm:4.5.0" + dependencies: + lodash._reinterpolate: "npm:^3.0.0" + lodash.templatesettings: "npm:^4.0.0" + checksum: 62a02b397f72542fa9a989d9fc1a94fc1cb94ced8009fa5c37956746c0cf460279e844126c2abfbf7e235fe27e8b7ee8e6efbf6eac247a06aa05b05457fda817 + languageName: node + linkType: hard + +"lodash.templatesettings@npm:^4.0.0": + version: 4.2.0 + resolution: "lodash.templatesettings@npm:4.2.0" + dependencies: + lodash._reinterpolate: "npm:^3.0.0" + checksum: 2609fea36ed061114dfed701666540efc978b069b2106cd819b415759ed281419893d40f85825240197f1a38a98e846f2452e2d31c6d5ccee1e006c9de820622 + languageName: node + linkType: hard + +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: 262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e + languageName: node + linkType: hard + +"lodash.upperfirst@npm:^4.3.1": + version: 4.3.1 + resolution: "lodash.upperfirst@npm:4.3.1" + checksum: 435625da4b3ee74e7a1367a780d9107ab0b13ef4359fc074b2a1a40458eb8d91b655af62f6795b7138d493303a98c0285340160341561d6896e4947e077fa975 + languageName: node + linkType: hard + +"lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.7.0": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"log-update@npm:^4.0.0": + version: 4.0.0 + resolution: "log-update@npm:4.0.0" + dependencies: + ansi-escapes: "npm:^4.3.0" + cli-cursor: "npm:^3.1.0" + slice-ansi: "npm:^4.0.0" + wrap-ansi: "npm:^6.2.0" + checksum: 18b299e230432a156f2535660776406d15ba8bb7817dd3eaadd58004b363756d4ecaabcd658f9949f90b62ea7d3354423be3fdeb7a201ab951ec0e8d6139af86 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.2.0 + resolution: "lru-cache@npm:10.2.0" + checksum: c9847612aa2daaef102d30542a8d6d9b2c2bb36581c1bf0dc3ebf5e5f3352c772a749e604afae2e46873b930a9e9523743faac4e5b937c576ab29196774712ee + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + +"make-dir@npm:^2.1.0": + version: 2.1.0 + resolution: "make-dir@npm:2.1.0" + dependencies: + pify: "npm:^4.0.1" + semver: "npm:^5.6.0" + checksum: ada869944d866229819735bee5548944caef560d7a8536ecbc6536edca28c72add47cc4f6fc39c54fb25d06b58da1f8994cf7d9df7dadea047064749efc085d8 + languageName: node + linkType: hard + +"make-dir@npm:^3.0.0": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: "npm:^6.0.0" + checksum: 56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^8.0.9": + version: 8.0.14 + resolution: "make-fetch-happen@npm:8.0.14" + dependencies: + agentkeepalive: "npm:^4.1.3" + cacache: "npm:^15.0.5" + http-cache-semantics: "npm:^4.1.0" + http-proxy-agent: "npm:^4.0.1" + https-proxy-agent: "npm:^5.0.0" + is-lambda: "npm:^1.0.1" + lru-cache: "npm:^6.0.0" + minipass: "npm:^3.1.3" + minipass-collect: "npm:^1.0.2" + minipass-fetch: "npm:^1.3.2" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + promise-retry: "npm:^2.0.1" + socks-proxy-agent: "npm:^5.0.0" + ssri: "npm:^8.0.0" + checksum: d2c9c77fafcd2f1e64b693671e0cf223d1c6befc01a070de4cc2dc41da4bec24d01a9d46879fbc134d0aa7aed5d2cafea7a74ef16bbf77bf81a2b317e182deb6 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^9.0.1": + version: 9.1.0 + resolution: "make-fetch-happen@npm:9.1.0" + dependencies: + agentkeepalive: "npm:^4.1.3" + cacache: "npm:^15.2.0" + http-cache-semantics: "npm:^4.1.0" + http-proxy-agent: "npm:^4.0.1" + https-proxy-agent: "npm:^5.0.0" + is-lambda: "npm:^1.0.1" + lru-cache: "npm:^6.0.0" + minipass: "npm:^3.1.3" + minipass-collect: "npm:^1.0.2" + minipass-fetch: "npm:^1.3.2" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.2" + promise-retry: "npm:^2.0.1" + socks-proxy-agent: "npm:^6.0.0" + ssri: "npm:^8.0.0" + checksum: 2c737faf6a7f67077679da548b5bfeeef890595bf8c4323a1f76eae355d27ebb33dcf9cf1a673f944cf2f2a7cbf4e2b09f0a0a62931737728f210d902c6be966 + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: "npm:1.0.5" + checksum: b0e6e599780ce6bab49cc413eba822f7d1f0dfebd1c103eaa3785c59e43e22c59018323cf9e1708f0ef5329e94a745d163fcbb6bff8e4c6742f9be9e86f3500c + languageName: node + linkType: hard + +"map-obj@npm:^1.0.0": + version: 1.0.1 + resolution: "map-obj@npm:1.0.1" + checksum: ccca88395e7d38671ed9f5652ecf471ecd546924be2fb900836b9da35e068a96687d96a5f93dcdfa94d9a27d649d2f10a84595590f89a347fb4dda47629dcc52 + languageName: node + linkType: hard + +"map-obj@npm:^4.0.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: 1c19e1c88513c8abdab25c316367154c6a0a6a0f77e3e8c391bb7c0e093aefed293f539d026dc013d86219e5e4c25f23b0003ea588be2101ccd757bacc12d43b + languageName: node + linkType: hard + +"meow@npm:^8.0.0": + version: 8.1.2 + resolution: "meow@npm:8.1.2" + dependencies: + "@types/minimist": "npm:^1.2.0" + camelcase-keys: "npm:^6.2.2" + decamelize-keys: "npm:^1.1.0" + hard-rejection: "npm:^2.1.0" + minimist-options: "npm:4.1.0" + normalize-package-data: "npm:^3.0.0" + read-pkg-up: "npm:^7.0.1" + redent: "npm:^3.0.0" + trim-newlines: "npm:^3.0.0" + type-fest: "npm:^0.18.0" + yargs-parser: "npm:^20.2.3" + checksum: 9a8d90e616f783650728a90f4ea1e5f763c1c5260369e6596b52430f877f4af8ecbaa8c9d952c93bbefd6d5bda4caed6a96a20ba7d27b511d2971909b01922a2 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: "npm:^3.0.2" + picomatch: "npm:^2.3.1" + checksum: 3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf + languageName: node + linkType: hard + +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: 7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c + languageName: node + linkType: hard + +"minimatch@npm:^3.0.3, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + languageName: node + linkType: hard + +"minimist-options@npm:4.1.0": + version: 4.1.0 + resolution: "minimist-options@npm:4.1.0" + dependencies: + arrify: "npm:^1.0.1" + is-plain-obj: "npm:^1.1.0" + kind-of: "npm:^6.0.3" + checksum: 7871f9cdd15d1e7374e5b013e2ceda3d327a06a8c7b38ae16d9ef941e07d985e952c589e57213f7aa90a8744c60aed9524c0d85e501f5478382d9181f2763f54 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: "npm:^3.0.0" + checksum: 8f82bd1f3095b24f53a991b04b67f4c710c894e518b813f0864a31de5570441a509be1ca17e0bb92b047591a8fdbeb886f502764fefb00d2f144f4011791e898 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^1.3.0, minipass-fetch@npm:^1.3.2": + version: 1.4.1 + resolution: "minipass-fetch@npm:1.4.1" + dependencies: + encoding: "npm:^0.1.12" + minipass: "npm:^3.1.0" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.0.0" + dependenciesMeta: + encoding: + optional: true + checksum: a43da7401cd7c4f24b993887d41bd37d097356083b0bb836fd655916467463a1e6e9e553b2da4fcbe8745bf23d40c8b884eab20745562199663b3e9060cd8e7a + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-json-stream@npm:^1.0.1": + version: 1.0.1 + resolution: "minipass-json-stream@npm:1.0.1" + dependencies: + jsonparse: "npm:^1.3.1" + minipass: "npm:^3.0.0" + checksum: 9285cbbea801e7bd6a923e7fb66d9c47c8bad880e70b29f0b8ba220c283d065f47bfa887ef87fd1b735d39393ecd53bb13d40c260354e8fcf93d47cf4bf64e9c + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.2, minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^2.6.0, minipass@npm:^2.9.0": + version: 2.9.0 + resolution: "minipass@npm:2.9.0" + dependencies: + safe-buffer: "npm:^5.1.2" + yallist: "npm:^3.0.0" + checksum: 307d8765ac3db9fcd6b486367e6f6c3e460f3a3e198d95d6c0005a2d95804c40c72959261cdebde3c8237cda0b03d4c01975e4581fe11abcf201f5005caafd2a + languageName: node + linkType: hard + +"minipass@npm:^3.0.0, minipass@npm:^3.1.0, minipass@npm:^3.1.1, minipass@npm:^3.1.3": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 + languageName: node + linkType: hard + +"minizlib@npm:^1.3.3": + version: 1.3.3 + resolution: "minizlib@npm:1.3.3" + dependencies: + minipass: "npm:^2.9.0" + checksum: 79798032bbaa6594fa517e5b7ff9977951984fc9548a421b28d3fb0add8ed7e98a33e41e262af53b944f9d860c1e00fc778b477ef692e7b38b1ba12b390ffb17 + languageName: node + linkType: hard + +"minizlib@npm:^2.0.0, minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp-infer-owner@npm:^2.0.0": + version: 2.0.0 + resolution: "mkdirp-infer-owner@npm:2.0.0" + dependencies: + chownr: "npm:^2.0.0" + infer-owner: "npm:^1.0.4" + mkdirp: "npm:^1.0.3" + checksum: 548356a586b92a16fc90eb62b953e5a23d594b56084ecdf72446f4164bbaa6a3bacd8c140672ad24f10c5f561e16c35ac3d97a5ab422832c5ed5449c72501a03 + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.5": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: "npm:^1.2.6" + bin: + mkdirp: bin/cmd.js + checksum: e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"modify-values@npm:^1.0.0": + version: 1.0.1 + resolution: "modify-values@npm:1.0.1" + checksum: 6acb1b82aaf7a02f9f7b554b20cbfc159f223a79c66b0a257511c5933d50b85e12ea1220b0a90a2af6f80bc29ff784f929a52a51881867a93ae6a12ce87a729a + languageName: node + linkType: hard + +"moment@npm:^2.29.4": + version: 2.29.4 + resolution: "moment@npm:2.29.4" + checksum: 844c6f3ce42862ac9467c8ca4f5e48a00750078682cc5bda1bc0e50cc7ca88e2115a0f932d65a06e4a90e26cb78892be9b3ca3dd6546ca2c4d994cebb787fc2b + languageName: node + linkType: hard + +"mri@npm:^1.1.5": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + languageName: node + linkType: hard + +"ms@npm:^2.0.0, ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"multimatch@npm:^4.0.0": + version: 4.0.0 + resolution: "multimatch@npm:4.0.0" + dependencies: + "@types/minimatch": "npm:^3.0.3" + array-differ: "npm:^3.0.0" + array-union: "npm:^2.1.0" + arrify: "npm:^2.0.1" + minimatch: "npm:^3.0.4" + checksum: 08e6b71ea2eee2feba17bb4159d247b78d26f9a9b556abddc136c05baa5eba9d80717986e494972284947e9c0e26a19eba3fe20851463fa3dbb770e289f7a0b8 + languageName: node + linkType: hard + +"multimatch@npm:^5.0.0": + version: 5.0.0 + resolution: "multimatch@npm:5.0.0" + dependencies: + "@types/minimatch": "npm:^3.0.3" + array-differ: "npm:^3.0.0" + array-union: "npm:^2.1.0" + arrify: "npm:^2.0.1" + minimatch: "npm:^3.0.4" + checksum: 252ffae6d19491c169c22fc30cf8a99f6031f94a3495f187d3430b06200e9f05a7efae90ab9d834f090834e0d9c979ab55e7ad21f61a37995d807b4b0ccdcbd1 + languageName: node + linkType: hard + +"mute-stream@npm:0.0.8, mute-stream@npm:~0.0.4": + version: 0.0.8 + resolution: "mute-stream@npm:0.0.8" + checksum: 18d06d92e5d6d45e2b63c0e1b8f25376af71748ac36f53c059baa8b76ffac31c5ab225480494e7d35d30215ecdb18fed26ec23cafcd2f7733f2f14406bcd19e2 + languageName: node + linkType: hard + +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: f6cef26f5044515754802c0fc475d81426f3b90fe88c20fabe08771ce1f736ce46e0397c10acb569a4dd0acb84c7f1ee70676122f95d5bfdd747af3a6c6bbaa8 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.2, negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"neo-async@npm:^2.6.0": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": + version: 2.6.11 + resolution: "node-fetch@npm:2.6.11" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 3ec847ca43f678d07b80abfd85bdf06523c2554ee9a494c992c5fc61f5d9cde9f9f16aa33ff09a62f19eee9d54813b8850d7f054cdfee8b2daf789c57f8eeaea + languageName: node + linkType: hard + +"node-gyp@npm:^5.0.2": + version: 5.1.1 + resolution: "node-gyp@npm:5.1.1" + dependencies: + env-paths: "npm:^2.2.0" + glob: "npm:^7.1.4" + graceful-fs: "npm:^4.2.2" + mkdirp: "npm:^0.5.1" + nopt: "npm:^4.0.1" + npmlog: "npm:^4.1.2" + request: "npm:^2.88.0" + rimraf: "npm:^2.6.3" + semver: "npm:^5.7.1" + tar: "npm:^4.4.12" + which: "npm:^1.3.1" + bin: + node-gyp: bin/node-gyp.js + checksum: b8e68a8fd241e2d2177b28e40c3cec8153b3ff58df8cd5cd8a5ee66070431ac3d87ddbe3c265097e1f27513f48b186801be18e7de0d979ec7faf492909425b9a + languageName: node + linkType: hard + +"node-gyp@npm:^7.1.0": + version: 7.1.2 + resolution: "node-gyp@npm:7.1.2" + dependencies: + env-paths: "npm:^2.2.0" + glob: "npm:^7.1.4" + graceful-fs: "npm:^4.2.3" + nopt: "npm:^5.0.0" + npmlog: "npm:^4.1.2" + request: "npm:^2.88.2" + rimraf: "npm:^3.0.2" + semver: "npm:^7.3.2" + tar: "npm:^6.0.2" + which: "npm:^2.0.2" + bin: + node-gyp: bin/node-gyp.js + checksum: 2fe78d02fb152c8f5a59c9b0a558cbc5beb7f574c25646d4cfdbb62eaa36f3b43ebc585d7b53df84ef4eff5c5b4ad0a2b5a37c09816ac11f61a3bdcedd82df04 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: abddfff7d873312e4ed4a5fb75ce893a5c4fb69e7fcb1dfa71c28a6b92a7f1ef6b62790dffb39181b5a82728ba8f2f32d229cf8cbe66769fe02cea7db4a555aa + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: a6a4d8369e2f2720e9c645255ffde909c0fbd41c92ea92a5607fc17055955daac99c1ff589d421eee12a0d24e99f7bfc2aabfeb1a4c14742f6c099a51863f31a + languageName: node + linkType: hard + +"node-releases@npm:^2.0.12": + version: 2.0.12 + resolution: "node-releases@npm:2.0.12" + checksum: 01f9a7c135be5c8bc989b6c10b9840a7aee09040d46ba4e64b5ea0174fb8891f1277514aef75033ce42031f6cb72a04d4a7e99c70ca25488ad63ad6fc5a5b6a0 + languageName: node + linkType: hard + +"noms@npm:0.0.0": + version: 0.0.0 + resolution: "noms@npm:0.0.0" + dependencies: + inherits: "npm:^2.0.1" + readable-stream: "npm:~1.0.31" + checksum: 7790dbbef45c593b5444b361cb9cde3260244ab66aaa199c0728d334525eb69df96231115cff260b71b92fc7a6915a642aa22f2f8448696d8dd6e7d7cebfccce + languageName: node + linkType: hard + +"nopt@npm:^4.0.1": + version: 4.0.3 + resolution: "nopt@npm:4.0.3" + dependencies: + abbrev: "npm:1" + osenv: "npm:^0.1.4" + bin: + nopt: bin/nopt.js + checksum: 03e54cdf8c9b46924cfadf333b2b86fc180410d74d51f9c72fec5ef9c6f1a19ec533f647c05e40d49ef7491af59664c5d0baace808d6ccfe3ff064ae630a61b4 + languageName: node + linkType: hard + +"nopt@npm:^5.0.0": + version: 5.0.0 + resolution: "nopt@npm:5.0.0" + dependencies: + abbrev: "npm:1" + bin: + nopt: bin/nopt.js + checksum: fc5c4f07155cb455bf5fc3dd149fac421c1a40fd83c6bfe83aa82b52f02c17c5e88301321318adaa27611c8a6811423d51d29deaceab5fa158b585a61a551061 + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.0.0, normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 + languageName: node + linkType: hard + +"normalize-package-data@npm:^3.0.0, normalize-package-data@npm:^3.0.2": + version: 3.0.3 + resolution: "normalize-package-data@npm:3.0.3" + dependencies: + hosted-git-info: "npm:^4.0.1" + is-core-module: "npm:^2.5.0" + semver: "npm:^7.3.4" + validate-npm-package-license: "npm:^3.0.1" + checksum: e5d0f739ba2c465d41f77c9d950e291ea4af78f8816ddb91c5da62257c40b76d8c83278b0d08ffbcd0f187636ebddad20e181e924873916d03e6e5ea2ef026be + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"normalize-url@npm:^6.1.0": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 + languageName: node + linkType: hard + +"npm-bundled@npm:^1.1.1": + version: 1.1.2 + resolution: "npm-bundled@npm:1.1.2" + dependencies: + npm-normalize-package-bin: "npm:^1.0.1" + checksum: 3f2337789afc8cb608a0dd71cefe459531053d48a5497db14b07b985c4cab15afcae88600db9f92eae072c89b982eeeec8e4463e1d77bc03a7e90f5dacf29769 + languageName: node + linkType: hard + +"npm-install-checks@npm:^4.0.0": + version: 4.0.0 + resolution: "npm-install-checks@npm:4.0.0" + dependencies: + semver: "npm:^7.1.1" + checksum: 86f50aad609bb51833c0a9dcddf25ecc011f9f786f04c1d591e94982a35cf6f5325e3499729e2792a99d1438043405cf350ace8e30665131eae43be566e104ae + languageName: node + linkType: hard + +"npm-lifecycle@npm:^3.1.5": + version: 3.1.5 + resolution: "npm-lifecycle@npm:3.1.5" + dependencies: + byline: "npm:^5.0.0" + graceful-fs: "npm:^4.1.15" + node-gyp: "npm:^5.0.2" + resolve-from: "npm:^4.0.0" + slide: "npm:^1.1.6" + uid-number: "npm:0.0.6" + umask: "npm:^1.1.0" + which: "npm:^1.3.1" + checksum: 73ac1a606298b68994ee45415065f7248358018ff03009a0b43709d9adda126e1bbd1f76e92a39fda14fb20b45cd146f4f67ab9a07dba973cf831f2fea035783 + languageName: node + linkType: hard + +"npm-normalize-package-bin@npm:^1.0.0, npm-normalize-package-bin@npm:^1.0.1": + version: 1.0.1 + resolution: "npm-normalize-package-bin@npm:1.0.1" + checksum: b0c8c05fe419a122e0ff970ccbe7874ae24b4b4b08941a24d18097fe6e1f4b93e3f6abfb5512f9c5488827a5592f2fb3ce2431c41d338802aed24b9a0c160551 + languageName: node + linkType: hard + +"npm-package-arg@npm:^8.0.0, npm-package-arg@npm:^8.0.1, npm-package-arg@npm:^8.1.0, npm-package-arg@npm:^8.1.2, npm-package-arg@npm:^8.1.5": + version: 8.1.5 + resolution: "npm-package-arg@npm:8.1.5" + dependencies: + hosted-git-info: "npm:^4.0.1" + semver: "npm:^7.3.4" + validate-npm-package-name: "npm:^3.0.0" + checksum: e427eed8e050a916778d33c3eee38937e081ef3ad227eb5fd2cf50505afa986665096689b27d9d7997eef9b4498c983a09c6331a18701c1f9316dc9d7c95a60c + languageName: node + linkType: hard + +"npm-packlist@npm:^2.1.4": + version: 2.2.2 + resolution: "npm-packlist@npm:2.2.2" + dependencies: + glob: "npm:^7.1.6" + ignore-walk: "npm:^3.0.3" + npm-bundled: "npm:^1.1.1" + npm-normalize-package-bin: "npm:^1.0.1" + bin: + npm-packlist: bin/index.js + checksum: cf0b1350bfa2e4bdef5e283365fb54811bd095f4b6c8e5f1352a12a155f9aafbd22776b5a79fea7c5e952fab2e72c40f54cea2e139d7d705cfc6f6f955f1aa48 + languageName: node + linkType: hard + +"npm-pick-manifest@npm:^6.0.0, npm-pick-manifest@npm:^6.1.1": + version: 6.1.1 + resolution: "npm-pick-manifest@npm:6.1.1" + dependencies: + npm-install-checks: "npm:^4.0.0" + npm-normalize-package-bin: "npm:^1.0.1" + npm-package-arg: "npm:^8.1.2" + semver: "npm:^7.3.4" + checksum: 4a8b51ccfa74bf696618582a8951c6437b44bc53168e589f99d7d58ac4f6aaa660dfe09142ea927504661647655870690a791e43331ef0b53195045dd35ea6ee + languageName: node + linkType: hard + +"npm-registry-fetch@npm:^11.0.0": + version: 11.0.0 + resolution: "npm-registry-fetch@npm:11.0.0" + dependencies: + make-fetch-happen: "npm:^9.0.1" + minipass: "npm:^3.1.3" + minipass-fetch: "npm:^1.3.0" + minipass-json-stream: "npm:^1.0.1" + minizlib: "npm:^2.0.0" + npm-package-arg: "npm:^8.0.0" + checksum: 7ada6d5621904d08d2bc01cdd64b2cb270c2373bfc52066ada6654eee25e5968476eefde35d1f10ff8b707425addb1fa03c4e925f5c57473f1ffac03ab768f08 + languageName: node + linkType: hard + +"npm-registry-fetch@npm:^9.0.0": + version: 9.0.0 + resolution: "npm-registry-fetch@npm:9.0.0" + dependencies: + "@npmcli/ci-detect": "npm:^1.0.0" + lru-cache: "npm:^6.0.0" + make-fetch-happen: "npm:^8.0.9" + minipass: "npm:^3.1.3" + minipass-fetch: "npm:^1.3.0" + minipass-json-stream: "npm:^1.0.1" + minizlib: "npm:^2.0.0" + npm-package-arg: "npm:^8.0.0" + checksum: f0c00cb98f217f4f2137316bccdeae29b4efbd4842bde9bf6a4912865e14b76dbac43ba1674a83feb095fb3eb13c1702fc256013492856db4a0412c59eb439d2 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.0, npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + +"npm-run-path@npm:^5.1.0": + version: 5.1.0 + resolution: "npm-run-path@npm:5.1.0" + dependencies: + path-key: "npm:^4.0.0" + checksum: ff6d77514489f47fa1c3b1311d09cd4b6d09a874cc1866260f9dea12cbaabda0436ed7f8c2ee44d147bf99a3af29307c6f63b0f83d242b0b6b0ab25dff2629e3 + languageName: node + linkType: hard + +"npmlog@npm:^4.1.2": + version: 4.1.2 + resolution: "npmlog@npm:4.1.2" + dependencies: + are-we-there-yet: "npm:~1.1.2" + console-control-strings: "npm:~1.1.0" + gauge: "npm:~2.7.3" + set-blocking: "npm:~2.0.0" + checksum: d6a26cb362277c65e24a70ebdaff31f81184ceb5415fd748abaaf26417bf0794a17ba849116e4f454a0370b9067ae320834cc78d74527dbeadf6e9d19a959046 + languageName: node + linkType: hard + +"number-is-nan@npm:^1.0.0": + version: 1.0.1 + resolution: "number-is-nan@npm:1.0.1" + checksum: cb97149006acc5cd512c13c1838223abdf202e76ddfa059c5e8e7507aff2c3a78cd19057516885a2f6f5b576543dc4f7b6f3c997cc7df53ae26c260855466df5 + languageName: node + linkType: hard + +"oauth-sign@npm:~0.9.0": + version: 0.9.0 + resolution: "oauth-sign@npm:0.9.0" + checksum: fc92a516f6ddbb2699089a2748b04f55c47b6ead55a77cd3a2cbbce5f7af86164cb9425f9ae19acfd066f1ad7d3a96a67b8928c6ea946426f6d6c29e448497c2 + languageName: node + linkType: hard + +"object-assign@npm:^4.1.0": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + +"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: 752bb5f4dc595e214157ea8f442adb77bdb850ace762b078d151d8b6486331ab12364997a89ee6509be1023b15adf2b3774437a7105f8a5043dfda11ed622411 + languageName: node + linkType: hard + +"object-is@npm:^1.1.5": + version: 1.1.5 + resolution: "object-is@npm:1.1.5" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.3" + checksum: 8c263fb03fc28f1ffb54b44b9147235c5e233dc1ca23768e7d2569740b5d860154d7cc29a30220fe28ed6d8008e2422aefdebfe987c103e1c5d190cf02d9d886 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.assign@npm:^4.1.2, object.assign@npm:^4.1.3, object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: 2f286118c023e557757620e647b02e7c88d3d417e0c568fca0820de8ec9cca68928304854d5b03e99763eddad6e78a6716e2930f7e6372e4b9b843f3fd3056f3 + languageName: node + linkType: hard + +"object.entries@npm:^1.1.5, object.entries@npm:^1.1.6": + version: 1.1.6 + resolution: "object.entries@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + checksum: 8782c71db3a068ccbae9e0541e6b4ac2c25dc67c63f97b7e6ad3c88271d7820197e7398e37747f96542ed47c27f0b81148cdf14c42df15dc22f64818ae7bb5bf + languageName: node + linkType: hard + +"object.fromentries@npm:^2.0.6": + version: 2.0.6 + resolution: "object.fromentries@npm:2.0.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + checksum: db6759ea68131cbdb70b1152f9984b49db03e81de4f6de079b39929bebd8b45501e5333ca2351991e07ee56f4651606c023396644e8f25c0806fa39a26c4c6e6 + languageName: node + linkType: hard + +"object.getownpropertydescriptors@npm:^2.0.3": + version: 2.1.6 + resolution: "object.getownpropertydescriptors@npm:2.1.6" + dependencies: + array.prototype.reduce: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.21.2" + safe-array-concat: "npm:^1.0.0" + checksum: 9c401557a1cd47d873810b8df61dba350bc39848753180a2c7bdc8b9a67907b7c12e5aa9318fde7fe68d3b62c88b9cbd729b3cc8bbdf02655619b9d2a99b5c2a + languageName: node + linkType: hard + +"object.values@npm:^1.1.6": + version: 1.1.6 + resolution: "object.values@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + checksum: 3381204390f10c9f653a4875a50d221c67b5c16cb80a6ac06c706fc82a7cad8400857d4c7a0731193b0abb56b84fe803eabcf7addcf32de76397bbf207e68c66 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"onetime@npm:^5.1.0, onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" + dependencies: + mimic-fn: "npm:^4.0.0" + checksum: 4eef7c6abfef697dd4479345a4100c382d73c149d2d56170a54a07418c50816937ad09500e1ed1e79d235989d073a9bade8557122aee24f0576ecde0f392bb6c + languageName: node + linkType: hard + +"open@npm:^9.1.0": + version: 9.1.0 + resolution: "open@npm:9.1.0" + dependencies: + default-browser: "npm:^4.0.0" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + is-wsl: "npm:^2.2.0" + checksum: 8073ec0dd8994a7a7d9bac208bd17d093993a65ce10f2eb9b62b6d3a91c9366ae903938a237c275493c130171d339f6dcbdd2a2de7e32953452c0867b97825af + languageName: node + linkType: hard + +"optionator@npm:^0.9.1": + version: 0.9.1 + resolution: "optionator@npm:0.9.1" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.3" + checksum: 8b574d50b032f34713dc09bfacdc351824f713c3c80773ead3a05ab977364de88f2f3962a6f15437747b93a5e0636928253949970daea3aaeeefbd3a525da6a4 + languageName: node + linkType: hard + +"os-homedir@npm:^1.0.0": + version: 1.0.2 + resolution: "os-homedir@npm:1.0.2" + checksum: 6be4aa67317ee247b8d46142e243fb4ef1d2d65d3067f54bfc5079257a2f4d4d76b2da78cba7af3cb3f56dbb2e4202e0c47f26171d11ca1ed4008d842c90363f + languageName: node + linkType: hard + +"os-tmpdir@npm:^1.0.0, os-tmpdir@npm:~1.0.2": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 + languageName: node + linkType: hard + +"osenv@npm:^0.1.4": + version: 0.1.5 + resolution: "osenv@npm:0.1.5" + dependencies: + os-homedir: "npm:^1.0.0" + os-tmpdir: "npm:^1.0.0" + checksum: b33ed4b77e662f3ee2a04bf4b56cad2107ab069dee982feb9e39ad44feb9aa0cf1016b9ac6e05d0d84c91fa496798fe48dd05a33175d624e51668068b9805302 + languageName: node + linkType: hard + +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 + languageName: node + linkType: hard + +"p-limit@npm:^1.1.0": + version: 1.3.0 + resolution: "p-limit@npm:1.3.0" + dependencies: + p-try: "npm:^1.0.0" + checksum: 5c1b1d53d180b2c7501efb04b7c817448e10efe1ba46f4783f8951994d5027e4cd88f36ad79af50546682594c4ebd11702ac4b9364c47f8074890e2acad0edee + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^2.0.0": + version: 2.0.0 + resolution: "p-locate@npm:2.0.0" + dependencies: + p-limit: "npm:^1.1.0" + checksum: 82da4be88fb02fd29175e66021610c881938d3cc97c813c71c1a605fac05617d57fd5d3b337494a6106c0edb2a37c860241430851411f1b265108cead34aee67 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"p-map-series@npm:^2.1.0": + version: 2.1.0 + resolution: "p-map-series@npm:2.1.0" + checksum: 302ca686a61c498b227fc45d4e2b2e5bfd20a03f4156a976d94c4ff7decf9cd5a815fa6846b43b37d587ffa8d4671ff2bd596fa83fe8b9113b5102da94940e2a + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"p-pipe@npm:^3.1.0": + version: 3.1.0 + resolution: "p-pipe@npm:3.1.0" + checksum: 9b3076828ea7e9469c0f92c78fa44096726208d547efdb2d6148cbe135d1a70bd449de5be13e234dd669d9515343bd68527b316bf9d5639cee639e2fdde20aaf + languageName: node + linkType: hard + +"p-queue@npm:^6.6.2": + version: 6.6.2 + resolution: "p-queue@npm:6.6.2" + dependencies: + eventemitter3: "npm:^4.0.4" + p-timeout: "npm:^3.2.0" + checksum: 5739ecf5806bbeadf8e463793d5e3004d08bb3f6177bd1a44a005da8fd81bb90f80e4633e1fb6f1dfd35ee663a5c0229abe26aebb36f547ad5a858347c7b0d3e + languageName: node + linkType: hard + +"p-reduce@npm:^2.0.0, p-reduce@npm:^2.1.0": + version: 2.1.0 + resolution: "p-reduce@npm:2.1.0" + checksum: 27b8ff0fb044995507a06cd6357dffba0f2b98862864745972562a21885d7906ce5c794036d2aaa63ef6303158e41e19aed9f19651dfdafb38548ecec7d0de15 + languageName: node + linkType: hard + +"p-timeout@npm:^3.2.0": + version: 3.2.0 + resolution: "p-timeout@npm:3.2.0" + dependencies: + p-finally: "npm:^1.0.0" + checksum: 524b393711a6ba8e1d48137c5924749f29c93d70b671e6db761afa784726572ca06149c715632da8f70c090073afb2af1c05730303f915604fd38ee207b70a61 + languageName: node + linkType: hard + +"p-try@npm:^1.0.0": + version: 1.0.0 + resolution: "p-try@npm:1.0.0" + checksum: 757ba31de5819502b80c447826fac8be5f16d3cb4fbf9bc8bc4971dba0682e84ac33e4b24176ca7058c69e29f64f34d8d9e9b08e873b7b7bb0aa89d620fa224a + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + +"p-waterfall@npm:^2.1.1": + version: 2.1.1 + resolution: "p-waterfall@npm:2.1.1" + dependencies: + p-reduce: "npm:^2.0.0" + checksum: ccae582b75a3597018a375f8eac32b93e8bfb9fc22a8e5037787ef4ebf5958d7465c2d3cbe26443971fbbfda2bcb7b645f694b91f928fc9a71fa5031e6e33f85 + languageName: node + linkType: hard + +"pacote@npm:^11.2.6": + version: 11.3.5 + resolution: "pacote@npm:11.3.5" + dependencies: + "@npmcli/git": "npm:^2.1.0" + "@npmcli/installed-package-contents": "npm:^1.0.6" + "@npmcli/promise-spawn": "npm:^1.2.0" + "@npmcli/run-script": "npm:^1.8.2" + cacache: "npm:^15.0.5" + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.1.0" + infer-owner: "npm:^1.0.4" + minipass: "npm:^3.1.3" + mkdirp: "npm:^1.0.3" + npm-package-arg: "npm:^8.0.1" + npm-packlist: "npm:^2.1.4" + npm-pick-manifest: "npm:^6.0.0" + npm-registry-fetch: "npm:^11.0.0" + promise-retry: "npm:^2.0.1" + read-package-json-fast: "npm:^2.0.1" + rimraf: "npm:^3.0.2" + ssri: "npm:^8.0.1" + tar: "npm:^6.1.0" + bin: + pacote: lib/bin.js + checksum: 105475d3bc3b96495bae474528f4df22bf3686dda4fd94487ae16d2afe73be63e5a65679e21e2b4e623e11511dbd72cccb57ef534673a725d487b9ef1ce9c975 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: "npm:^1.3.1" + json-parse-better-errors: "npm:^1.0.1" + checksum: 8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + languageName: node + linkType: hard + +"parse-path@npm:^4.0.0": + version: 4.0.4 + resolution: "parse-path@npm:4.0.4" + dependencies: + is-ssh: "npm:^1.3.0" + protocols: "npm:^1.4.0" + qs: "npm:^6.9.4" + query-string: "npm:^6.13.8" + checksum: 8eeae3160ebf21e13381c8bacd61d5221d0c855d15b62c8a0e92b09d16a4b2af7331e4d4e981bfea40224793e2ca0235f3c5263aefed0cea11f1cb8d7d3c42f5 + languageName: node + linkType: hard + +"parse-url@npm:^6.0.0": + version: 6.0.5 + resolution: "parse-url@npm:6.0.5" + dependencies: + is-ssh: "npm:^1.3.0" + normalize-url: "npm:^6.1.0" + parse-path: "npm:^4.0.0" + protocols: "npm:^1.4.0" + checksum: b57884955daa61e1a610414e0754c0565e118127b1a4ad0f5c2247c8351dc23abbe3b56c64aa35ee2d9fd04189faed8e416c9a1269b2880a436c0a67906c222c + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: "npm:^9.1.1 || ^10.0.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e + languageName: node + linkType: hard + +"path-type@npm:^3.0.0": + version: 3.0.0 + resolution: "path-type@npm:3.0.0" + dependencies: + pify: "npm:^3.0.0" + checksum: 1332c632f1cac15790ebab8dd729b67ba04fc96f81647496feb1c2975d862d046f41e4b975dbd893048999b2cc90721f72924ad820acc58c78507ba7141a8e56 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + languageName: node + linkType: hard + +"performance-now@npm:^2.1.0": + version: 2.1.0 + resolution: "performance-now@npm:2.1.0" + checksum: 22c54de06f269e29f640e0e075207af57de5052a3d15e360c09b9a8663f393f6f45902006c1e71aa8a5a1cdfb1a47fe268826f8496d6425c362f00f5bc3e85d9 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: 20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"pidtree@npm:^0.6.0": + version: 0.6.0 + resolution: "pidtree@npm:0.6.0" + bin: + pidtree: bin/pidtree.js + checksum: 0829ec4e9209e230f74ebf4265f5ccc9ebfb488334b525cb13f86ff801dca44b362c41252cd43ae4d7653a10a5c6ab3be39d2c79064d6895e0d78dc50a5ed6e9 + languageName: node + linkType: hard + +"pify@npm:^2.3.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 + languageName: node + linkType: hard + +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf + languageName: node + linkType: hard + +"pify@npm:^5.0.0": + version: 5.0.0 + resolution: "pify@npm:5.0.0" + checksum: 9f6f3cd1f159652692f514383efe401a06473af35a699962230ad1c4c9796df5999961461fc1a3b81eed8e3e74adb8bd032474fb3f93eb6bdbd9f33328da1ed2 + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.5 + resolution: "pirates@npm:4.0.5" + checksum: 58b6ff0f137a3d70ff34ac4802fd19819cdc19b53e9c95adecae6c7cfc77719a11f561ad85d46e79e520ef57c31145a564c8bc3bee8cfee75d441fab2928a51d + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: "npm:^4.0.0" + checksum: c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + +"prettier-linter-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "prettier-linter-helpers@npm:1.0.0" + dependencies: + fast-diff: "npm:^1.1.2" + checksum: 81e0027d731b7b3697ccd2129470ed9913ecb111e4ec175a12f0fcfab0096516373bf0af2fef132af50cafb0a905b74ff57996d615f59512bb9ac7378fcc64ab + languageName: node + linkType: hard + +"prettier@npm:^2.6.2": + version: 2.8.8 + resolution: "prettier@npm:2.8.8" + bin: + prettier: bin-prettier.js + checksum: 463ea8f9a0946cd5b828d8cf27bd8b567345cf02f56562d5ecde198b91f47a76b7ac9eae0facd247ace70e927143af6135e8cf411986b8cb8478784a4d6d724a + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.5.0": + version: 29.5.0 + resolution: "pretty-format@npm:29.5.0" + dependencies: + "@jest/schemas": "npm:^29.4.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: bcc0190d050196b64e501e5c2b44beb802d79a2b70b6fe6b24ae2d5e0f31237dfcb1f0ab2ada4678829b6ee38507ba292396301aff0a8122e575ffd45d5d037c + languageName: node + linkType: hard + +"pretty-quick@npm:^3.1.0": + version: 3.1.3 + resolution: "pretty-quick@npm:3.1.3" + dependencies: + chalk: "npm:^3.0.0" + execa: "npm:^4.0.0" + find-up: "npm:^4.1.0" + ignore: "npm:^5.1.4" + mri: "npm:^1.1.5" + multimatch: "npm:^4.0.0" + peerDependencies: + prettier: ">=2.0.0" + bin: + pretty-quick: bin/pretty-quick.js + checksum: 4d52119b8247f398898347eb5a0166622c7bd9662b31dad05d19397f9ad3c2fea8318f95aec53993343d363f03c229c18b0934310b2bb27c23d33ea4a7ea04b0 + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: d179d148d98fbff3d815752fa9a08a87d3190551d1420f17c4467f628214db12235ae068d98cd001f024453676d8985af8f28f002345646c4ece4600a79620bc + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 + languageName: node + linkType: hard + +"promzard@npm:^0.3.0": + version: 0.3.0 + resolution: "promzard@npm:0.3.0" + dependencies: + read: "npm:1" + checksum: 7fd8dbcd9764b35092da65867cc60fdcf2ea85d77e8ed1ae348ec0af1a22616f74053ccf8dad7d8de01e1e3aafe349d77ef56653c2db3791589ac2a8ef485149 + languageName: node + linkType: hard + +"proto-list@npm:~1.2.1": + version: 1.2.4 + resolution: "proto-list@npm:1.2.4" + checksum: b9179f99394ec8a68b8afc817690185f3b03933f7b46ce2e22c1930dc84b60d09f5ad222beab4e59e58c6c039c7f7fcf620397235ef441a356f31f9744010e12 + languageName: node + linkType: hard + +"protocols@npm:^1.4.0": + version: 1.4.8 + resolution: "protocols@npm:1.4.8" + checksum: 59e4b47134dd6092ac818c404f2ae6d8b969a378a35e234b31b098bcb07eac1152b377baeca64e3214d9e0d4ad5338836098cfa34561c5e4639b4bd29fd709b0 + languageName: node + linkType: hard + +"protocols@npm:^2.0.1": + version: 2.0.1 + resolution: "protocols@npm:2.0.1" + checksum: 016cc58a596e401004a028a2f7005e3444bf89ee8f606409c411719374d1e8bba0464fc142a065cce0d19f41669b2f7ffe25a8bde4f16ce3b6eb01fabc51f2e7 + languageName: node + linkType: hard + +"psl@npm:^1.1.28": + version: 1.9.0 + resolution: "psl@npm:1.9.0" + checksum: 6a3f805fdab9442f44de4ba23880c4eba26b20c8e8e0830eff1cb31007f6825dace61d17203c58bfe36946842140c97a1ba7f67bc63ca2d88a7ee052b65d97ab + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 8e6f7abdd3a6635820049e3731c623bbef3fedbf63bbc696b0d7237fdba4cefa069bc1fa62f2938b0fbae057550df7b5318f4a6bcece27f1907fc75c54160bee + languageName: node + linkType: hard + +"pure-rand@npm:^6.0.0": + version: 6.0.2 + resolution: "pure-rand@npm:6.0.2" + checksum: 0556bee2e16a8d081a2b7630d9cb4e5dafd4e6bd6e4c61de1cf1ef5974f127847523e3d0e62884f6f5d64b66a5e93b05bd8f37ed009f3a4fe5089899e05914aa + languageName: node + linkType: hard + +"q@npm:^1.5.1": + version: 1.5.1 + resolution: "q@npm:1.5.1" + checksum: 7855fbdba126cb7e92ef3a16b47ba998c0786ec7fface236e3eb0135b65df36429d91a86b1fff3ab0927b4ac4ee88a2c44527c7c3b8e2a37efbec9fe34803df4 + languageName: node + linkType: hard + +"qs@npm:^6.9.4": + version: 6.11.2 + resolution: "qs@npm:6.11.2" + dependencies: + side-channel: "npm:^1.0.4" + checksum: 4f95d4ff18ed480befcafa3390022817ffd3087fc65f146cceb40fc5edb9fa96cb31f648cae2fa96ca23818f0798bd63ad4ca369a0e22702fcd41379b3ab6571 + languageName: node + linkType: hard + +"qs@npm:~6.5.2": + version: 6.5.3 + resolution: "qs@npm:6.5.3" + checksum: 6631d4f2fa9d315e480662646745a4aa3a708817fbffe2cbdacec8ab9be130f92740c66191770fe9b704bc5fa9c1cc1f6596f55ad132fef7bd3ad1582f199eb0 + languageName: node + linkType: hard + +"query-string@npm:^6.13.8": + version: 6.14.1 + resolution: "query-string@npm:6.14.1" + dependencies: + decode-uri-component: "npm:^0.2.0" + filter-obj: "npm:^1.1.0" + split-on-first: "npm:^1.0.0" + strict-uri-encode: "npm:^2.0.0" + checksum: 900e0fa788000e9dc5f929b6f4141742dcf281f02d3bab9714bc83bea65fab3de75169ea8d61f19cda996bc0dcec72e156efe3c5614c6bce65dcf234ac955b14 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"quick-lru@npm:^4.0.1": + version: 4.0.1 + resolution: "quick-lru@npm:4.0.1" + checksum: f9b1596fa7595a35c2f9d913ac312fede13d37dc8a747a51557ab36e11ce113bbe88ef4c0154968845559a7709cb6a7e7cbe75f7972182451cd45e7f057a334d + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: 6eb5e4b28028c23e2bfcf73371e72cd4162e4ac7ab445ddae2afe24e347a37d6dc22fae6e1748632cd43c6d4f9b8f86dcf26bf9275e1874f436d129952528ae0 + languageName: node + linkType: hard + +"read-cmd-shim@npm:^2.0.0": + version: 2.0.0 + resolution: "read-cmd-shim@npm:2.0.0" + checksum: 482a80d1e7a907e436060b5fce296cc12dd368318a5dcf5efb304911da642a69fb78853a684fb4ebc10e75b0b320d084a4d6c0ce5d5a55442898b8d747b466a7 + languageName: node + linkType: hard + +"read-package-json-fast@npm:^2.0.1": + version: 2.0.3 + resolution: "read-package-json-fast@npm:2.0.3" + dependencies: + json-parse-even-better-errors: "npm:^2.3.0" + npm-normalize-package-bin: "npm:^1.0.1" + checksum: c265a5d6c85f4c8ee0bf35b0b0d92800a7439e5cf4d1f5a2b3f9615a02ee2fd46bca6c2f07e244bfac1c40816eb0d28aec259ae99d7552d144dd9f971a5d2028 + languageName: node + linkType: hard + +"read-package-json@npm:^2.0.0": + version: 2.1.2 + resolution: "read-package-json@npm:2.1.2" + dependencies: + glob: "npm:^7.1.1" + json-parse-even-better-errors: "npm:^2.3.0" + normalize-package-data: "npm:^2.0.0" + npm-normalize-package-bin: "npm:^1.0.0" + checksum: 2ff44e00a2e71bd87209021e3dd2b21d94f72dad2f5230c9ec3afb66acaf6d8c3ee4b6d09aa5c1ec660207d5c8d0b92b4b932459038ab448e74f35dbd8f2aa6a + languageName: node + linkType: hard + +"read-package-json@npm:^3.0.0": + version: 3.0.1 + resolution: "read-package-json@npm:3.0.1" + dependencies: + glob: "npm:^7.1.1" + json-parse-even-better-errors: "npm:^2.3.0" + normalize-package-data: "npm:^3.0.0" + npm-normalize-package-bin: "npm:^1.0.0" + checksum: 8893852ace05ee7bae8461198762643e6cdf261d5786de592954461f21daec5812c5adc485b8565f0a1f36d90d1fe51fa19616c7dce7893bef78ea66821dab1f + languageName: node + linkType: hard + +"read-package-json@npm:^4.1.1": + version: 4.1.2 + resolution: "read-package-json@npm:4.1.2" + dependencies: + glob: "npm:^7.1.1" + json-parse-even-better-errors: "npm:^2.3.0" + normalize-package-data: "npm:^3.0.0" + npm-normalize-package-bin: "npm:^1.0.0" + checksum: b27b40d0a3eb2f013ca4d0eff1cd4eb3d642c6fa9decd58061ab5ac0fc9c66ade9f619ca3c17343bb6a00f877bcd1e3b3fb1f7623ae9d7ce002727869b7ec60a + languageName: node + linkType: hard + +"read-package-tree@npm:^5.3.1": + version: 5.3.1 + resolution: "read-package-tree@npm:5.3.1" + dependencies: + read-package-json: "npm:^2.0.0" + readdir-scoped-modules: "npm:^1.0.0" + util-promisify: "npm:^2.1.0" + checksum: d74a62fef914c408e893b7f8cf28ff81f2d2d175e2d3fba3b832ec1cf8b6d61d31bab15b55092d0acad0132175bdfe84297f1c07d7b90aa618f0ec165d496fdf + languageName: node + linkType: hard + +"read-pkg-up@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg-up@npm:3.0.0" + dependencies: + find-up: "npm:^2.0.0" + read-pkg: "npm:^3.0.0" + checksum: 2cd0a180260b0d235990e6e9c8c2330a03882d36bc2eba8930e437ef23ee52a68a894e7e1ccb1c33f03bcceb270a861ee5f7eac686f238857755e2cddfb48ffd + languageName: node + linkType: hard + +"read-pkg-up@npm:^6.0.0": + version: 6.0.0 + resolution: "read-pkg-up@npm:6.0.0" + dependencies: + find-up: "npm:^4.0.0" + read-pkg: "npm:^5.1.1" + type-fest: "npm:^0.5.0" + checksum: 5231f40d03afb0e5be566bcc5a0e43b78af9dd3804480d77d4ee2381577427a382044a6605c6fdddfa65c929da946f0bf1d242bc2fd13b22b38577328e6649f8 + languageName: node + linkType: hard + +"read-pkg-up@npm:^7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" + dependencies: + find-up: "npm:^4.1.0" + read-pkg: "npm:^5.2.0" + type-fest: "npm:^0.8.1" + checksum: 82b3ac9fd7c6ca1bdc1d7253eb1091a98ff3d195ee0a45386582ce3e69f90266163c34121e6a0a02f1630073a6c0585f7880b3865efcae9c452fa667f02ca385 + languageName: node + linkType: hard + +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: "npm:^4.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^3.0.0" + checksum: 65acf2df89fbcd506b48b7ced56a255ba00adf7ecaa2db759c86cc58212f6fd80f1f0b7a85c848551a5d0685232e9b64f45c1fd5b48d85df2761a160767eeb93 + languageName: node + linkType: hard + +"read-pkg@npm:^5.1.1, read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" + dependencies: + "@types/normalize-package-data": "npm:^2.4.0" + normalize-package-data: "npm:^2.5.0" + parse-json: "npm:^5.0.0" + type-fest: "npm:^0.6.0" + checksum: b51a17d4b51418e777029e3a7694c9bd6c578a5ab99db544764a0b0f2c7c0f58f8a6bc101f86a6fceb8ba6d237d67c89acf6170f6b98695d0420ddc86cf109fb + languageName: node + linkType: hard + +"read@npm:1, read@npm:~1.0.1": + version: 1.0.7 + resolution: "read@npm:1.0.7" + dependencies: + mute-stream: "npm:~0.0.4" + checksum: 443533f05d5bb11b36ef1c6d625aae4e2ced8967e93cf546f35aa77b4eb6bd157f4256619e446bae43467f8f6619c7bc5c76983348dffaf36afedf4224f46216 + languageName: node + linkType: hard + +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.6, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa + languageName: node + linkType: hard + +"readable-stream@npm:~1.0.31": + version: 1.0.34 + resolution: "readable-stream@npm:1.0.34" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: 02272551396ed8930ddee1a088bdf0379f0f7cc47ac49ed8804e998076cb7daec9fbd2b1fd9c0490ec72e56e8bb3651abeb8080492b8e0a9c3f2158330908ed6 + languageName: node + linkType: hard + +"readdir-scoped-modules@npm:^1.0.0": + version: 1.1.0 + resolution: "readdir-scoped-modules@npm:1.1.0" + dependencies: + debuglog: "npm:^1.0.1" + dezalgo: "npm:^1.0.0" + graceful-fs: "npm:^4.1.2" + once: "npm:^1.3.0" + checksum: 21a53741c488775cbf78b0b51f1b897e9c523b1bcf54567fc2c8ed09b12d9027741f45fcb720f388c0c3088021b54dc3f616c07af1531417678cc7962fc15e5c + languageName: node + linkType: hard + +"rechoir@npm:^0.6.2": + version: 0.6.2 + resolution: "rechoir@npm:0.6.2" + dependencies: + resolve: "npm:^1.1.6" + checksum: 22c4bb32f4934a9468468b608417194f7e3ceba9a508512125b16082c64f161915a28467562368eeb15dc16058eb5b7c13a20b9eb29ff9927d1ebb3b5aa83e84 + languageName: node + linkType: hard + +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: "npm:^4.0.0" + strip-indent: "npm:^3.0.0" + checksum: d64a6b5c0b50eb3ddce3ab770f866658a2b9998c678f797919ceb1b586bab9259b311407280bd80b804e2a7c7539b19238ae6a2a20c843f1a7fcff21d48c2eae + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.13.11": + version: 0.13.11 + resolution: "regenerator-runtime@npm:0.13.11" + checksum: 12b069dc774001fbb0014f6a28f11c09ebfe3c0d984d88c9bced77fdb6fedbacbca434d24da9ae9371bfbf23f754869307fb51a4c98a8b8b18e5ef748677ca24 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0": + version: 1.5.0 + resolution: "regexp.prototype.flags@npm:1.5.0" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + functions-have-names: "npm:^1.2.3" + checksum: 312b7966c5cd2e6837da4073e0e6450191e3c6e8f07276cbed35e170ea5606f91487b435eb3290593f8aed39b1191c44f5340e6e5392650feaf2b34a98378464 + languageName: node + linkType: hard + +"request@npm:^2.88.0, request@npm:^2.88.2": + version: 2.88.2 + resolution: "request@npm:2.88.2" + dependencies: + aws-sign2: "npm:~0.7.0" + aws4: "npm:^1.8.0" + caseless: "npm:~0.12.0" + combined-stream: "npm:~1.0.6" + extend: "npm:~3.0.2" + forever-agent: "npm:~0.6.1" + form-data: "npm:~2.3.2" + har-validator: "npm:~5.1.3" + http-signature: "npm:~1.2.0" + is-typedarray: "npm:~1.0.0" + isstream: "npm:~0.1.2" + json-stringify-safe: "npm:~5.0.1" + mime-types: "npm:~2.1.19" + oauth-sign: "npm:~0.9.0" + performance-now: "npm:^2.1.0" + qs: "npm:~6.5.2" + safe-buffer: "npm:^5.1.2" + tough-cookie: "npm:~2.5.0" + tunnel-agent: "npm:^0.6.0" + uuid: "npm:^3.3.2" + checksum: 0ec66e7af1391e51ad231de3b1c6c6aef3ebd0a238aa50d4191c7a792dcdb14920eea8d570c702dc5682f276fe569d176f9b8ebc6031a3cf4a630a691a431a63 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"requireindex@npm:~1.1.0": + version: 1.1.0 + resolution: "requireindex@npm:1.1.0" + checksum: 4d57e7c6d160c4d043a233a6a95a22c792ada72ff378c5ebd415be505b328f3c719f9188dd100f8fcaa8af513a85f39eee0a5047838d715e22e79544a3b7d002 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"resolve-global@npm:1.0.0, resolve-global@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-global@npm:1.0.0" + dependencies: + global-dirs: "npm:^0.1.1" + checksum: fda6ba81a07a0124756ce956dd871ca83763973326d8617143dab38d9c9afc666926604bfe8f0bfd046a9a285347568f32ceb3d4c55a1cb9de5614cca001a21c + languageName: node + linkType: hard + +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + languageName: node + linkType: hard + +"resolve.exports@npm:^2.0.0": + version: 2.0.2 + resolution: "resolve.exports@npm:2.0.2" + checksum: cc4cffdc25447cf34730f388dca5021156ba9302a3bad3d7f168e790dc74b2827dff603f1bc6ad3d299bac269828dca96dd77e036dc9fba6a2a1807c47ab5c98 + languageName: node + linkType: hard + +"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1": + version: 1.22.2 + resolution: "resolve@npm:1.22.2" + dependencies: + is-core-module: "npm:^2.11.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: f9f424a8117d1c68371b4fbc64e6ac045115a3beacc4bd3617b751f7624b69ad40c47dc995585c7f13d4a09723a8f167847defb7d39fad70b0d43bbba05ff851 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin": + version: 1.22.2 + resolution: "resolve@patch:resolve@npm%3A1.22.2#optional!builtin::version=1.22.2&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.11.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: dcf068c4391941734efda06b6f778c013fd349cd4340f126de17c265a7b006c67de7e80e7aa06ecd29f3922e49f5561622b9faf98531f16aa9a896d22148c661 + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rfdc@npm:^1.3.0": + version: 1.3.0 + resolution: "rfdc@npm:1.3.0" + checksum: a17fd7b81f42c7ae4cb932abd7b2f677b04cc462a03619fb46945ae1ccae17c3bc87c020ffdde1751cbfa8549860a2883486fdcabc9b9de3f3108af32b69a667 + languageName: node + linkType: hard + +"rimraf@npm:^2.6.3": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"run-applescript@npm:^5.0.0": + version: 5.0.0 + resolution: "run-applescript@npm:5.0.0" + dependencies: + execa: "npm:^5.0.0" + checksum: f9977db5770929f3f0db434b8e6aa266498c70dec913c84320c0a06add510cf44e3a048c44da088abee312006f9cbf572fd065cdc8f15d7682afda8755f4114c + languageName: node + linkType: hard + +"run-async@npm:^2.4.0": + version: 2.4.1 + resolution: "run-async@npm:2.4.1" + checksum: 35a68c8f1d9664f6c7c2e153877ca1d6e4f886e5ca067c25cdd895a6891ff3a1466ee07c63d6a9be306e9619ff7d509494e6d9c129516a36b9fd82263d579ee1 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"rxjs@npm:^6.6.0": + version: 6.6.7 + resolution: "rxjs@npm:6.6.7" + dependencies: + tslib: "npm:^1.9.0" + checksum: e556a13a9aa89395e5c9d825eabcfa325568d9c9990af720f3f29f04a888a3b854f25845c2b55875d875381abcae2d8100af9cacdc57576e7ed6be030a01d2fe + languageName: node + linkType: hard + +"rxjs@npm:^7.8.0": + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" + dependencies: + tslib: "npm:^2.1.0" + checksum: 3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-array-concat@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.0" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 792d41fde9834583980912cb16bee511ce25e1759d3c467fdbbb3fc3245346a2289a6476d821713aa1ae23cc1d613d17e79c80e55adb29577f6a29e6f45e7f46 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.3" + is-regex: "npm:^1.1.4" + checksum: 14a81a7e683f97b2d6e9c8be61fddcf8ed7a02f4e64a825515f96bb1738eb007145359313741d2704d28b55b703a0f6300c749dde7c1dbc13952a2b85048ede2 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0, semver@npm:^5.7.1": + version: 5.7.1 + resolution: "semver@npm:5.7.1" + bin: + semver: ./bin/semver + checksum: d4884f2aeca28bff35d0bd40ff0a9b2dfc4b36a883bf0ea5dc15d10d9a01bdc9041035b05f825d4b5ac8a56e490703dbf0d986d054de82cc5e9bad3f02ca6e00 + languageName: node + linkType: hard + +"semver@npm:7.5.0": + version: 7.5.0 + resolution: "semver@npm:7.5.0" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 203a556d7189c277b9774a325fd2695187b2822069094e0dbfcc56dfd10a1fd646a94e73812f249802a661f6437b2370ccb8ee330e7b9888b38e53c5a8216222 + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 1f4959e15bcfbaf727e964a4920f9260141bb8805b399793160da4e7de128e42a7d1f79c1b7d5cd21a6073fba0d55feb9966f5fef3e5ccb8e1d7ead3d7527458 + languageName: node + linkType: hard + +"semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7": + version: 7.5.1 + resolution: "semver@npm:7.5.1" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: ae6aca3cfba9b4d0e0a8fa789c7fa4a8412e39f24ecc19500db291a0a31bb43c151021e4fdbb68a85dcd06c1297f6daeeb09647cea4253eba0ccc0106eb7cd67 + languageName: node + linkType: hard + +"set-blocking@npm:~2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: "npm:^6.0.2" + checksum: 7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"shelljs@npm:^0.8.5": + version: 0.8.5 + resolution: "shelljs@npm:0.8.5" + dependencies: + glob: "npm:^7.0.0" + interpret: "npm:^1.0.0" + rechoir: "npm:^0.6.2" + bin: + shjs: bin/shjs + checksum: feb25289a12e4bcd04c40ddfab51aff98a3729f5c2602d5b1a1b95f6819ec7804ac8147ebd8d9a85dfab69d501bcf92d7acef03247320f51c1552cec8d8e2382 + languageName: node + linkType: hard + +"shx@npm:^0.3.3": + version: 0.3.4 + resolution: "shx@npm:0.3.4" + dependencies: + minimist: "npm:^1.2.3" + shelljs: "npm:^0.8.5" + bin: + shx: lib/cli.js + checksum: 83251fb09314682f5a192f0249a4be68c755933313a41b5152b11c19fc0a68311954d3ca971a0cbae05815786a893c59b82f356484d8eeb009c84f4066b3fa31 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: "npm:^1.0.0" + get-intrinsic: "npm:^1.0.2" + object-inspect: "npm:^1.9.0" + checksum: 054a5d23ee35054b2c4609b9fd2a0587760737782b5d765a9c7852264710cc39c6dcb56a9bbd6c12cd84071648aea3edb2359d2f6e560677eedadce511ac1da5 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + +"slice-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "slice-ansi@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 88083c9d0ca67d09f8b4c78f68833d69cabbb7236b74df5d741ad572bbf022deaf243fa54009cd434350622a1174ab267710fcc80a214ecc7689797fe00cb27c + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 + languageName: node + linkType: hard + +"slice-ansi@npm:^5.0.0": + version: 5.0.0 + resolution: "slice-ansi@npm:5.0.0" + dependencies: + ansi-styles: "npm:^6.0.0" + is-fullwidth-code-point: "npm:^4.0.0" + checksum: 2d4d40b2a9d5cf4e8caae3f698fe24ae31a4d778701724f578e984dcb485ec8c49f0c04dab59c401821e80fcdfe89cace9c66693b0244e40ec485d72e543914f + languageName: node + linkType: hard + +"slide@npm:^1.1.6": + version: 1.1.6 + resolution: "slide@npm:1.1.6" + checksum: f3bde70fd4c0a2ba6c23c674f010849865ddfacbc0ae3a57522d7ce88e4cc6c186d627943c34004d4f009a3fb477c03307b247ab69a266de4b3c72b271a6a03a + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "socks-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:^6.0.2" + debug: "npm:4" + socks: "npm:^2.3.3" + checksum: 2bc4d996d3e6cb65f69d84aa94d5dcfabac5c264e777ecdb24511703a614d0a426b40adc2c6b456a9c590e6d4c0a67da70e2d59742ac0411dd7f46a49ce07c73 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^6.0.0": + version: 6.2.1 + resolution: "socks-proxy-agent@npm:6.2.1" + dependencies: + agent-base: "npm:^6.0.2" + debug: "npm:^4.3.3" + socks: "npm:^2.6.2" + checksum: d75c1cf1fdd7f8309a43a77f84409b793fc0f540742ef915154e70ac09a08b0490576fe85d4f8d68bbf80e604a62957a17ab5ef50d312fe1442b0ab6f8f6e6f6 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: a842402fc9b8848a31367f2811ca3cd14c4106588b39a0901cd7a69029998adfc6456b0203617c18ed090542ad0c24ee4e9d4c75a0c4b75071e214227c177eb7 + languageName: node + linkType: hard + +"socks@npm:^2.3.3, socks@npm:^2.6.2, socks@npm:^2.7.1": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: "npm:^2.0.0" + smart-buffer: "npm:^4.2.0" + checksum: 43f69dbc9f34fc8220bc51c6eea1c39715ab3cfdb115d6e3285f6c7d1a603c5c75655668a5bbc11e3c7e2c99d60321fb8d7ab6f38cda6a215fadd0d6d0b52130 + languageName: node + linkType: hard + +"sort-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "sort-keys@npm:2.0.0" + dependencies: + is-plain-obj: "npm:^1.0.0" + checksum: c11a6313995cb67ccf35fed4b1f6734176cc1d1e350ee311c061a2340ada4f7e23b046db064d518b63adba98c0f763739920c59fb4659a0b8482ec7a1f255081 + languageName: node + linkType: hard + +"sort-keys@npm:^4.0.0": + version: 4.2.0 + resolution: "sort-keys@npm:4.2.0" + dependencies: + is-plain-obj: "npm:^2.0.0" + checksum: a63304c7ba55ad3640198fbbd105a1f5a78c1d2c3eb4a7f27857b0c5aeb22983b2b16297265c3c9624d0b03955993e61b92b4601107c4886adc0875d8322f0dd + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: 32f2dfd1e9b7168f9a9715eb1b4e21905850f3b50cf02cf476e47e4eebe8e6b762b63a64357896aa29b37e24922b4282df0f492e0d2ace572b43d15525976ff8 + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.3.0 + resolution: "spdx-exceptions@npm:2.3.0" + checksum: 83089e77d2a91cb6805a5c910a2bedb9e50799da091f532c2ba4150efdef6e53f121523d3e2dc2573a340dc0189e648b03157097f65465b3a0c06da1f18d7e8a + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.13 + resolution: "spdx-license-ids@npm:3.0.13" + checksum: a5cb77ea7be86d574c8876970920e34d9b37f2fb6e361e6b732b61267afbc63dd37831160b731f85c1478f5ba95ae00369742555920e3c694f047f7068d33318 + languageName: node + linkType: hard + +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 56df8344f5a5de8521898a5c090023df1d8b8c75be6228f56c52491e0fc1617a5236f2ac3a066adb67a73231eac216ccea7b5b4a2423a543c277cb2f48d24c29 + languageName: node + linkType: hard + +"split2@npm:^3.0.0": + version: 3.2.2 + resolution: "split2@npm:3.2.2" + dependencies: + readable-stream: "npm:^3.0.0" + checksum: 2dad5603c52b353939befa3e2f108f6e3aff42b204ad0f5f16dd12fd7c2beab48d117184ce6f7c8854f9ee5ffec6faae70d243711dd7d143a9f635b4a285de4e + languageName: node + linkType: hard + +"split@npm:^1.0.0": + version: 1.0.1 + resolution: "split@npm:1.0.1" + dependencies: + through: "npm:2" + checksum: 7f489e7ed5ff8a2e43295f30a5197ffcb2d6202c9cf99357f9690d645b19c812bccf0be3ff336fea5054cda17ac96b91d67147d95dbfc31fbb5804c61962af85 + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"sshpk@npm:^1.7.0": + version: 1.17.0 + resolution: "sshpk@npm:1.17.0" + dependencies: + asn1: "npm:~0.2.3" + assert-plus: "npm:^1.0.0" + bcrypt-pbkdf: "npm:^1.0.0" + dashdash: "npm:^1.12.0" + ecc-jsbn: "npm:~0.1.1" + getpass: "npm:^0.1.1" + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.0.2" + tweetnacl: "npm:~0.14.0" + bin: + sshpk-conv: bin/sshpk-conv + sshpk-sign: bin/sshpk-sign + sshpk-verify: bin/sshpk-verify + checksum: cf5e7f4c72e8a505ef41daac9f9ca26da365cfe26ae265a01ce98a8868991943857a8526c1cf98a42ef0dc4edf1dbe4e77aeea378cfeb58054beb78505e85402 + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: "npm:^7.0.3" + checksum: b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 + languageName: node + linkType: hard + +"ssri@npm:^8.0.0, ssri@npm:^8.0.1": + version: 8.0.1 + resolution: "ssri@npm:8.0.1" + dependencies: + minipass: "npm:^3.1.1" + checksum: 5cfae216ae02dcd154d1bbed2d0a60038a4b3a2fcaac3c7e47401ff4e058e551ee74cfdba618871bf168cd583db7b8324f94af6747d4303b73cd4c3f6dc5c9c2 + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"stop-iteration-iterator@npm:^1.0.0": + version: 1.0.0 + resolution: "stop-iteration-iterator@npm:1.0.0" + dependencies: + internal-slot: "npm:^1.0.4" + checksum: c4158d6188aac510d9e92925b58709207bd94699e9c31186a040c80932a687f84a51356b5895e6dc72710aad83addb9411c22171832c9ae0e6e11b7d61b0dfb9 + languageName: node + linkType: hard + +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: 010cbc78da0e2cf833b0f5dc769e21ae74cdc5d5f5bd555f14a4a4876c8ad2c85ab8b5bdf9a722dc71a11dcd3184085e1c3c0bd50ec6bb85fffc0f28cf82597d + languageName: node + linkType: hard + +"string-argv@npm:^0.3.1": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: "npm:^1.0.2" + strip-ansi: "npm:^6.0.0" + checksum: 1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^1.0.1": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: "npm:^1.0.0" + is-fullwidth-code-point: "npm:^1.0.0" + strip-ansi: "npm:^3.0.0" + checksum: c558438baed23a9ab9370bb6a939acbdb2b2ffc517838d651aad0f5b2b674fb85d460d9b1d0b6a4c210dffd09e3235222d89a5bd4c0c1587f78b2bb7bc00c65e + languageName: node + linkType: hard + +"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.7": + version: 1.2.7 + resolution: "string.prototype.trim@npm:1.2.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + checksum: 31698f6d718794e422db6fcfa6685dcd9243097273b3b2a8b7948b5d45a183cd336378893ff0d4a7b2531b604c32bb5c45193dd6da3d2f5504df5cd222372c09 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimend@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + checksum: 51b663e3195a74b58620a250b3fc4efb58951000f6e7d572a9f671c038f2f37f24a2b8c6994500a882aeab2f1c383fac1e8c023c01eb0c8b4e52d2f13b6c4513 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimstart@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + checksum: 13b9970d4e234002dfc8069c655c1fe19e83e10ced208b54858c41bb0f7544e581ac0ce746e92b279563664ad63910039f7253f36942113fec413b2b4e7c1fcd + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"string_decoder@npm:~0.10.x": + version: 0.10.31 + resolution: "string_decoder@npm:0.10.31" + checksum: 1c628d78f974aa7539c496029f48e7019acc32487fc695464f9d6bdfec98edd7d933a06b3216bc2016918f6e75074c611d84430a53cb0e43071597d6c1ac5e25 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": + version: 3.0.1 + resolution: "strip-ansi@npm:3.0.1" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: f6e7fbe8e700105dccf7102eae20e4f03477537c74b286fd22cfc970f139002ed6f0d9c10d0e21aa9ed9245e0fa3c9275930e8795c5b947da136e4ecb644a70f + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: a771a17901427bac6293fd416db7577e2bc1c34a19d38351e9d5478c3c415f523f391003b42ed475f27e33a78233035df183525395f731d3bfb8cdcbd4da08ce + languageName: node + linkType: hard + +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: "npm:^1.0.0" + checksum: ae0deaf41c8d1001c5d4fbe16cb553865c1863da4fae036683b474fa926af9fc121e155cb3fc57a68262b2ae7d5b8420aa752c97a6428c315d00efe2a3875679 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"strong-log-transformer@npm:^2.1.0": + version: 2.1.0 + resolution: "strong-log-transformer@npm:2.1.0" + dependencies: + duplexer: "npm:^0.1.1" + minimist: "npm:^1.2.0" + through: "npm:^2.3.4" + bin: + sl-log-transformer: bin/sl-log-transformer.js + checksum: 3c3b8aa8f34d661910563ff996412e2f527fc814e699a376854b554d4a4294ab7e285b4e2c08a080a7b19c5600a9b93a98798d3ac600fe3de545ca6605c07829 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"synckit@npm:^0.8.5": + version: 0.8.5 + resolution: "synckit@npm:0.8.5" + dependencies: + "@pkgr/utils": "npm:^2.3.1" + tslib: "npm:^2.5.0" + checksum: 9827f828cabc404b3a147c38f824c8d5b846eb6f65189d965aa0b71ea8ecda5048f8f50b4bdfd8813148844175233cff56c6bc8d87a7118cf10707df870519f4 + languageName: node + linkType: hard + +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + languageName: node + linkType: hard + +"tar@npm:^4.4.12": + version: 4.4.19 + resolution: "tar@npm:4.4.19" + dependencies: + chownr: "npm:^1.1.4" + fs-minipass: "npm:^1.2.7" + minipass: "npm:^2.9.0" + minizlib: "npm:^1.3.3" + mkdirp: "npm:^0.5.5" + safe-buffer: "npm:^5.2.1" + yallist: "npm:^3.1.1" + checksum: 1a32a68feabd55e040f399f75fed37c35fd76202bb60e393986312cdee0175ff0dfd1aec9cc04ad2ade8a252d2a08c7d191fda877ce23f14a3da954d91d301d7 + languageName: node + linkType: hard + +"tar@npm:^6.0.2, tar@npm:^6.1.0": + version: 6.1.15 + resolution: "tar@npm:6.1.15" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: bb2babe7b14442f690d83c2b2c571c9dd0bf802314773e05f4a3e4a241fdecd7fb560b8e4e7d6ea34533c8cd692e1b8418a3b8ba3b9687fe78a683dfbad7f82d + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.0 + resolution: "tar@npm:6.2.0" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 02ca064a1a6b4521fef88c07d389ac0936730091f8c02d30ea60d472e0378768e870769ab9e986d87807bfee5654359cf29ff4372746cc65e30cbddc352660d8 + languageName: node + linkType: hard + +"temp-dir@npm:^1.0.0": + version: 1.0.0 + resolution: "temp-dir@npm:1.0.0" + checksum: 648669d5e154d1961217784c786acadccf0156519c19e0aceda7edc76f5bdfa32a40dd7f88ebea9238ed6e3dedf08b846161916c8947058c384761351be90a8e + languageName: node + linkType: hard + +"temp-write@npm:^4.0.0": + version: 4.0.0 + resolution: "temp-write@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.15" + is-stream: "npm:^2.0.0" + make-dir: "npm:^3.0.0" + temp-dir: "npm:^1.0.0" + uuid: "npm:^3.3.2" + checksum: 91a6b0dd85a5d606db3e1326b23830c2c14b7a249a26a1e42a023af597edeedef338a3b37a38b6bbd22cceee4fff2108545cfb65fca1ab8289927cf9501d6c9e + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + languageName: node + linkType: hard + +"text-extensions@npm:^1.0.0": + version: 1.9.0 + resolution: "text-extensions@npm:1.9.0" + checksum: 9ad5a9f723a871e2d884e132d7e93f281c60b5759c95f3f6b04704856548715d93a36c10dbaf5f12b91bf405f0cf3893bf169d4d143c0f5509563b992d385443 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"through2@npm:^2.0.0, through2@npm:^2.0.1": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade + languageName: node + linkType: hard + +"through2@npm:^4.0.0": + version: 4.0.2 + resolution: "through2@npm:4.0.2" + dependencies: + readable-stream: "npm:3" + checksum: 3741564ae99990a4a79097fe7a4152c22348adc4faf2df9199a07a66c81ed2011da39f631e479fdc56483996a9d34a037ad64e76d79f18c782ab178ea9b6778c + languageName: node + linkType: hard + +"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.4, through@npm:^2.3.6, through@npm:^2.3.8": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + +"titleize@npm:^3.0.0": + version: 3.0.0 + resolution: "titleize@npm:3.0.0" + checksum: 5ae6084ba299b5782f95e3fe85ea9f0fa4d74b8ae722b6b3208157e975589fbb27733aeba4e5080fa9314a856044ef52caa61b87caea4b1baade951a55c06336 + languageName: node + linkType: hard + +"tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: "npm:~1.0.2" + checksum: 69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408 + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: f935537799c2d1922cb5d6d3805f594388f75338fe7a4a9dac41504dd539704ca4db45b883b52e7b0aa5b2fd5ddadb1452bf95cd23a69da2f793a843f9451cc9 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"tough-cookie@npm:~2.5.0": + version: 2.5.0 + resolution: "tough-cookie@npm:2.5.0" + dependencies: + psl: "npm:^1.1.28" + punycode: "npm:^2.1.1" + checksum: e1cadfb24d40d64ca16de05fa8192bc097b66aeeb2704199b055ff12f450e4f30c927ce250f53d01f39baad18e1c11d66f65e545c5c6269de4c366fafa4c0543 + languageName: node + linkType: hard + +"tr46@npm:^2.1.0": + version: 2.1.0 + resolution: "tr46@npm:2.1.0" + dependencies: + punycode: "npm:^2.1.1" + checksum: 397f5c39d97c5fe29fa9bab73b03853be18ad2738b2c66ee5ce84ecb36b091bdaec493f9b3cee711d45f7678f342452600843264cc8242b591c8dc983146a6c4 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 + languageName: node + linkType: hard + +"trim-newlines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-newlines@npm:3.0.1" + checksum: 03cfefde6c59ff57138412b8c6be922ecc5aec30694d784f2a65ef8dcbd47faef580b7de0c949345abdc56ec4b4abf64dd1e5aea619b200316e471a3dd5bf1f6 + languageName: node + linkType: hard + +"ts-node@npm:^10.8.1": + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 95187932fb83f3901e22546bd2feeac7d2feb4f412f42ac3a595f049a23e8dcf70516dffb51866391228ea2dbcfaea039e250fb2bb334d48a86ab2b6aea0ae2d + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.14.1": + version: 3.14.2 + resolution: "tsconfig-paths@npm:3.14.2" + dependencies: + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: fdc92bb7b18b31c0e76f8ec4f98d07236b09590fd6578e587ad024792c8b2235d65125a8fd007fa47a84400f84ceccbf33f24e5198d953249e7204f4cef3517c + languageName: node + linkType: hard + +"tslib@npm:^1.8.1, tslib@npm:^1.9.0": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 + languageName: node + linkType: hard + +"tslib@npm:^2.1.0, tslib@npm:^2.5.0": + version: 2.5.2 + resolution: "tslib@npm:2.5.2" + checksum: 34fa100454708fa8acb7afc2b07d80e0332081e2075ddd912ba959af3b24f969663dac6d602961e57371dc05683badb83b3186ada92c4631ec777e02e3aab608 + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: "npm:^1.8.1" + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 02f19e458ec78ead8fffbf711f834ad8ecd2cc6ade4ec0320790713dccc0a412b99e7fd907c4cda2a1dc602c75db6f12e0108e87a5afad4b2f9e90a24cabd5a2 + languageName: node + linkType: hard + +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + +"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": + version: 0.14.5 + resolution: "tweetnacl@npm:0.14.5" + checksum: 4612772653512c7bc19e61923fbf42903f5e0389ec76a4a1f17195859d114671ea4aa3b734c2029ce7e1fa7e5cc8b80580f67b071ecf0b46b5636d030a0102a2 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd + languageName: node + linkType: hard + +"type-fest@npm:^0.18.0": + version: 0.18.1 + resolution: "type-fest@npm:0.18.1" + checksum: 303f5ecf40d03e1d5b635ce7660de3b33c18ed8ebc65d64920c02974d9e684c72483c23f9084587e9dd6466a2ece1da42ddc95b412a461794dd30baca95e2bac + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"type-fest@npm:^0.4.1": + version: 0.4.1 + resolution: "type-fest@npm:0.4.1" + checksum: 2e65f43209492638244842f70d86e7325361c92dd1cc8e3bf5728c96b980305087fa5ba60652e9053d56c302ef4f1beb9652a91b72a50da0ea66c6b851f3b9cb + languageName: node + linkType: hard + +"type-fest@npm:^0.5.0": + version: 0.5.2 + resolution: "type-fest@npm:0.5.2" + checksum: 9fc2da1d6ef91f5c63778c2c7936248ab066d22b217535f7e2685c7caa4e1b2bc5e4a1eaad2dfb068b8cf233fc1eafc634d117bf0d2afdb2f3092a193abf0ff4 + languageName: node + linkType: hard + +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: 0c585c26416fce9ecb5691873a1301b5aff54673c7999b6f925691ed01f5b9232db408cdbb0bd003d19f5ae284322523f44092d1f81ca0a48f11f7cf0be8cd38 + languageName: node + linkType: hard + +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + is-typed-array: "npm:^1.1.9" + checksum: c5163c0103d07fefc8a2ad0fc151f9ca9a1f6422098c00f695d55f9896e4d63614cd62cf8d8a031c6cee5f418e8980a533796597174da4edff075b3d275a7e23 + languageName: node + linkType: hard + +"typedarray-to-buffer@npm:^3.1.5": + version: 3.1.5 + resolution: "typedarray-to-buffer@npm:3.1.5" + dependencies: + is-typedarray: "npm:^1.0.0" + checksum: 4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027 + languageName: node + linkType: hard + +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 + languageName: node + linkType: hard + +"typescript@npm:^4.6.4 || ^5.0.0, typescript@npm:^5.0.4": + version: 5.1.3 + resolution: "typescript@npm:5.1.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 1faba8d5ffd4717864ddce767613c5ab77c1c8510c1ce21dc9b112a4c662357b9338dc0a6121615266d3a44ebec699f115ef2dabf18d9d7341ea1675692b9b24 + languageName: node + linkType: hard + +"typescript@npm:~4.7.3": + version: 4.7.4 + resolution: "typescript@npm:4.7.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 8c1c4007b6ce5b24c49f0e89173ab9e82687cc6ae54418d1140bb63b82d6598d085ac0f993fe3d3d1fbf87a2c76f1f81d394dc76315bc72c7a9f8561c5d8d205 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^4.6.4 || ^5.0.0#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": + version: 5.1.3 + resolution: "typescript@patch:typescript@npm%3A5.1.3#optional!builtin::version=5.1.3&hash=5da071" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 769c5a11a9d5207ae5ce4c84b5c7a72ad92a28877a0061881ccfb326a43a1a1de79c4daff2f9d74720137744cfc9332fddbfbc4c3973c1e859b2f977f5d11b72 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A~4.7.3#optional!builtin": + version: 4.7.4 + resolution: "typescript@patch:typescript@npm%3A4.7.4#optional!builtin::version=4.7.4&hash=65a307" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 2eb6e31b04fabec84a4d07b5d567deb5ef0a2971d89d9adb16895f148f7d8508adfb12074abc2efc6966805d3664e68ab67925060e5b0ebd8da616db4b151906 + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4": + version: 3.17.4 + resolution: "uglify-js@npm:3.17.4" + bin: + uglifyjs: bin/uglifyjs + checksum: 8b7fcdca69deb284fed7d2025b73eb747ce37f9aca6af53422844f46427152d5440601b6e2a033e77856a2f0591e4167153d5a21b68674ad11f662034ec13ced + languageName: node + linkType: hard + +"uid-number@npm:0.0.6": + version: 0.0.6 + resolution: "uid-number@npm:0.0.6" + checksum: 0b9922962d24df7a67d05b60e9b8647c217f2bcb8880da24132945715abe4b2b0cf16089f8f11ac4e60d6db0da6ca0af24d3f8bae7df53ca098ac00954841235 + languageName: node + linkType: hard + +"umask@npm:^1.1.0": + version: 1.1.0 + resolution: "umask@npm:1.1.0" + checksum: 22f308853eb94f919c18d5be155ad5182416841e9e95921d8f056d70df023fa02ec861dd23687243eeaf16bb5aea09a4690539fe50ed9562bb818432f554c638 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" + which-boxed-primitive: "npm:^1.0.2" + checksum: 81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + languageName: node + linkType: hard + +"unique-filename@npm:^1.1.1": + version: 1.1.1 + resolution: "unique-filename@npm:1.1.1" + dependencies: + unique-slug: "npm:^2.0.0" + checksum: d005bdfaae6894da8407c4de2b52f38b3c58ec86e79fc2ee19939da3085374413b073478ec54e721dc8e32b102cf9e50d0481b8331abdc62202e774b789ea874 + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^2.0.0": + version: 2.0.2 + resolution: "unique-slug@npm:2.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 9eabc51680cf0b8b197811a48857e41f1364b25362300c1ff636c0eca5ec543a92a38786f59cf0697e62c6f814b11ecbe64e8093db71246468a1f03b80c83970 + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + +"universal-user-agent@npm:^6.0.0": + version: 6.0.0 + resolution: "universal-user-agent@npm:6.0.0" + checksum: ebeb0206963666c13bcf9ebc86d0577c7daed5870c05cd34d4972ee7a43b9ef20679baf2a8c83bf1b71d899bae67243ac4982d84ddaf9ba0355ff76595819961 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.0 + resolution: "universalify@npm:2.0.0" + checksum: 07092b9f46df61b823d8ab5e57f0ee5120c178b39609a95e4a15a98c42f6b0b8e834e66fbb47ff92831786193be42f1fd36347169b88ce8639d0f9670af24a71 + languageName: node + linkType: hard + +"untildify@npm:^4.0.0": + version: 4.0.0 + resolution: "untildify@npm:4.0.0" + checksum: d758e624c707d49f76f7511d75d09a8eda7f2020d231ec52b67ff4896bcf7013be3f9522d8375f57e586e9a2e827f5641c7e06ee46ab9c435fc2b2b2e9de517a + languageName: node + linkType: hard + +"upath@npm:^2.0.1": + version: 2.0.1 + resolution: "upath@npm:2.0.1" + checksum: 79e8e1296b00e24a093b077cfd7a238712d09290c850ce59a7a01458ec78c8d26dcc2ab50b1b9d6a84dabf6511fb4969afeb8a5c9a001aa7272b9cc74c34670f + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.11": + version: 1.0.11 + resolution: "update-browserslist-db@npm:1.0.11" + dependencies: + escalade: "npm:^3.1.1" + picocolors: "npm:^1.0.0" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 280d5cf92e302d8de0c12ef840a6af26ec024a5158aa2020975cd01bf0ded09c709793a6f421e6d0f1a47557d6a1a10dc43af80f9c30b8fd0df9691eb98c1c69 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"util-promisify@npm:^2.1.0": + version: 2.1.0 + resolution: "util-promisify@npm:2.1.0" + dependencies: + object.getownpropertydescriptors: "npm:^2.0.3" + checksum: 00783d459e83b64943eecccf3dedc9a704b929032d65c4d835acd1f9ba81a2c3da0bda28b03635b6f10406f7a4febbe9a3be305bad67e53c6108fa3e48877e3f + languageName: node + linkType: hard + +"uuid@npm:^3.3.2": + version: 3.4.0 + resolution: "uuid@npm:3.4.0" + bin: + uuid: ./bin/uuid + checksum: 1c13950df865c4f506ebfe0a24023571fa80edf2e62364297a537c80af09c618299797bbf2dbac6b1f8ae5ad182ba474b89db61e0e85839683991f7e08795347 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.1.0 + resolution: "v8-to-istanbul@npm:9.1.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^1.6.0" + checksum: 657ef7c52a514c1a0769663f96dd6f2cd11d2d3f6c8272d1035f4a543dca0b52c84b005beb7f0ca215eb98425c8bc4aa92a62826b1fc76abc1f7228d33ccbc60 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.4": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + +"validate-npm-package-name@npm:^3.0.0": + version: 3.0.0 + resolution: "validate-npm-package-name@npm:3.0.0" + dependencies: + builtins: "npm:^1.0.3" + checksum: 064f21f59aefae6cc286dd4a50b15d14adb0227e0facab4316197dfb8d06801669e997af5081966c15f7828a5e6ff1957bd20886aeb6b9d0fa430e4cb5db9c4a + languageName: node + linkType: hard + +"verror@npm:1.10.0": + version: 1.10.0 + resolution: "verror@npm:1.10.0" + dependencies: + assert-plus: "npm:^1.0.0" + core-util-is: "npm:1.0.2" + extsprintf: "npm:^1.2.0" + checksum: 37ccdf8542b5863c525128908ac80f2b476eed36a32cb944de930ca1e2e78584cc435c4b9b4c68d0fc13a47b45ff364b4be43aa74f8804f9050140f660fb660d + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: "npm:1.0.12" + checksum: a17e037bccd3ca8a25a80cb850903facdfed0de4864bd8728f1782370715d679fa72e0a0f5da7c1c1379365159901e5935f35be531229da53bbfc0efdabdb48e + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.0": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: "npm:^1.0.3" + checksum: 5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db + languageName: node + linkType: hard + +"webidl-conversions@npm:^6.1.0": + version: 6.1.0 + resolution: "webidl-conversions@npm:6.1.0" + checksum: 66ad3b9073cd1e0e173444d8c636673b016e25b5856694429072cc966229adb734a8d410188e031effadcfb837936d79bc9e87c48f4d5925a90d42dec97f6590 + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 + languageName: node + linkType: hard + +"whatwg-url@npm:^8.4.0": + version: 8.7.0 + resolution: "whatwg-url@npm:8.7.0" + dependencies: + lodash: "npm:^4.7.0" + tr46: "npm:^2.1.0" + webidl-conversions: "npm:^6.1.0" + checksum: de0bc94387dba586b278e701cf5a1c1f5002725d22b8564dbca2cab1966ef24b839018e57ae2423fb514d8a2dd3aa3bf97323e2f89b55cd89e79141e432e9df1 + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: "npm:^1.0.1" + is-boolean-object: "npm:^1.1.0" + is-number-object: "npm:^1.0.4" + is-string: "npm:^1.0.5" + is-symbol: "npm:^1.0.3" + checksum: 0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e + languageName: node + linkType: hard + +"which-collection@npm:^1.0.1": + version: 1.0.1 + resolution: "which-collection@npm:1.0.1" + dependencies: + is-map: "npm:^2.0.1" + is-set: "npm:^2.0.1" + is-weakmap: "npm:^2.0.1" + is-weakset: "npm:^2.0.1" + checksum: 249f913e1758ed2f06f00706007d87dc22090a80591a56917376e70ecf8fc9ab6c41d98e1c87208bb9648676f65d4b09c0e4d23c56c7afb0f0a73a27d701df5d + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.9": + version: 1.1.9 + resolution: "which-typed-array@npm:1.1.9" + dependencies: + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.0" + is-typed-array: "npm:^1.1.10" + checksum: 7edb12cfd04bfe2e2d3ec3e6046417c59e6a8c72209e4fe41fe1a1a40a3b196626c2ca63dac2a0fa2491d5c37c065dfabd2fcf7c0c15f1d19f5640fef88f6368 + languageName: node + linkType: hard + +"which@npm:^1.3.1": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + +"wide-align@npm:^1.1.0": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: "npm:^1.0.2 || 2 || 3 || 4" + checksum: 1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.3": + version: 1.2.3 + resolution: "word-wrap@npm:1.2.3" + checksum: 1cb6558996deb22c909330db1f01d672feee41d7f0664492912de3de282da3f28ba2d49e87b723024e99d56ba2dac2f3ab28f8db07ac199f5e5d5e2e437833de + languageName: node + linkType: hard + +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 7ed2e44f3c33c5c3e3771134d2b0aee4314c9e49c749e37f464bf69f2bcdf0cbf9419ca638098e2717cff4875c47f56a007532f6111c3319f557a2ca91278e92 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"write-file-atomic@npm:^2.4.2": + version: 2.4.3 + resolution: "write-file-atomic@npm:2.4.3" + dependencies: + graceful-fs: "npm:^4.1.11" + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.2" + checksum: 8cb4bba0c1ab814a9b127844da0db4fb8c5e06ddbe6317b8b319377c73b283673036c8b9360120062898508b9428d81611cf7fa97584504a00bc179b2a580b92 + languageName: node + linkType: hard + +"write-file-atomic@npm:^3.0.0, write-file-atomic@npm:^3.0.3": + version: 3.0.3 + resolution: "write-file-atomic@npm:3.0.3" + dependencies: + imurmurhash: "npm:^0.1.4" + is-typedarray: "npm:^1.0.0" + signal-exit: "npm:^3.0.2" + typedarray-to-buffer: "npm:^3.1.5" + checksum: 7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 + languageName: node + linkType: hard + +"write-json-file@npm:^3.2.0": + version: 3.2.0 + resolution: "write-json-file@npm:3.2.0" + dependencies: + detect-indent: "npm:^5.0.0" + graceful-fs: "npm:^4.1.15" + make-dir: "npm:^2.1.0" + pify: "npm:^4.0.1" + sort-keys: "npm:^2.0.0" + write-file-atomic: "npm:^2.4.2" + checksum: 3eadcb6e832ac34dbba37d4eea8871d9fef0e0d77c486b13ed5f81d84a8fcecd9e1a04277e2691eb803c2bed39c2a315e98b96f492c271acee2836acc6276043 + languageName: node + linkType: hard + +"write-json-file@npm:^4.3.0": + version: 4.3.0 + resolution: "write-json-file@npm:4.3.0" + dependencies: + detect-indent: "npm:^6.0.0" + graceful-fs: "npm:^4.1.15" + is-plain-obj: "npm:^2.0.0" + make-dir: "npm:^3.0.0" + sort-keys: "npm:^4.0.0" + write-file-atomic: "npm:^3.0.0" + checksum: 042a93096437fddac5125e66e412bb9e091b9cd5eb8357c8c6bc64e9021af2c4f1ec37915fc29519d71e140baba6890a93fd21019ad4930d4bb6a5aed9129ac7 + languageName: node + linkType: hard + +"write-pkg@npm:^4.0.0": + version: 4.0.0 + resolution: "write-pkg@npm:4.0.0" + dependencies: + sort-keys: "npm:^2.0.0" + type-fest: "npm:^0.4.1" + write-json-file: "npm:^3.2.0" + checksum: 8e20db5fa444dad04e3703c18d8e0f89679caa60accbee5da9ea3aa076430b3f32d99f50d8860d29044245775795455c62d12d16a7856d407e30df7b79f39505 + languageName: node + linkType: hard + +"ws@npm:^7.4.6": + version: 7.5.9 + resolution: "ws@npm:7.5.9" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: aec4ef4eb65821a7dde7b44790f8699cfafb7978c9b080f6d7a98a7f8fc0ce674c027073a78574c94786ba7112cc90fa2cc94fc224ceba4d4b1030cff9662494 + languageName: node + linkType: hard + +"xtend@npm:~4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^3.0.0, yallist@npm:^3.0.2, yallist@npm:^3.1.1": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yaml@npm:^1.10.0": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: 5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f + languageName: node + linkType: hard + +"yaml@npm:^2.2.2": + version: 2.3.1 + resolution: "yaml@npm:2.3.1" + checksum: ed4c21a907fb1cd60a25177612fa46d95064a144623d269199817908475fe85bef20fb17406e3bdc175351b6488056a6f84beb7836e8c262646546a0220188e3 + languageName: node + linkType: hard + +"yargs-parser@npm:20.2.4": + version: 20.2.4 + resolution: "yargs-parser@npm:20.2.4" + checksum: 08dc341f0b9f940c2fffc1d1decf3be00e28cabd2b578a694901eccc7dcd10577f10c6aa1b040fdd9a68b2042515a60f18476543bccacf9f3ce2c8534cd87435 + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^16.1.0, yargs@npm:^16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 + languageName: node + linkType: hard + +"yargs@npm:^17.0.0, yargs@npm:^17.3.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard + +"zod@npm:^3.20.2": + version: 3.21.4 + resolution: "zod@npm:3.21.4" + checksum: 161e8cf7aea38a99244d65da4a9477d9d966f6a533e503feaa20ff7968a9691065c38c6f1eab5cbbdc8374142fff4a05c9cacb8479803ab50ab6a6ca80e5d624 + languageName: node + linkType: hard From 7042c69d3f557369805f0f9d7fec05e50b09c30c Mon Sep 17 00:00:00 2001 From: Blake Byrnes Date: Mon, 29 Jan 2024 10:55:49 -0500 Subject: [PATCH 123/147] chore: update install state --- shared/.yarn/install-state.gz | Bin 1043810 -> 1081798 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/shared/.yarn/install-state.gz b/shared/.yarn/install-state.gz index f9a4013f77837b1f76e5a813804309812aef0d2c..fe345b3d705ce1f2ad4076121ca2bf320b01df54 100644 GIT binary patch delta 943056 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%0D(IE@I;BnJJF4Xub!wp=V~I~nmvQ| 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Ś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

0}QH2j_J&}q?qN0p<7Smv!HChj7(Qm!lf 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