diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..1f9370d
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,18 @@
+// eslint-disable-next-line mmkal/import/no-extraneous-dependencies
+const recommended = require('eslint-plugin-mmkal').getRecommended()
+
+module.exports = {
+ ...recommended,
+ overrides: [
+ ...recommended.overrides,
+ {
+ files: ['*.md'],
+ rules: {
+ 'mmkal/unicorn/filename-case': 'off',
+ },
+ },
+ ],
+ rules: {
+ 'mmkal/@typescript-eslint/no-explicit-any': 'off',
+ },
+}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..2228191
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,38 @@
+name: CI
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - run: npm install --global pnpm@7
+ - run: pnpm install
+ - run: pnpm run build
+ - run: pnpm run lint
+ - run: pnpm test -- --coverage --coverageReporters="json-summary"
+ - uses: actions/github-script@v6
+ id: coveragejson
+ with:
+ script: |
+ const fs = require('fs')
+ const summary = JSON.parse(fs.readFileSync('./coverage/coverage-summary.json').toString())
+ const {pct} = summary.total.branches
+ const colors = {'00EE00': 98, 'FFFF33': 90}
+ return {
+ pct,
+ color: Object.entries(colors).find(e => pct >= e[1])[0] || 'FF0000',
+ }
+ - name: coverage badge
+ if: github.ref_name == 'main'
+ uses: RubbaBoy/BYOB@v1.3.0
+ with:
+ NAME: coverage
+ LABEL: coverage
+ STATUS: '${{ fromJson(steps.coveragejson.outputs.result).pct }}%'
+ COLOR: ${{ fromJson(steps.coveragejson.outputs.result).color }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..861f3e6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+node_modules
+dist
+*ignoreme*
+coverage
+
+# ignore non-pnpm lockfiles
+package-lock.json
+yarn.lock
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 0000000..5dc1b01
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1 @@
+module.exports = require('eslint-plugin-mmkal/src/prettierrc')
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..25128cb
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,10 @@
+{
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": true
+ },
+ "eslint.validate": [
+ "javascript",
+ "typescript"
+ ],
+ "typescript.tsdk": "node_modules/typescript/lib"
+}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
index a371977..3fce0a7 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,381 @@
# eslint-plugin-codegen
+
An eslint plugin for inline codegen. Auto-fixes out of sync code, with presets for barrels, jsdoc to markdown and more.
+
+[![CI](https://github.com/mmkal/eslint-plugin-codegen/actions/workflows/ci.yml/badge.svg)](https://github.com/mmkal/eslint-plugin-codegen/actions/workflows/ci.yml)
+
+![npm](https://img.shields.io/npm/dt/eslint-plugin-codegen)
+
+## Motivation
+
+Sometimes the same information is useful in multiple places - for example, jsdoc comments in code can double as markdown-formatted documentation for a library.
+
+This allows generating code in a project using eslint, without having to incorporate any extra build tools, either for the codegen itself, or to validate that the generated code is up to date. So references to other parts of the project will always stay up to date - and your existing CI tools can enforce this just by running eslint.
+
+Here's an example of it being used along with VSCode's eslint plugin, with auto-fix-on-save:
+
+![](./gifs/barrel.gif)
+
+## Contents
+
+
+- [Motivation](#motivation)
+- [Contents](#contents)
+- [How to use](#how-to-use)
+ - [Setup](#setup)
+ - [Presets](#presets)
+ - [monorepoTOC](#monorepotoc)
+ - [barrel](#barrel)
+ - [markdownFromJsdoc](#markdownfromjsdoc)
+ - [markdownTOC](#markdowntoc)
+ - [markdownFromTests](#markdownfromtests)
+ - [labeler](#labeler)
+ - [custom](#custom)
+ - [Customisation](#customisation)
+
+
+## How to use
+
+
+Caveat
+
+Before you use this, note that it's still in v0. That means:
+
+1. Breaking changes might happen. Presets might be renamed, or have their options changed. The documentation should stay up to date though, since that's partly the point of the project.
+1. There are missing features, or incompletely-implemented ones. For example, `markdownFromJsdoc` only works with `export const ...` style exports. Currently most of the features implemented are ones that are specifically needed for this git repo.
+1. There might be bugs. The project is in active development - [raise an issue](https://github.com/mmkal/ts/issues) if you find one!
+
+
+
+### Setup
+
+In an eslint-enabled project, install with
+
+```bash
+npm install --save-dev eslint-plugin-codegen
+```
+
+or
+
+```bash
+yarn add --dev eslint-plugin-codegen
+````
+
+Then add the plugin and rule to your eslint config, for example in `eslintrc.js`:
+
+```js
+module.exports = {
+ ...
+ plugins: [
+ ...
+ 'codegen'
+ ],
+ rules: {
+ ...
+ 'codegen/codegen': 'error',
+ },
+}
+```
+
+You can use the rule by running eslint in a standard way, with something like this in an npm script: `eslint --ext .ts,.js,.md .`
+
+In vscode, if using the eslint plugin, you may need to tell it to validate markdown files in your repo's `.vscode/settings.json` file (see [this repo for an example](../../.vscode/settings.json)):
+
+```json
+{
+ "eslint.validate": ["markdown", "javascript", "typescript"],
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": true
+ }
+}
+```
+
+To trigger the rule, add a comment line to a source file.
+
+In markdown:
+
+``
+
+In typescript/javascript:
+
+`// codegen:start {{ OPTIONS }}`
+
+Where `{{ OPTIONS }}` are an inline object in the format:
+
+`{preset: presetName, key1: value1, key2: value2}`
+
+Where `key1` and `key2` are options passed to the codegen preset. yaml is used to parse the object, So any valid yaml that fits on one line can be passed as options. In practise, the one-line restriction means using [yaml's "flow style"](https://yaml.org/spec/1.2/spec.html#id2759963) for collections.
+
+See below for documentation. This repo also has [lots of usage examples](https://github.com/mmkal/ts/search?q=%22codegen%3Astart%22&unscoped_q=%22codegen%3Astart%22).
+
+### Presets
+
+
+#### [monorepoTOC](./src/presets/monorepo-toc.ts#L30)
+
+Generate a table of contents for a monorepo.
+
+##### Example (basic)
+
+``
+
+##### Example (using config options)
+
+``
+
+##### Params
+
+|name |description |
+|--------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|repoRoot|[optional] the relative path to the root of the git repository. By default, searches parent directories for a package.json to find the "root". |
+|filter |[optional] a dictionary of filter rules to whitelist packages. Filters can be applied based on package.json keys,
e.g. `filter: { package.name: someRegex, path: some/relative/path }`|
+|sort |[optional] sort based on package properties (see `filter`), or readme length. Use `-` as a prefix to sort descending.
e.g. `sort: -readme.length` |
+
+
+##### Demo
+
+![](./gifs/monorepoTOC.gif)
+
+
+#### [barrel](./src/presets/barrel.ts#L34)
+
+Bundle several modules into a single convenient one.
+
+##### Example
+
+```typescript
+// codegen:start {preset: barrel, include: some/path/*.ts, exclude: some/path/*util.ts}
+export * from './some/path/module-a'
+export * from './some/path/module-b'
+export * from './some/path/module-c'
+// codegen:end
+```
+
+##### Params
+
+|name |description |
+|-------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|include|[optional] If specified, the barrel will only include file paths that match this glob pattern |
+|exclude|[optional] If specified, the barrel will exclude file paths that match these glob patterns |
+|import |[optional] If specified, matching files will be imported and re-exported rather than directly exported
with `export * from './xyz'`. Use `import: star` for `import * as xyz from './xyz'` style imports.
Use `import: default` for `import xyz from './xyz'` style imports. |
+|export |[optional] Only valid if the import style has been specified (either `import: star` or `import: default`).
If specified, matching modules will be bundled into a const or default export based on this name. If set
to `{name: someName, keys: path}` the relative file paths will be used as keys. Otherwise the file paths
will be camel-cased to make them valid js identifiers.|
+
+
+##### Demo
+
+![](./gifs/barrel.gif)
+
+
+#### [markdownFromJsdoc](./src/presets/markdown-from-jsdoc.ts#L18)
+
+Convert jsdoc for an es export from a javascript/typescript file to markdown.
+
+##### Example
+
+``
+
+##### Params
+
+|name |description |
+|------|----------------------------------------------------------------------------------------------|
+|source|{string} relative file path containing the export with jsdoc that should be copied to markdown|
+|export|{string} the name of the export |
+
+
+##### Demo
+
+![](./gifs/markdownFromJsdoc.gif)
+
+
+#### [markdownTOC](./src/presets/markdown-toc.ts#L17)
+
+Generate a table of contents from the current markdown file, based on markdown headers (e.g. `### My section title`)
+
+##### Example
+
+``
+
+##### Params
+
+|name |description |
+|--------|------------------------------------------------------------------------------------------------------------------|
+|minDepth|exclude headers with lower "depth". e.g. if set to 2, `# H1` would be excluded but `## H2` would be included. |
+|maxDepth|exclude headers with higher "depth". e.g. if set to 3, `#### H4` would be excluded but `### H3` would be included.|
+
+
+##### Demo
+
+![](./gifs/markdownTOC.gif)
+
+
+#### [markdownFromTests](./src/presets/markdown-from-tests.ts#L22)
+
+Use a test file to generate library usage documentation. Note: this has been tested with jest. It _might_ also work fine with mocha, and maybe ava, but those haven't been tested.
+
+##### Example
+
+``
+
+##### Params
+
+|name |description |
+|-----------|------------------------------------------------------|
+|source |the jest test file |
+|headerLevel|The number of `#` characters to prefix each title with|
+
+
+##### Demo
+
+![](./gifs/markdownFromTests.gif)
+
+
+#### [labeler](./src/presets/labeler.ts#L26)
+
+Generates a yaml config for the [GitHub Pull Request Labeler Action](https://github.com/actions/labeler). Creates a label per package name, which will be applied to any file modified under the leaf package path. When packages are added or removed from the repo, or renamed, the yaml config will stay in sync with them. Additional labels can be added outside of the generated code block. See https://github.com/mmkal/ts/tree/main/.github/labeler.yml for an example.
+
+##### Example
+```yaml
+# codegen:start {preset: labeler}
+```
+
+*Note*: eslint and related tools make it quite difficult to lint github action yaml files. To get it working, you'll need to:
+- add `'!.github'` to your `.eslintignore` file, or the `ignorePatterns` property in your lint config.
+- {vscode} add `"yaml"` to the `"eslint.validate"` list in `vscode/settings.json`.
+- {@typescript/eslint} add `'.yml'` (and/or `'.yaml'`) to the `parserOptions.extraFileExtensions` list in your lint config.
+- {@typescript/eslint} explicitly include 'hidden' files (with paths starting with `.`) in your tsconfig. See https://github.com/mmkal/ts/tree/main/tsconfig.eslint.json for an example.
+
+##### Params
+
+|name |description |
+|--------|------------------------------------------------------------------------------------------------------------------------------------|
+|repoRoot|[optional] path to the repository root. If not specified, the rule will recursively search parent directories for package.json files|
+
+
+##### Demo
+
+![](./gifs/labeler.gif)
+
+
+
+#### [custom](./src/presets/custom.ts#L28)
+
+Define your own codegen function, which will receive all options specified. Import the `Preset` type from this library to define a strongly-typed preset function:
+
+##### Example
+
+```typescript
+import {Preset} from 'eslint-plugin-codegen'
+
+export const jsonPrinter: Preset<{myCustomProp: string}> = ({meta, options}) => {
+ return 'filename: ' + meta.filename + '\\ncustom prop: ' + options.myCustomProp
+}
+```
+
+This can be used with:
+
+`
+
+##### Demo
+
+![](./gifs/custom.gif)
+
+Note: right now, this preset isn't smart enough to follow source maps or transpile code, so `source` should point at compiled javascript, not typescript. And VSCode's eslint plugin caches modules, so if you edit the custom preset, you may need to recompile and reload VSCode for it to work properly.
+
+### Customisation
+
+In addition to the [custom](#custom) preset, you can also define your own presets in eslint configuration, e.g.:
+
+```js
+module.exports = {
+ ...
+ plugins: [
+ ...
+ 'codegen'
+ ],
+ rules: {
+ ...
+ 'codegen/codegen': [
+ 'error',
+ {presets: require('./my-custom-presets')}
+ ],
+ },
+}
+```
+
+`presets` should be a record of preset functions, conforming to the `Preset` interface from this package. This can be used to extend the in-built ones. For example, you could make generated markdown collapsible:
+
+_Before:_
+
+```
+
+ - [Section1](#section1)
+ - [Section2](#section2)
+
+```
+
+`my-custom-presets.js`:
+
+```js
+const {presets} = require('eslint-plugin-codegen')
+
+module.exports.markdownTOC = (params) => {
+ const toc = presets.markdownTOC(params)
+ return [
+ '',
+ 'click to expand
',
+ '',
+ toc,
+ ' ',
+ ].join('\n')
+}
+```
+
+`.eslintrc.js`:
+
+```js
+module.exports = {
+ ...
+ plugins: [
+ ...
+ 'codegen'
+ ],
+ rules: {
+ ...
+ 'codegen/codegen': ['error', {presets: require('./my-custom-presets')}],
+ },
+}
+```
+
+_After_:
+
+`readme.md`:
+
+```
+
+
+ click to expand
+
+ - [Section1](#section1)
+ - [Section2](#section2)
+
+
+```
+
+_Rendered_:
+
+
+click to expand
+
+- [Section1](#section1)
+- [Section2](#section2)
+
\ No newline at end of file
diff --git a/gifs/barrel.gif b/gifs/barrel.gif
new file mode 100644
index 0000000..36e15aa
Binary files /dev/null and b/gifs/barrel.gif differ
diff --git a/gifs/custom.gif b/gifs/custom.gif
new file mode 100644
index 0000000..e523fcf
Binary files /dev/null and b/gifs/custom.gif differ
diff --git a/gifs/labeler.gif b/gifs/labeler.gif
new file mode 100644
index 0000000..81e02a3
Binary files /dev/null and b/gifs/labeler.gif differ
diff --git a/gifs/markdownFromJsdoc.gif b/gifs/markdownFromJsdoc.gif
new file mode 100644
index 0000000..3c2119e
Binary files /dev/null and b/gifs/markdownFromJsdoc.gif differ
diff --git a/gifs/markdownFromTests.gif b/gifs/markdownFromTests.gif
new file mode 100644
index 0000000..8ad8119
Binary files /dev/null and b/gifs/markdownFromTests.gif differ
diff --git a/gifs/markdownTOC.gif b/gifs/markdownTOC.gif
new file mode 100644
index 0000000..e622481
Binary files /dev/null and b/gifs/markdownTOC.gif differ
diff --git a/gifs/monorepoTOC.gif b/gifs/monorepoTOC.gif
new file mode 100644
index 0000000..3351d83
Binary files /dev/null and b/gifs/monorepoTOC.gif differ
diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 0000000..97cb836
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,5 @@
+/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
+module.exports = {
+ preset: 'ts-jest',
+ testEnvironment: 'node',
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..89fcdfc
--- /dev/null
+++ b/package.json
@@ -0,0 +1,74 @@
+{
+ "name": "eslint-plugin-codegen",
+ "version": "0.16.1",
+ "keywords": [
+ "typescript",
+ "type-check",
+ "assert",
+ "types",
+ "typings",
+ "test",
+ "testing"
+ ],
+ "homepage": "https://github.com/mmkal/eslint-plugin-codegen#readme",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/mmkal/eslint-plugin-codegen.git"
+ },
+ "license": "Apache-2.0",
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "files": [
+ "dist",
+ "*.md"
+ ],
+ "np": {
+ "cleanup": false
+ },
+ "scripts": {
+ "eslint": "eslint --ext '.ts,.js,.md'",
+ "lint": "tsc && eslint .",
+ "build": "tsc -p tsconfig.lib.json",
+ "test": "jest"
+ },
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@babel/generator": "~7.12.0",
+ "@babel/parser": "^7.11.5",
+ "@babel/traverse": "^7.11.5",
+ "expect": "^26.0.0",
+ "fp-ts": "^2.1.0",
+ "glob": "^7.1.4",
+ "io-ts": "^2.2.4",
+ "io-ts-extra": "^0.11.6",
+ "js-yaml": "^3.14.0",
+ "lodash": "^4.17.15",
+ "read-pkg-up": "^7.0.1",
+ "string.prototype.matchall": "^4.0.2"
+ },
+ "devDependencies": {
+ "@babel/types": "7.12.11",
+ "@types/babel__generator": "7.6.2",
+ "@types/babel__traverse": "7.11.0",
+ "@types/dedent": "0.7.0",
+ "@types/eslint": "7.2.6",
+ "@types/glob": "7.1.3",
+ "@types/jest": "29.0.0",
+ "@types/js-yaml": "3.12.5",
+ "@types/lodash": "4.14.165",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "^14.0.0",
+ "dedent": "0.7.0",
+ "eslint": "8.23.0",
+ "eslint-plugin-mmkal": "0.0.1-2",
+ "expect-type2": "npm:expect-type@0.14.0",
+ "jest": "28.1.3",
+ "minimatch": "3.0.4",
+ "np": "7.6.2",
+ "strip-ansi": "6.0.1",
+ "ts-jest": "28.0.8",
+ "ts-morph": "16.0.0",
+ "ts-node": "9.1.1",
+ "typescript": "4.8.2"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..cf8ca23
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,6129 @@
+lockfileVersion: 5.4
+
+specifiers:
+ '@babel/core': ^7.11.6
+ '@babel/generator': ~7.12.0
+ '@babel/parser': ^7.11.5
+ '@babel/traverse': ^7.11.5
+ '@babel/types': 7.12.11
+ '@types/babel__generator': 7.6.2
+ '@types/babel__traverse': 7.11.0
+ '@types/dedent': 0.7.0
+ '@types/eslint': 7.2.6
+ '@types/glob': 7.1.3
+ '@types/jest': 29.0.0
+ '@types/js-yaml': 3.12.5
+ '@types/lodash': 4.14.165
+ '@types/minimatch': 3.0.3
+ '@types/node': ^14.0.0
+ dedent: 0.7.0
+ eslint: 8.23.0
+ eslint-plugin-mmkal: 0.0.1-2
+ expect: ^26.0.0
+ expect-type2: npm:expect-type@0.14.0
+ fp-ts: ^2.1.0
+ glob: ^7.1.4
+ io-ts: ^2.2.4
+ io-ts-extra: ^0.11.6
+ jest: 28.1.3
+ js-yaml: ^3.14.0
+ lodash: ^4.17.15
+ minimatch: 3.0.4
+ np: 7.6.2
+ read-pkg-up: ^7.0.1
+ string.prototype.matchall: ^4.0.2
+ strip-ansi: 6.0.1
+ ts-jest: 28.0.8
+ ts-morph: 16.0.0
+ ts-node: 9.1.1
+ typescript: 4.8.2
+
+dependencies:
+ '@babel/core': 7.19.6
+ '@babel/generator': 7.12.17
+ '@babel/parser': 7.19.6
+ '@babel/traverse': 7.19.6
+ expect: 26.6.2
+ fp-ts: 2.13.1
+ glob: 7.2.3
+ io-ts: 2.2.19_fp-ts@2.13.1
+ io-ts-extra: 0.11.6
+ js-yaml: 3.14.1
+ lodash: 4.17.21
+ read-pkg-up: 7.0.1
+ string.prototype.matchall: 4.0.7
+
+devDependencies:
+ '@babel/types': 7.12.11
+ '@types/babel__generator': 7.6.2
+ '@types/babel__traverse': 7.11.0
+ '@types/dedent': 0.7.0
+ '@types/eslint': 7.2.6
+ '@types/glob': 7.1.3
+ '@types/jest': 29.0.0
+ '@types/js-yaml': 3.12.5
+ '@types/lodash': 4.14.165
+ '@types/minimatch': 3.0.3
+ '@types/node': 14.18.32
+ dedent: 0.7.0
+ eslint: 8.23.0
+ eslint-plugin-mmkal: 0.0.1-2_njvpd7oexm4jrpqkdx4xx3mxbm
+ expect-type2: /expect-type/0.14.0
+ jest: 28.1.3_t5r4bv5a32g5njay4bmjlrj2cu
+ minimatch: 3.0.4
+ np: 7.6.2
+ strip-ansi: 6.0.1
+ ts-jest: 28.0.8_fpn33pm5xaq635uzupby6e7ufe
+ ts-morph: 16.0.0
+ ts-node: 9.1.1_typescript@4.8.2
+ typescript: 4.8.2
+
+packages:
+
+ /@ampproject/remapping/2.2.0:
+ resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.1.1
+ '@jridgewell/trace-mapping': 0.3.17
+
+ /@babel/code-frame/7.18.6:
+ resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.18.6
+
+ /@babel/compat-data/7.19.4:
+ resolution: {integrity: sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/core/7.19.6:
+ resolution: {integrity: sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.2.0
+ '@babel/code-frame': 7.18.6
+ '@babel/generator': 7.19.6
+ '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.6
+ '@babel/helper-module-transforms': 7.19.6
+ '@babel/helpers': 7.19.4
+ '@babel/parser': 7.19.6
+ '@babel/template': 7.18.10
+ '@babel/traverse': 7.19.6
+ '@babel/types': 7.19.4
+ convert-source-map: 1.9.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.1
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/generator/7.12.17:
+ resolution: {integrity: sha512-DSA7ruZrY4WI8VxuS1jWSRezFnghEoYEFrZcw9BizQRmOZiUsiHl59+qEARGPqPikwA/GPTyRCi7isuCK/oyqg==}
+ dependencies:
+ '@babel/types': 7.19.4
+ jsesc: 2.5.2
+ source-map: 0.5.7
+
+ /@babel/generator/7.19.6:
+ resolution: {integrity: sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+ '@jridgewell/gen-mapping': 0.3.2
+ jsesc: 2.5.2
+
+ /@babel/helper-compilation-targets/7.19.3_@babel+core@7.19.6:
+ resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/compat-data': 7.19.4
+ '@babel/core': 7.19.6
+ '@babel/helper-validator-option': 7.18.6
+ browserslist: 4.21.4
+ semver: 6.3.0
+
+ /@babel/helper-environment-visitor/7.18.9:
+ resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-function-name/7.19.0:
+ resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.18.10
+ '@babel/types': 7.19.4
+
+ /@babel/helper-hoist-variables/7.18.6:
+ resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/helper-module-imports/7.18.6:
+ resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/helper-module-transforms/7.19.6:
+ resolution: {integrity: sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/helper-simple-access': 7.19.4
+ '@babel/helper-split-export-declaration': 7.18.6
+ '@babel/helper-validator-identifier': 7.19.1
+ '@babel/template': 7.18.10
+ '@babel/traverse': 7.19.6
+ '@babel/types': 7.19.4
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/helper-plugin-utils/7.19.0:
+ resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-simple-access/7.19.4:
+ resolution: {integrity: sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/helper-split-export-declaration/7.18.6:
+ resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/helper-string-parser/7.19.4:
+ resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-identifier/7.19.1:
+ resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-option/7.18.6:
+ resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helpers/7.19.4:
+ resolution: {integrity: sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.18.10
+ '@babel/traverse': 7.19.6
+ '@babel/types': 7.19.4
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/highlight/7.18.6:
+ resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.19.1
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+
+ /@babel/parser/7.19.6:
+ resolution: {integrity: sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.19.6:
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.19.6:
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.19.6:
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.19.6:
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.19.6:
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.19.6:
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.19.6:
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.19.6:
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.19.6:
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.19.6:
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.19.6:
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.19.6:
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.19.6:
+ resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/runtime-corejs3/7.19.6:
+ resolution: {integrity: sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ core-js-pure: 3.25.5
+ regenerator-runtime: 0.13.10
+ dev: true
+
+ /@babel/runtime/7.19.4:
+ resolution: {integrity: sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.13.10
+ dev: true
+
+ /@babel/template/7.18.10:
+ resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/parser': 7.19.6
+ '@babel/types': 7.19.4
+
+ /@babel/traverse/7.19.6:
+ resolution: {integrity: sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/generator': 7.19.6
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-function-name': 7.19.0
+ '@babel/helper-hoist-variables': 7.18.6
+ '@babel/helper-split-export-declaration': 7.18.6
+ '@babel/parser': 7.19.6
+ '@babel/types': 7.19.4
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/types/7.12.11:
+ resolution: {integrity: sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.19.1
+ lodash: 4.17.21
+ to-fast-properties: 2.0.0
+ dev: true
+
+ /@babel/types/7.19.4:
+ resolution: {integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.19.4
+ '@babel/helper-validator-identifier': 7.19.1
+ to-fast-properties: 2.0.0
+
+ /@bcoe/v8-coverage/0.2.3:
+ resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+ dev: true
+
+ /@eslint/eslintrc/1.3.3:
+ resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 9.4.0
+ globals: 13.17.0
+ ignore: 5.2.0
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/config-array/0.10.7:
+ resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 1.2.1
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/gitignore-to-minimatch/1.0.2:
+ resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==}
+ dev: true
+
+ /@humanwhocodes/module-importer/1.0.1:
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+ dev: true
+
+ /@humanwhocodes/object-schema/1.2.1:
+ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+ dev: true
+
+ /@istanbuljs/load-nyc-config/1.1.0:
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ camelcase: 5.3.1
+ find-up: 4.1.0
+ get-package-type: 0.1.0
+ js-yaml: 3.14.1
+ resolve-from: 5.0.0
+ dev: true
+
+ /@istanbuljs/schema/0.1.3:
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /@jest/console/28.1.3:
+ resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ chalk: 4.1.2
+ jest-message-util: 28.1.3
+ jest-util: 28.1.3
+ slash: 3.0.0
+ dev: true
+
+ /@jest/core/28.1.3_ts-node@9.1.1:
+ resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@jest/console': 28.1.3
+ '@jest/reporters': 28.1.3
+ '@jest/test-result': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ ci-info: 3.5.0
+ exit: 0.1.2
+ graceful-fs: 4.2.10
+ jest-changed-files: 28.1.3
+ jest-config: 28.1.3_5vj5zoyyyfvasyfxgnsdm7xdjm
+ jest-haste-map: 28.1.3
+ jest-message-util: 28.1.3
+ jest-regex-util: 28.0.2
+ jest-resolve: 28.1.3
+ jest-resolve-dependencies: 28.1.3
+ jest-runner: 28.1.3
+ jest-runtime: 28.1.3
+ jest-snapshot: 28.1.3
+ jest-util: 28.1.3
+ jest-validate: 28.1.3
+ jest-watcher: 28.1.3
+ micromatch: 4.0.5
+ pretty-format: 28.1.3
+ rimraf: 3.0.2
+ slash: 3.0.0
+ strip-ansi: 6.0.1
+ transitivePeerDependencies:
+ - supports-color
+ - ts-node
+ dev: true
+
+ /@jest/environment/28.1.3:
+ resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/fake-timers': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ jest-mock: 28.1.3
+ dev: true
+
+ /@jest/expect-utils/28.1.3:
+ resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ jest-get-type: 28.0.2
+ dev: true
+
+ /@jest/expect-utils/29.2.1:
+ resolution: {integrity: sha512-yr4aHNg5Z1CjKby5ozm7sKjgBlCOorlAoFcvrOQ/4rbZRfgZQdnmh7cth192PYIgiPZo2bBXvqdOApnAMWFJZg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ jest-get-type: 29.2.0
+ dev: true
+
+ /@jest/expect/28.1.3:
+ resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ expect: 28.1.3
+ jest-snapshot: 28.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/fake-timers/28.1.3:
+ resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@sinonjs/fake-timers': 9.1.2
+ '@types/node': 18.11.3
+ jest-message-util: 28.1.3
+ jest-mock: 28.1.3
+ jest-util: 28.1.3
+ dev: true
+
+ /@jest/globals/28.1.3:
+ resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/environment': 28.1.3
+ '@jest/expect': 28.1.3
+ '@jest/types': 28.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/reporters/28.1.3:
+ resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@bcoe/v8-coverage': 0.2.3
+ '@jest/console': 28.1.3
+ '@jest/test-result': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ '@jridgewell/trace-mapping': 0.3.17
+ '@types/node': 18.11.3
+ chalk: 4.1.2
+ collect-v8-coverage: 1.0.1
+ exit: 0.1.2
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ istanbul-lib-coverage: 3.2.0
+ istanbul-lib-instrument: 5.2.1
+ istanbul-lib-report: 3.0.0
+ istanbul-lib-source-maps: 4.0.1
+ istanbul-reports: 3.1.5
+ jest-message-util: 28.1.3
+ jest-util: 28.1.3
+ jest-worker: 28.1.3
+ slash: 3.0.0
+ string-length: 4.0.2
+ strip-ansi: 6.0.1
+ terminal-link: 2.1.1
+ v8-to-istanbul: 9.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/schemas/28.1.3:
+ resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@sinclair/typebox': 0.24.47
+ dev: true
+
+ /@jest/schemas/29.0.0:
+ resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@sinclair/typebox': 0.24.47
+ dev: true
+
+ /@jest/source-map/28.1.2:
+ resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.17
+ callsites: 3.1.0
+ graceful-fs: 4.2.10
+ dev: true
+
+ /@jest/test-result/28.1.3:
+ resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/console': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/istanbul-lib-coverage': 2.0.4
+ collect-v8-coverage: 1.0.1
+ dev: true
+
+ /@jest/test-sequencer/28.1.3:
+ resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/test-result': 28.1.3
+ graceful-fs: 4.2.10
+ jest-haste-map: 28.1.3
+ slash: 3.0.0
+ dev: true
+
+ /@jest/transform/28.1.3:
+ resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@babel/core': 7.19.6
+ '@jest/types': 28.1.3
+ '@jridgewell/trace-mapping': 0.3.17
+ babel-plugin-istanbul: 6.1.1
+ chalk: 4.1.2
+ convert-source-map: 1.9.0
+ fast-json-stable-stringify: 2.1.0
+ graceful-fs: 4.2.10
+ jest-haste-map: 28.1.3
+ jest-regex-util: 28.0.2
+ jest-util: 28.1.3
+ micromatch: 4.0.5
+ pirates: 4.0.5
+ slash: 3.0.0
+ write-file-atomic: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/types/26.6.2:
+ resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==}
+ engines: {node: '>= 10.14.2'}
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.4
+ '@types/istanbul-reports': 3.0.1
+ '@types/node': 18.11.3
+ '@types/yargs': 15.0.14
+ chalk: 4.1.2
+
+ /@jest/types/28.1.3:
+ resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/schemas': 28.1.3
+ '@types/istanbul-lib-coverage': 2.0.4
+ '@types/istanbul-reports': 3.0.1
+ '@types/node': 18.11.3
+ '@types/yargs': 17.0.13
+ chalk: 4.1.2
+ dev: true
+
+ /@jest/types/29.2.1:
+ resolution: {integrity: sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.0.0
+ '@types/istanbul-lib-coverage': 2.0.4
+ '@types/istanbul-reports': 3.0.1
+ '@types/node': 18.11.3
+ '@types/yargs': 17.0.13
+ chalk: 4.1.2
+ dev: true
+
+ /@jridgewell/gen-mapping/0.1.1:
+ resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.14
+
+ /@jridgewell/gen-mapping/0.3.2:
+ resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.14
+ '@jridgewell/trace-mapping': 0.3.17
+
+ /@jridgewell/resolve-uri/3.1.0:
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/set-array/1.1.2:
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/sourcemap-codec/1.4.14:
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+
+ /@jridgewell/trace-mapping/0.3.17:
+ resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.0
+ '@jridgewell/sourcemap-codec': 1.4.14
+
+ /@microsoft/tsdoc-config/0.16.2:
+ resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==}
+ dependencies:
+ '@microsoft/tsdoc': 0.14.2
+ ajv: 6.12.6
+ jju: 1.4.0
+ resolve: 1.19.0
+ dev: true
+
+ /@microsoft/tsdoc/0.14.2:
+ resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==}
+ dev: true
+
+ /@nodelib/fs.scandir/2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat/2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk/1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.13.0
+ dev: true
+
+ /@rushstack/eslint-config/3.1.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-hlpXiEPQDHXWtI+iGm9sJjnfm5qOEJsQN7pN004b1ZYq+g3MsE+QvTamalMAcdvXrsnH5Lo0XPfHuEJCa7nwPA==}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '>=4.7.0'
+ dependencies:
+ '@rushstack/eslint-patch': 1.2.0
+ '@rushstack/eslint-plugin': 0.11.0_yqf6kl63nyoq5megxukfnom5rm
+ '@rushstack/eslint-plugin-packlets': 0.6.1_yqf6kl63nyoq5megxukfnom5rm
+ '@rushstack/eslint-plugin-security': 0.5.0_yqf6kl63nyoq5megxukfnom5rm
+ '@typescript-eslint/eslint-plugin': 5.38.1_wngjumgc3dlvz7rlbb66uyvpxi
+ '@typescript-eslint/experimental-utils': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ '@typescript-eslint/parser': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ '@typescript-eslint/typescript-estree': 5.38.1_typescript@4.8.2
+ eslint: 8.23.0
+ eslint-plugin-promise: 6.0.1_eslint@8.23.0
+ eslint-plugin-react: 7.27.1_eslint@8.23.0
+ eslint-plugin-tsdoc: 0.2.17
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@rushstack/eslint-patch/1.2.0:
+ resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
+ dev: true
+
+ /@rushstack/eslint-plugin-packlets/0.5.0_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-I160nHeAGzA0q4g3cR7kiHNgiU1HqrYto52+lEmxLAdbBllqc6IOyiWQfCDb5ug0f+Y8bTwMQHiUrI7XclZB/Q==}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@rushstack/tree-pattern': 0.2.4
+ '@typescript-eslint/experimental-utils': 5.30.7_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@rushstack/eslint-plugin-packlets/0.6.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-N0GqjUbpQ4X348BTLr+gUGVojFVrXwbT3YQv/5sP5adYzq8bOKarmSHKXpvl4rC4CKPDfdSKxTMPfu3P3CJVSA==}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@rushstack/tree-pattern': 0.2.4
+ '@typescript-eslint/experimental-utils': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@rushstack/eslint-plugin-security/0.4.0_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-jRFtrOnZZcuJ2MRA9RtoeyKiFQ60iKu7SDF1wkc7M9nHL5C1HkFApX6nTlAjY7C5B7UlV+9BP9fDmOJJmB4FSw==}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@rushstack/tree-pattern': 0.2.4
+ '@typescript-eslint/experimental-utils': 5.30.7_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@rushstack/eslint-plugin-security/0.5.0_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-qDtij3D2DY8VDHKeUdf+M2SpoctrY+eIA+fJFkpuHP7CTJZLBv5186+oCsJ59lZmKoBFREdgpaV3coXamoT8RQ==}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@rushstack/tree-pattern': 0.2.4
+ '@typescript-eslint/experimental-utils': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@rushstack/eslint-plugin/0.10.0_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-39DCBD6s7Y5XQxvcMmitXfupkReGcg0lmtil9mrGHkDoyiUln90sOWtpkSl6LqUrSL3lx7N2wRvJiJlwGIPYFQ==}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@rushstack/tree-pattern': 0.2.4
+ '@typescript-eslint/experimental-utils': 5.30.7_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@rushstack/eslint-plugin/0.11.0_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-e8eVBOgb/xkpkgFmPP+oifrqCLh8I5BFI/emB/nf5+WnuS4hsTHkgprCEiJuvkhJRypsWrbchkIda9/1YFadxg==}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@rushstack/tree-pattern': 0.2.4
+ '@typescript-eslint/experimental-utils': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@rushstack/tree-pattern/0.2.4:
+ resolution: {integrity: sha512-H8i0OinWsdKM1TKEKPeRRTw85e+/7AIFpxm7q1blceZJhuxRBjCGAUZvQXZK4CMLx75xPqh/h1t5WHwFmElAPA==}
+ dev: true
+
+ /@samverschueren/stream-to-observable/0.3.1_rxjs@6.6.7:
+ resolution: {integrity: sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ rxjs: '*'
+ zen-observable: '*'
+ peerDependenciesMeta:
+ rxjs:
+ optional: true
+ zen-observable:
+ optional: true
+ dependencies:
+ any-observable: 0.3.0_rxjs@6.6.7
+ rxjs: 6.6.7
+ transitivePeerDependencies:
+ - zenObservable
+ dev: true
+
+ /@sinclair/typebox/0.24.47:
+ resolution: {integrity: sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A==}
+ dev: true
+
+ /@sindresorhus/is/0.14.0:
+ resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /@sindresorhus/is/2.1.1:
+ resolution: {integrity: sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@sindresorhus/is/4.6.0:
+ resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@sinonjs/commons/1.8.3:
+ resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==}
+ dependencies:
+ type-detect: 4.0.8
+ dev: true
+
+ /@sinonjs/fake-timers/9.1.2:
+ resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==}
+ dependencies:
+ '@sinonjs/commons': 1.8.3
+ dev: true
+
+ /@szmarczak/http-timer/1.1.2:
+ resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==}
+ engines: {node: '>=6'}
+ dependencies:
+ defer-to-connect: 1.1.3
+ dev: true
+
+ /@szmarczak/http-timer/4.0.6:
+ resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
+ engines: {node: '>=10'}
+ dependencies:
+ defer-to-connect: 2.0.1
+ dev: true
+
+ /@ts-morph/common/0.17.0:
+ resolution: {integrity: sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==}
+ dependencies:
+ fast-glob: 3.2.12
+ minimatch: 5.1.0
+ mkdirp: 1.0.4
+ path-browserify: 1.0.1
+ dev: true
+
+ /@types/babel__core/7.1.19:
+ resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==}
+ dependencies:
+ '@babel/parser': 7.19.6
+ '@babel/types': 7.19.4
+ '@types/babel__generator': 7.6.4
+ '@types/babel__template': 7.4.1
+ '@types/babel__traverse': 7.18.2
+ dev: true
+
+ /@types/babel__generator/7.6.2:
+ resolution: {integrity: sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@types/babel__generator/7.6.4:
+ resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@types/babel__template/7.4.1:
+ resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
+ dependencies:
+ '@babel/parser': 7.19.6
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@types/babel__traverse/7.11.0:
+ resolution: {integrity: sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@types/babel__traverse/7.18.2:
+ resolution: {integrity: sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@types/cacheable-request/6.0.2:
+ resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==}
+ dependencies:
+ '@types/http-cache-semantics': 4.0.1
+ '@types/keyv': 3.1.4
+ '@types/node': 18.11.3
+ '@types/responselike': 1.0.0
+ dev: true
+
+ /@types/dedent/0.7.0:
+ resolution: {integrity: sha512-EGlKlgMhnLt/cM4DbUSafFdrkeJoC9Mvnj0PUCU7tFmTjMjNRT957kXCx0wYm3JuEq4o4ZsS5vG+NlkM2DMd2A==}
+ dev: true
+
+ /@types/eslint/7.2.6:
+ resolution: {integrity: sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==}
+ dependencies:
+ '@types/estree': 1.0.0
+ '@types/json-schema': 7.0.11
+ dev: true
+
+ /@types/eslint/8.4.7:
+ resolution: {integrity: sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw==}
+ dependencies:
+ '@types/estree': 1.0.0
+ '@types/json-schema': 7.0.11
+ dev: true
+
+ /@types/estree/1.0.0:
+ resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==}
+ dev: true
+
+ /@types/glob/7.1.3:
+ resolution: {integrity: sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==}
+ dependencies:
+ '@types/minimatch': 3.0.3
+ '@types/node': 18.11.3
+ dev: true
+
+ /@types/graceful-fs/4.1.5:
+ resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==}
+ dependencies:
+ '@types/node': 18.11.3
+ dev: true
+
+ /@types/http-cache-semantics/4.0.1:
+ resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
+ dev: true
+
+ /@types/istanbul-lib-coverage/2.0.4:
+ resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
+
+ /@types/istanbul-lib-report/3.0.0:
+ resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==}
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.4
+
+ /@types/istanbul-reports/3.0.1:
+ resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==}
+ dependencies:
+ '@types/istanbul-lib-report': 3.0.0
+
+ /@types/jest/29.0.0:
+ resolution: {integrity: sha512-X6Zjz3WO4cT39Gkl0lZ2baFRaEMqJl5NC1OjElkwtNzAlbkr2K/WJXkBkH5VP0zx4Hgsd2TZYdOEfvp2Dxia+Q==}
+ dependencies:
+ expect: 29.2.1
+ pretty-format: 29.2.1
+ dev: true
+
+ /@types/js-yaml/3.12.5:
+ resolution: {integrity: sha512-JCcp6J0GV66Y4ZMDAQCXot4xprYB+Zfd3meK9+INSJeVZwJmHAW30BBEEkPzXswMXuiyReUGOP3GxrADc9wPww==}
+ dev: true
+
+ /@types/json-schema/7.0.11:
+ resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
+ dev: true
+
+ /@types/json5/0.0.29:
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ dev: true
+
+ /@types/keyv/3.1.4:
+ resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
+ dependencies:
+ '@types/node': 18.11.3
+ dev: true
+
+ /@types/lodash/4.14.165:
+ resolution: {integrity: sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg==}
+ dev: true
+
+ /@types/minimatch/3.0.3:
+ resolution: {integrity: sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==}
+ dev: true
+
+ /@types/minimist/1.2.2:
+ resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==}
+ dev: true
+
+ /@types/node/14.18.32:
+ resolution: {integrity: sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==}
+ dev: true
+
+ /@types/node/18.11.3:
+ resolution: {integrity: sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==}
+
+ /@types/normalize-package-data/2.4.1:
+ resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
+
+ /@types/parse-json/4.0.0:
+ resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
+ dev: true
+
+ /@types/prettier/2.7.1:
+ resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==}
+ dev: true
+
+ /@types/responselike/1.0.0:
+ resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
+ dependencies:
+ '@types/node': 18.11.3
+ dev: true
+
+ /@types/semver/7.3.12:
+ resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==}
+ dev: true
+
+ /@types/stack-utils/2.0.1:
+ resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
+
+ /@types/yargs-parser/21.0.0:
+ resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
+
+ /@types/yargs/15.0.14:
+ resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==}
+ dependencies:
+ '@types/yargs-parser': 21.0.0
+
+ /@types/yargs/17.0.13:
+ resolution: {integrity: sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==}
+ dependencies:
+ '@types/yargs-parser': 21.0.0
+ dev: true
+
+ /@typescript-eslint/eslint-plugin/5.38.1_wngjumgc3dlvz7rlbb66uyvpxi:
+ resolution: {integrity: sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ '@typescript-eslint/scope-manager': 5.38.1
+ '@typescript-eslint/type-utils': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ '@typescript-eslint/utils': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ debug: 4.3.4
+ eslint: 8.23.0
+ ignore: 5.2.0
+ regexpp: 3.2.0
+ semver: 7.3.8
+ tsutils: 3.21.0_typescript@4.8.2
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/eslint-plugin/5.40.1_ghcq2hxpzlnfizbnoz3v5uflw4:
+ resolution: {integrity: sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ '@typescript-eslint/scope-manager': 5.40.1
+ '@typescript-eslint/type-utils': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ '@typescript-eslint/utils': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ debug: 4.3.4
+ eslint: 8.23.0
+ ignore: 5.2.0
+ regexpp: 3.2.0
+ semver: 7.3.8
+ tsutils: 3.21.0_typescript@4.8.2
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/experimental-utils/5.30.7_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-r218ZVL0zFBYzEq8/9K2ZhRgsmKUhm8xd3sWChgvTbmP98kHGuY83IUl64SS9fx9OSBM9vMLdzBfox4eDdm/ZQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@typescript-eslint/utils': 5.30.7_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/experimental-utils/5.38.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-Zv0EcU0iu64DiVG3pRZU0QYCgANO//U1fS3oEs3eqHD1eIVVcQsFd/T01ckaNbL2H2aCqRojY2xZuMAPcOArEA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@typescript-eslint/utils': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/parser/5.38.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-LDqxZBVFFQnQRz9rUZJhLmox+Ep5kdUmLatLQnCRR6523YV+XhRjfYzStQ4MheFA8kMAfUlclHSbu+RKdRwQKw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.38.1
+ '@typescript-eslint/types': 5.38.1
+ '@typescript-eslint/typescript-estree': 5.38.1_typescript@4.8.2
+ debug: 4.3.4
+ eslint: 8.23.0
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser/5.40.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.40.1
+ '@typescript-eslint/types': 5.40.1
+ '@typescript-eslint/typescript-estree': 5.40.1_typescript@4.8.2
+ debug: 4.3.4
+ eslint: 8.23.0
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/scope-manager/5.30.7:
+ resolution: {integrity: sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.30.7
+ '@typescript-eslint/visitor-keys': 5.30.7
+ dev: true
+
+ /@typescript-eslint/scope-manager/5.38.1:
+ resolution: {integrity: sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.38.1
+ '@typescript-eslint/visitor-keys': 5.38.1
+ dev: true
+
+ /@typescript-eslint/scope-manager/5.40.1:
+ resolution: {integrity: sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.40.1
+ '@typescript-eslint/visitor-keys': 5.40.1
+ dev: true
+
+ /@typescript-eslint/type-utils/5.38.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/typescript-estree': 5.38.1_typescript@4.8.2
+ '@typescript-eslint/utils': 5.38.1_yqf6kl63nyoq5megxukfnom5rm
+ debug: 4.3.4
+ eslint: 8.23.0
+ tsutils: 3.21.0_typescript@4.8.2
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/type-utils/5.40.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/typescript-estree': 5.40.1_typescript@4.8.2
+ '@typescript-eslint/utils': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ debug: 4.3.4
+ eslint: 8.23.0
+ tsutils: 3.21.0_typescript@4.8.2
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/types/5.30.7:
+ resolution: {integrity: sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@typescript-eslint/types/5.38.1:
+ resolution: {integrity: sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@typescript-eslint/types/5.40.1:
+ resolution: {integrity: sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree/5.30.7_typescript@4.8.2:
+ resolution: {integrity: sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.30.7
+ '@typescript-eslint/visitor-keys': 5.30.7
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.3.8
+ tsutils: 3.21.0_typescript@4.8.2
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/typescript-estree/5.38.1_typescript@4.8.2:
+ resolution: {integrity: sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.38.1
+ '@typescript-eslint/visitor-keys': 5.38.1
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.3.8
+ tsutils: 3.21.0_typescript@4.8.2
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/typescript-estree/5.40.1_typescript@4.8.2:
+ resolution: {integrity: sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.40.1
+ '@typescript-eslint/visitor-keys': 5.40.1
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.3.8
+ tsutils: 3.21.0_typescript@4.8.2
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils/5.30.7_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@types/json-schema': 7.0.11
+ '@typescript-eslint/scope-manager': 5.30.7
+ '@typescript-eslint/types': 5.30.7
+ '@typescript-eslint/typescript-estree': 5.30.7_typescript@4.8.2
+ eslint: 8.23.0
+ eslint-scope: 5.1.1
+ eslint-utils: 3.0.0_eslint@8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/utils/5.38.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@types/json-schema': 7.0.11
+ '@typescript-eslint/scope-manager': 5.38.1
+ '@typescript-eslint/types': 5.38.1
+ '@typescript-eslint/typescript-estree': 5.38.1_typescript@4.8.2
+ eslint: 8.23.0
+ eslint-scope: 5.1.1
+ eslint-utils: 3.0.0_eslint@8.23.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/utils/5.40.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@types/json-schema': 7.0.11
+ '@types/semver': 7.3.12
+ '@typescript-eslint/scope-manager': 5.40.1
+ '@typescript-eslint/types': 5.40.1
+ '@typescript-eslint/typescript-estree': 5.40.1_typescript@4.8.2
+ eslint: 8.23.0
+ eslint-scope: 5.1.1
+ eslint-utils: 3.0.0_eslint@8.23.0
+ semver: 7.3.8
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/visitor-keys/5.30.7:
+ resolution: {integrity: sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.30.7
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /@typescript-eslint/visitor-keys/5.38.1:
+ resolution: {integrity: sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.38.1
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /@typescript-eslint/visitor-keys/5.40.1:
+ resolution: {integrity: sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.40.1
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /acorn-jsx/5.3.2_acorn@8.8.0:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.8.0
+ dev: true
+
+ /acorn/8.8.0:
+ resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /aggregate-error/3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+ dev: true
+
+ /ajv/6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: true
+
+ /ansi-align/3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
+ /ansi-escapes/3.2.0:
+ resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /ansi-escapes/4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.21.3
+ dev: true
+
+ /ansi-regex/2.1.1:
+ resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ansi-regex/3.0.1:
+ resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /ansi-regex/4.1.1:
+ resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /ansi-regex/5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ /ansi-styles/2.2.1:
+ resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ansi-styles/3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+
+ /ansi-styles/4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+
+ /ansi-styles/5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /any-observable/0.3.0_rxjs@6.6.7:
+ resolution: {integrity: sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ rxjs: '*'
+ zenObservable: '*'
+ peerDependenciesMeta:
+ rxjs:
+ optional: true
+ zenObservable:
+ optional: true
+ dependencies:
+ rxjs: 6.6.7
+ dev: true
+
+ /any-observable/0.5.1_rxjs@6.6.7:
+ resolution: {integrity: sha512-8zv01bgDOp9PTmRTNCAHTw64TFP2rvlX4LvtNJLachaXY+AjmIvLT47fABNPCiIe89hKiSCo2n5zmPqI9CElPA==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ rxjs: '*'
+ zen-observable: '*'
+ peerDependenciesMeta:
+ rxjs:
+ optional: true
+ zen-observable:
+ optional: true
+ dependencies:
+ rxjs: 6.6.7
+ dev: true
+
+ /anymatch/3.1.2:
+ resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /arg/4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+ dev: true
+
+ /argparse/1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+ dependencies:
+ sprintf-js: 1.0.3
+
+ /argparse/2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: true
+
+ /aria-query/4.2.2:
+ resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==}
+ engines: {node: '>=6.0'}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@babel/runtime-corejs3': 7.19.6
+ dev: true
+
+ /array-includes/3.1.5:
+ resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /array-union/2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /array.prototype.flat/1.3.0:
+ resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ es-shim-unscopables: 1.0.0
+ dev: true
+
+ /array.prototype.flatmap/1.3.0:
+ resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ es-shim-unscopables: 1.0.0
+ dev: true
+
+ /arrify/1.0.1:
+ resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ast-types-flow/0.0.7:
+ resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
+ dev: true
+
+ /async-exit-hook/2.0.1:
+ resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /axe-core/4.4.3:
+ resolution: {integrity: sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /axobject-query/2.2.0:
+ resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==}
+ dev: true
+
+ /babel-jest/28.1.3_@babel+core@7.19.6:
+ resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ '@babel/core': ^7.8.0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@jest/transform': 28.1.3
+ '@types/babel__core': 7.1.19
+ babel-plugin-istanbul: 6.1.1
+ babel-preset-jest: 28.1.3_@babel+core@7.19.6
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ slash: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-istanbul/6.1.1:
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/helper-plugin-utils': 7.19.0
+ '@istanbuljs/load-nyc-config': 1.1.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-instrument: 5.2.1
+ test-exclude: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-jest-hoist/28.1.3:
+ resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@babel/template': 7.18.10
+ '@babel/types': 7.19.4
+ '@types/babel__core': 7.1.19
+ '@types/babel__traverse': 7.18.2
+ dev: true
+
+ /babel-preset-current-node-syntax/1.0.1_@babel+core@7.19.6:
+ resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.19.6
+ '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.19.6
+ '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.19.6
+ '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.19.6
+ '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.19.6
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.19.6
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.19.6
+ '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.19.6
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.19.6
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.19.6
+ '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.19.6
+ '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.19.6
+ dev: true
+
+ /babel-preset-jest/28.1.3_@babel+core@7.19.6:
+ resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.6
+ babel-plugin-jest-hoist: 28.1.3
+ babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.6
+ dev: true
+
+ /balanced-match/1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ /boxen/5.1.2:
+ resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ cli-boxes: 2.2.1
+ string-width: 4.2.3
+ type-fest: 0.20.2
+ widest-line: 3.1.0
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /brace-expansion/1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ /brace-expansion/2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
+ /braces/3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+
+ /browserslist/4.21.4:
+ resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001423
+ electron-to-chromium: 1.4.284
+ node-releases: 2.0.6
+ update-browserslist-db: 1.0.10_browserslist@4.21.4
+
+ /bs-logger/0.2.6:
+ resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
+ engines: {node: '>= 6'}
+ dependencies:
+ fast-json-stable-stringify: 2.1.0
+ dev: true
+
+ /bser/2.1.1:
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+ dependencies:
+ node-int64: 0.4.0
+ dev: true
+
+ /buffer-from/1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+ dev: true
+
+ /builtin-modules/3.3.0:
+ resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /builtins/1.0.3:
+ resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==}
+ dev: true
+
+ /cacheable-lookup/2.0.1:
+ resolution: {integrity: sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/keyv': 3.1.4
+ keyv: 4.5.0
+ dev: true
+
+ /cacheable-request/6.1.0:
+ resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==}
+ engines: {node: '>=8'}
+ dependencies:
+ clone-response: 1.0.3
+ get-stream: 5.2.0
+ http-cache-semantics: 4.1.0
+ keyv: 3.1.0
+ lowercase-keys: 2.0.0
+ normalize-url: 4.5.1
+ responselike: 1.0.2
+ dev: true
+
+ /cacheable-request/7.0.2:
+ resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==}
+ engines: {node: '>=8'}
+ dependencies:
+ clone-response: 1.0.3
+ get-stream: 5.2.0
+ http-cache-semantics: 4.1.0
+ keyv: 4.5.0
+ lowercase-keys: 2.0.0
+ normalize-url: 6.1.0
+ responselike: 2.0.1
+ dev: true
+
+ /call-bind/1.0.2:
+ resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ dependencies:
+ function-bind: 1.1.1
+ get-intrinsic: 1.1.3
+
+ /callsites/3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase-keys/6.2.2:
+ resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ camelcase: 5.3.1
+ map-obj: 4.3.0
+ quick-lru: 4.0.1
+ dev: true
+
+ /camelcase/5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase/6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /caniuse-lite/1.0.30001423:
+ resolution: {integrity: sha512-09iwWGOlifvE1XuHokFMP7eR38a0JnajoyL3/i87c8ZjRWRrdKo1fqjNfugfBD0UDBIOz0U+jtNhJ0EPm1VleQ==}
+
+ /chalk/1.1.3:
+ resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-styles: 2.2.1
+ escape-string-regexp: 1.0.5
+ has-ansi: 2.0.0
+ strip-ansi: 3.0.1
+ supports-color: 2.0.0
+ dev: true
+
+ /chalk/2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ /chalk/4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ /char-regex/1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /chardet/0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+ dev: true
+
+ /ci-info/2.0.0:
+ resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
+ dev: true
+
+ /ci-info/3.5.0:
+ resolution: {integrity: sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==}
+ dev: true
+
+ /cjs-module-lexer/1.2.2:
+ resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
+ dev: true
+
+ /clean-regexp/1.0.0:
+ resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
+ engines: {node: '>=4'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /clean-stack/2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-boxes/2.2.1:
+ resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-cursor/2.1.0:
+ resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==}
+ engines: {node: '>=4'}
+ dependencies:
+ restore-cursor: 2.0.0
+ dev: true
+
+ /cli-cursor/3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+ dependencies:
+ restore-cursor: 3.1.0
+ dev: true
+
+ /cli-truncate/0.2.1:
+ resolution: {integrity: sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ slice-ansi: 0.0.4
+ string-width: 1.0.2
+ dev: true
+
+ /cli-width/2.2.1:
+ resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==}
+ dev: true
+
+ /cli-width/3.0.0:
+ resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+ engines: {node: '>= 10'}
+ dev: true
+
+ /cliui/8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /clone-response/1.0.3:
+ resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
+ dependencies:
+ mimic-response: 1.0.1
+ dev: true
+
+ /co/4.6.0:
+ resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+ engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+ dev: true
+
+ /code-block-writer/11.0.3:
+ resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==}
+ dev: true
+
+ /code-point-at/1.1.0:
+ resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /collect-v8-coverage/1.0.1:
+ resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==}
+ dev: true
+
+ /color-convert/1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+
+ /color-convert/2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+
+ /color-name/1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ /color-name/1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ /concat-map/0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ /configstore/5.0.1:
+ resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==}
+ engines: {node: '>=8'}
+ dependencies:
+ dot-prop: 5.3.0
+ graceful-fs: 4.2.10
+ make-dir: 3.1.0
+ unique-string: 2.0.0
+ write-file-atomic: 3.0.3
+ xdg-basedir: 4.0.0
+ dev: true
+
+ /confusing-browser-globals/1.0.11:
+ resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
+ dev: true
+
+ /convert-source-map/1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+ /core-js-pure/3.25.5:
+ resolution: {integrity: sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==}
+ requiresBuild: true
+ dev: true
+
+ /cosmiconfig/7.0.1:
+ resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/parse-json': 4.0.0
+ import-fresh: 3.3.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+ dev: true
+
+ /create-require/1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+ dev: true
+
+ /cross-spawn/7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /crypto-random-string/2.0.0:
+ resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /damerau-levenshtein/1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+ dev: true
+
+ /date-fns/1.30.1:
+ resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==}
+ dev: true
+
+ /debug/2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ dev: true
+
+ /debug/3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+ dev: true
+
+ /debug/4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+
+ /decamelize-keys/1.1.0:
+ resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ decamelize: 1.2.0
+ map-obj: 1.0.1
+ dev: true
+
+ /decamelize/1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /decompress-response/3.3.0:
+ resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
+ engines: {node: '>=4'}
+ dependencies:
+ mimic-response: 1.0.1
+ dev: true
+
+ /decompress-response/5.0.0:
+ resolution: {integrity: sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==}
+ engines: {node: '>=10'}
+ dependencies:
+ mimic-response: 2.1.0
+ dev: true
+
+ /dedent/0.7.0:
+ resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+ dev: true
+
+ /deep-extend/0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /deep-is/0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /deepmerge-ts/4.2.2:
+ resolution: {integrity: sha512-Ka3Kb21tiWjvQvS9U+1Dx+aqFAHsdTnMdYptLTmC2VAmDFMugWMY1e15aTODstipmCun8iNuqeSfcx6rsUUk0Q==}
+ engines: {node: '>=12.4.0'}
+ dev: true
+
+ /deepmerge/4.2.2:
+ resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /defer-to-connect/1.1.3:
+ resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==}
+ dev: true
+
+ /defer-to-connect/2.0.1:
+ resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /define-properties/1.1.4:
+ resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-property-descriptors: 1.0.0
+ object-keys: 1.1.1
+
+ /del/6.1.1:
+ resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==}
+ engines: {node: '>=10'}
+ dependencies:
+ globby: 11.1.0
+ graceful-fs: 4.2.10
+ is-glob: 4.0.3
+ is-path-cwd: 2.2.0
+ is-path-inside: 3.0.3
+ p-map: 4.0.0
+ rimraf: 3.0.2
+ slash: 3.0.0
+ dev: true
+
+ /detect-newline/3.1.0:
+ resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /diff-sequences/26.6.2:
+ resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==}
+ engines: {node: '>= 10.14.2'}
+
+ /diff-sequences/28.1.1:
+ resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dev: true
+
+ /diff-sequences/29.2.0:
+ resolution: {integrity: sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /diff/4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
+ /dir-glob/3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: true
+
+ /doctrine/2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /doctrine/3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dot-prop/5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-obj: 2.0.0
+ dev: true
+
+ /dot-prop/6.0.1:
+ resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
+ engines: {node: '>=10'}
+ dependencies:
+ is-obj: 2.0.0
+ dev: true
+
+ /duplexer3/0.1.5:
+ resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
+ dev: true
+
+ /electron-to-chromium/1.4.284:
+ resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==}
+
+ /elegant-spinner/1.0.1:
+ resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /emittery/0.10.2:
+ resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /emoji-regex/8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: true
+
+ /emoji-regex/9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: true
+
+ /end-of-stream/1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ dependencies:
+ once: 1.4.0
+ dev: true
+
+ /error-ex/1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+
+ /es-abstract/1.20.4:
+ resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==}
+ engines: {node: '>= 0.4'}
+ 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.3
+ 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.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-weakref: 1.0.2
+ object-inspect: 1.12.2
+ object-keys: 1.1.1
+ object.assign: 4.1.4
+ regexp.prototype.flags: 1.4.3
+ safe-regex-test: 1.0.0
+ string.prototype.trimend: 1.0.5
+ string.prototype.trimstart: 1.0.5
+ unbox-primitive: 1.0.2
+
+ /es-shim-unscopables/1.0.0:
+ resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+ dependencies:
+ has: 1.0.3
+ dev: true
+
+ /es-to-primitive/1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
+
+ /escalade/3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+
+ /escape-goat/2.1.1:
+ resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /escape-goat/3.0.0:
+ resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /escape-string-regexp/1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ /escape-string-regexp/2.0.0:
+ resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+ engines: {node: '>=8'}
+
+ /escape-string-regexp/4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-config-xo-react/0.27.0_4obl5svsfbt6nzqvqzeno5erv4:
+ resolution: {integrity: sha512-wiV215xQIn71XZyyVfaOXHaFpR1B14IJttwOjMi/eqUK1s+ojJdHr7eHqTLaGUfh6FKgWha1QNwePlIXx7mBUg==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ eslint: '>=8.6.0'
+ eslint-plugin-react: '>=7.29.0'
+ eslint-plugin-react-hooks: '>=4.3.0'
+ dependencies:
+ eslint: 8.23.0
+ eslint-plugin-react: 7.31.10_eslint@8.23.0
+ eslint-plugin-react-hooks: 4.6.0_eslint@8.23.0
+ dev: true
+
+ /eslint-config-xo-typescript/0.53.0_yqruj2vud6favyjjbpx7uotp7a:
+ resolution: {integrity: sha512-IJ1n70egMPTou/41HoGGFbLf/2WCsVW5lSUxOSklrR8T1221fMRPVJxIVZ3evr8R+N5wR6uzg/0uzSymwWA5Bg==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': '>=5.31.0'
+ '@typescript-eslint/parser': '>=5.31.0'
+ eslint: '>=8.0.0'
+ typescript: '>=4.4'
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 5.40.1_ghcq2hxpzlnfizbnoz3v5uflw4
+ '@typescript-eslint/parser': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ typescript: 4.8.2
+ dev: true
+
+ /eslint-config-xo/0.42.0_eslint@8.23.0:
+ resolution: {integrity: sha512-HIfd+AM6tHFoaZ/NXYDV3Mr/CJrAj/DoP6IOYt1/v+90XtCwVYOfW7LXbRDYDmhQMzT16h7eqPRcex72waRqdA==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ eslint: '>=8.14.0'
+ dependencies:
+ confusing-browser-globals: 1.0.11
+ eslint: 8.23.0
+ dev: true
+
+ /eslint-import-resolver-node/0.3.6:
+ resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==}
+ dependencies:
+ debug: 3.2.7
+ resolve: 1.22.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-module-utils/2.7.4_jsofcan66fypmalzk7lrfvq7om:
+ resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ debug: 3.2.7
+ eslint: 8.23.0
+ eslint-import-resolver-node: 0.3.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-codegen/0.16.1:
+ resolution: {integrity: sha512-+mKDJezeoziyQOuPicRj6im1GxzxDvv+EgAZAOTIxBwaWTadppgwZGFMeUrWucNM2duJXmvLDcbsmVT69ORgQA==}
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/generator': 7.12.17
+ '@babel/parser': 7.19.6
+ '@babel/traverse': 7.19.6
+ expect: 26.6.2
+ fp-ts: 2.13.1
+ glob: 7.2.3
+ io-ts: 2.2.19_fp-ts@2.13.1
+ io-ts-extra: 0.11.6
+ js-yaml: 3.14.1
+ lodash: 4.17.21
+ read-pkg-up: 7.0.1
+ string.prototype.matchall: 4.0.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-functional/4.4.1_yqf6kl63nyoq5megxukfnom5rm:
+ resolution: {integrity: sha512-YhSfHS52Si62Sn126g9wGx+XnWMoWhwEt6ctVXfcJj+xMUiggjOqUVMca7fuLNzX8jYiNBIeU1Y0teHGePZ3NA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^8.0.0
+ tsutils: ^3.0.0
+ typescript: ^3.4.1 || ^4.0.0
+ peerDependenciesMeta:
+ tsutils:
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/utils': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ deepmerge-ts: 4.2.2
+ escape-string-regexp: 4.0.0
+ eslint: 8.23.0
+ semver: 7.3.8
+ typescript: 4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-import/2.26.0_wyz7qklltnlaqz4spn62k7idzq:
+ resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ array-includes: 3.1.5
+ array.prototype.flat: 1.3.0
+ debug: 2.6.9
+ doctrine: 2.1.0
+ eslint: 8.23.0
+ eslint-import-resolver-node: 0.3.6
+ eslint-module-utils: 2.7.4_jsofcan66fypmalzk7lrfvq7om
+ has: 1.0.3
+ is-core-module: 2.11.0
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.values: 1.1.5
+ resolve: 1.22.1
+ tsconfig-paths: 3.14.1
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-plugin-jest/27.1.3_qjdmv3cldmh7c4honmmroynun4:
+ resolution: {integrity: sha512-7DrIfYRQPa7JQd1Le8G/BJsfYHVUKQdJQ/6vULSp/4NjKZmSMJ/605G2hhScEra++SiH68zPEjLnrO74nHrMLg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': ^5.0.0
+ eslint: ^7.0.0 || ^8.0.0
+ jest: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/eslint-plugin':
+ optional: true
+ jest:
+ optional: true
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 5.40.1_ghcq2hxpzlnfizbnoz3v5uflw4
+ '@typescript-eslint/utils': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ eslint: 8.23.0
+ jest: 28.1.3_t5r4bv5a32g5njay4bmjlrj2cu
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /eslint-plugin-jsx-a11y/6.6.1_eslint@8.23.0:
+ resolution: {integrity: sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ dependencies:
+ '@babel/runtime': 7.19.4
+ aria-query: 4.2.2
+ array-includes: 3.1.5
+ ast-types-flow: 0.0.7
+ axe-core: 4.4.3
+ axobject-query: 2.2.0
+ damerau-levenshtein: 1.0.8
+ emoji-regex: 9.2.2
+ eslint: 8.23.0
+ has: 1.0.3
+ jsx-ast-utils: 3.3.3
+ language-tags: 1.0.5
+ minimatch: 3.1.2
+ semver: 6.3.0
+ dev: true
+
+ /eslint-plugin-mmkal/0.0.1-2_njvpd7oexm4jrpqkdx4xx3mxbm:
+ resolution: {integrity: sha512-/nmHcVuvdNtX3bxSQ/McZXRZf4smf3eUbz/6Z/gbRtkufMBTjyIzNsFJb0aV5fIuroxFauqA2TNqPc8DlQQmgQ==}
+ dependencies:
+ '@rushstack/eslint-config': 3.1.1_yqf6kl63nyoq5megxukfnom5rm
+ '@rushstack/eslint-plugin': 0.10.0_yqf6kl63nyoq5megxukfnom5rm
+ '@rushstack/eslint-plugin-packlets': 0.5.0_yqf6kl63nyoq5megxukfnom5rm
+ '@rushstack/eslint-plugin-security': 0.4.0_yqf6kl63nyoq5megxukfnom5rm
+ '@types/eslint': 8.4.7
+ '@typescript-eslint/eslint-plugin': 5.40.1_ghcq2hxpzlnfizbnoz3v5uflw4
+ '@typescript-eslint/parser': 5.40.1_yqf6kl63nyoq5megxukfnom5rm
+ eslint-config-xo: 0.42.0_eslint@8.23.0
+ eslint-config-xo-react: 0.27.0_4obl5svsfbt6nzqvqzeno5erv4
+ eslint-config-xo-typescript: 0.53.0_yqruj2vud6favyjjbpx7uotp7a
+ eslint-plugin-codegen: 0.16.1
+ eslint-plugin-functional: 4.4.1_yqf6kl63nyoq5megxukfnom5rm
+ eslint-plugin-import: 2.26.0_wyz7qklltnlaqz4spn62k7idzq
+ eslint-plugin-jest: 27.1.3_qjdmv3cldmh7c4honmmroynun4
+ eslint-plugin-jsx-a11y: 6.6.1_eslint@8.23.0
+ eslint-plugin-prettier: 4.2.1_bxpuzolsxufkw2ipnoyzzxnyrm
+ eslint-plugin-promise: 6.1.1_eslint@8.23.0
+ eslint-plugin-react: 7.31.10_eslint@8.23.0
+ eslint-plugin-react-hooks: 4.6.0_eslint@8.23.0
+ eslint-plugin-unicorn: 43.0.2_eslint@8.23.0
+ eslint-plugin-wrapper: 0.0.3
+ lodash: 4.17.21
+ prettier: 2.7.1
+ transitivePeerDependencies:
+ - eslint
+ - eslint-config-prettier
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - jest
+ - supports-color
+ - tsutils
+ - typescript
+ dev: true
+
+ /eslint-plugin-prettier/4.2.1_bxpuzolsxufkw2ipnoyzzxnyrm:
+ resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ eslint: '>=7.28.0'
+ eslint-config-prettier: '*'
+ prettier: '>=2.0.0'
+ peerDependenciesMeta:
+ eslint-config-prettier:
+ optional: true
+ dependencies:
+ eslint: 8.23.0
+ prettier: 2.7.1
+ prettier-linter-helpers: 1.0.0
+ dev: true
+
+ /eslint-plugin-promise/6.0.1_eslint@8.23.0:
+ resolution: {integrity: sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0
+ dependencies:
+ eslint: 8.23.0
+ dev: true
+
+ /eslint-plugin-promise/6.1.1_eslint@8.23.0:
+ resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0
+ dependencies:
+ eslint: 8.23.0
+ dev: true
+
+ /eslint-plugin-react-hooks/4.6.0_eslint@8.23.0:
+ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ dependencies:
+ eslint: 8.23.0
+ dev: true
+
+ /eslint-plugin-react/7.27.1_eslint@8.23.0:
+ resolution: {integrity: sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ dependencies:
+ array-includes: 3.1.5
+ array.prototype.flatmap: 1.3.0
+ doctrine: 2.1.0
+ eslint: 8.23.0
+ estraverse: 5.3.0
+ jsx-ast-utils: 3.3.3
+ 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.4
+ semver: 6.3.0
+ string.prototype.matchall: 4.0.7
+ dev: true
+
+ /eslint-plugin-react/7.31.10_eslint@8.23.0:
+ resolution: {integrity: sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ dependencies:
+ array-includes: 3.1.5
+ array.prototype.flatmap: 1.3.0
+ doctrine: 2.1.0
+ eslint: 8.23.0
+ estraverse: 5.3.0
+ jsx-ast-utils: 3.3.3
+ 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.4
+ semver: 6.3.0
+ string.prototype.matchall: 4.0.7
+ dev: true
+
+ /eslint-plugin-tsdoc/0.2.17:
+ resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==}
+ dependencies:
+ '@microsoft/tsdoc': 0.14.2
+ '@microsoft/tsdoc-config': 0.16.2
+ dev: true
+
+ /eslint-plugin-unicorn/43.0.2_eslint@8.23.0:
+ resolution: {integrity: sha512-DtqZ5mf/GMlfWoz1abIjq5jZfaFuHzGBZYIeuJfEoKKGWRHr2JiJR+ea+BF7Wx2N1PPRoT/2fwgiK1NnmNE3Hg==}
+ engines: {node: '>=14.18'}
+ peerDependencies:
+ eslint: '>=8.18.0'
+ dependencies:
+ '@babel/helper-validator-identifier': 7.19.1
+ ci-info: 3.5.0
+ clean-regexp: 1.0.0
+ eslint: 8.23.0
+ eslint-utils: 3.0.0_eslint@8.23.0
+ esquery: 1.4.0
+ indent-string: 4.0.0
+ is-builtin-module: 3.2.0
+ lodash: 4.17.21
+ pluralize: 8.0.0
+ read-pkg-up: 7.0.1
+ regexp-tree: 0.1.24
+ safe-regex: 2.1.1
+ semver: 7.3.8
+ strip-indent: 3.0.0
+ dev: true
+
+ /eslint-plugin-wrapper/0.0.3:
+ resolution: {integrity: sha512-3TTbwODwacBi+ce6hPiq5vq7Rc+/C5SRZNyAmiaJ0l+9hehS5jXpSQkL5aBArGj0Icvctf/xGQKJeZ1bn5p0lA==}
+ dev: true
+
+ /eslint-scope/5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+ dev: true
+
+ /eslint-scope/7.1.1:
+ resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
+ /eslint-utils/3.0.0_eslint@8.23.0:
+ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+ peerDependencies:
+ eslint: '>=5'
+ dependencies:
+ eslint: 8.23.0
+ eslint-visitor-keys: 2.1.0
+ dev: true
+
+ /eslint-visitor-keys/2.1.0:
+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-visitor-keys/3.3.0:
+ resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint/8.23.0:
+ resolution: {integrity: sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@eslint/eslintrc': 1.3.3
+ '@humanwhocodes/config-array': 0.10.7
+ '@humanwhocodes/gitignore-to-minimatch': 1.0.2
+ '@humanwhocodes/module-importer': 1.0.1
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.1.1
+ eslint-utils: 3.0.0_eslint@8.23.0
+ eslint-visitor-keys: 3.3.0
+ espree: 9.4.0
+ esquery: 1.4.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ functional-red-black-tree: 1.0.1
+ glob-parent: 6.0.2
+ globals: 13.17.0
+ globby: 11.1.0
+ grapheme-splitter: 1.0.4
+ ignore: 5.2.0
+ import-fresh: 3.3.0
+ imurmurhash: 0.1.4
+ is-glob: 4.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
+ regexpp: 3.2.0
+ strip-ansi: 6.0.1
+ strip-json-comments: 3.1.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /espree/9.4.0:
+ resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.8.0
+ acorn-jsx: 5.3.2_acorn@8.8.0
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /esprima/4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ /esquery/1.4.0:
+ resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse/4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse/4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estraverse/5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /esutils/2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /execa/5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
+ /exit/0.1.2:
+ resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /expect-type/0.14.0:
+ resolution: {integrity: sha512-c1b8FMNk9lUP+ho7z4Fgug6wyqvT/its7EWzZ8kRvJkGlNmvAk5ZKHlan5VVYuozY+3C9iWRYX/cK6DQvduhRQ==}
+ dev: true
+
+ /expect/26.6.2:
+ resolution: {integrity: sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==}
+ engines: {node: '>= 10.14.2'}
+ dependencies:
+ '@jest/types': 26.6.2
+ ansi-styles: 4.3.0
+ jest-get-type: 26.3.0
+ jest-matcher-utils: 26.6.2
+ jest-message-util: 26.6.2
+ jest-regex-util: 26.0.0
+
+ /expect/28.1.3:
+ resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/expect-utils': 28.1.3
+ jest-get-type: 28.0.2
+ jest-matcher-utils: 28.1.3
+ jest-message-util: 28.1.3
+ jest-util: 28.1.3
+ dev: true
+
+ /expect/29.2.1:
+ resolution: {integrity: sha512-BJtA754Fba0YWRWHgjKUMTA3ltWarKgITXHQnbZ2mTxTXC4yMQlR0FI7HkB3fJYkhWBf4qjNiqvg3LDtXCcVRQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/expect-utils': 29.2.1
+ jest-get-type: 29.2.0
+ jest-matcher-utils: 29.2.1
+ jest-message-util: 29.2.1
+ jest-util: 29.2.1
+ dev: true
+
+ /external-editor/3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+ dev: true
+
+ /fast-deep-equal/3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
+
+ /fast-diff/1.2.0:
+ resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
+ dev: true
+
+ /fast-glob/3.2.12:
+ resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
+ /fast-json-stable-stringify/2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
+
+ /fast-levenshtein/2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
+
+ /fastq/1.13.0:
+ resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /fb-watchman/2.0.2:
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+ dependencies:
+ bser: 2.1.1
+ dev: true
+
+ /figures/1.7.0:
+ resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ object-assign: 4.1.1
+ dev: true
+
+ /figures/2.0.0:
+ resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==}
+ engines: {node: '>=4'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /figures/3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /file-entry-cache/6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flat-cache: 3.0.4
+ dev: true
+
+ /fill-range/7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+
+ /find-up/4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
+ /find-up/5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /flat-cache/3.0.4:
+ resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flatted: 3.2.7
+ rimraf: 3.0.2
+ dev: true
+
+ /flatted/3.2.7:
+ resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
+ dev: true
+
+ /fp-ts/2.13.1:
+ resolution: {integrity: sha512-0eu5ULPS2c/jsa1lGFneEFFEdTbembJv8e4QKXeVJ3lm/5hyve06dlKZrpxmMwJt6rYen7sxmHHK2CLaXvWuWQ==}
+
+ /fs.realpath/1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ /fsevents/2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /function-bind/1.1.1:
+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+
+ /function.prototype.name/1.1.5:
+ resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ functions-have-names: 1.2.3
+
+ /functional-red-black-tree/1.0.1:
+ resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+ dev: true
+
+ /functions-have-names/1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ /gensync/1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ /get-caller-file/2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+ dev: true
+
+ /get-intrinsic/1.1.3:
+ resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==}
+ dependencies:
+ function-bind: 1.1.1
+ has: 1.0.3
+ has-symbols: 1.0.3
+
+ /get-package-type/0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+ dev: true
+
+ /get-stream/4.1.0:
+ resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
+ engines: {node: '>=6'}
+ dependencies:
+ pump: 3.0.0
+ dev: true
+
+ /get-stream/5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+ dependencies:
+ pump: 3.0.0
+ dev: true
+
+ /get-stream/6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /get-symbol-description/1.0.0:
+ resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+
+ /github-url-from-git/1.5.0:
+ resolution: {integrity: sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==}
+ dev: true
+
+ /glob-parent/5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-parent/6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob/7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ /global-dirs/2.1.0:
+ resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ini: 1.3.7
+ dev: true
+
+ /global-dirs/3.0.0:
+ resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ini: 2.0.0
+ dev: true
+
+ /globals/11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ /globals/13.17.0:
+ resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globby/11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.2.12
+ ignore: 5.2.0
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: true
+
+ /got/10.7.0:
+ resolution: {integrity: sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@sindresorhus/is': 2.1.1
+ '@szmarczak/http-timer': 4.0.6
+ '@types/cacheable-request': 6.0.2
+ '@types/keyv': 3.1.4
+ '@types/responselike': 1.0.0
+ cacheable-lookup: 2.0.1
+ cacheable-request: 7.0.2
+ decompress-response: 5.0.0
+ duplexer3: 0.1.5
+ get-stream: 5.2.0
+ lowercase-keys: 2.0.0
+ mimic-response: 2.1.0
+ p-cancelable: 2.1.1
+ p-event: 4.2.0
+ responselike: 2.0.1
+ to-readable-stream: 2.1.0
+ type-fest: 0.10.0
+ dev: true
+
+ /got/9.6.0:
+ resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ '@sindresorhus/is': 0.14.0
+ '@szmarczak/http-timer': 1.1.2
+ '@types/keyv': 3.1.4
+ '@types/responselike': 1.0.0
+ cacheable-request: 6.1.0
+ decompress-response: 3.3.0
+ duplexer3: 0.1.5
+ get-stream: 4.1.0
+ lowercase-keys: 1.0.1
+ mimic-response: 1.0.1
+ p-cancelable: 1.1.0
+ to-readable-stream: 1.0.0
+ url-parse-lax: 3.0.0
+ dev: true
+
+ /graceful-fs/4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+
+ /grapheme-splitter/1.0.4:
+ resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
+ dev: true
+
+ /hard-rejection/2.1.0:
+ resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /has-ansi/2.0.0:
+ resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-regex: 2.1.1
+ dev: true
+
+ /has-bigints/1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+
+ /has-flag/3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ /has-flag/4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ /has-property-descriptors/1.0.0:
+ resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ dependencies:
+ get-intrinsic: 1.1.3
+
+ /has-symbols/1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+
+ /has-tostringtag/1.0.0:
+ resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+
+ /has-yarn/2.1.0:
+ resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has/1.0.3:
+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
+ engines: {node: '>= 0.4.0'}
+ dependencies:
+ function-bind: 1.1.1
+
+ /hosted-git-info/2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+
+ /hosted-git-info/3.0.8:
+ resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /hosted-git-info/4.1.0:
+ resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
+ engines: {node: '>=10'}
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /html-escaper/2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ dev: true
+
+ /http-cache-semantics/4.1.0:
+ resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==}
+ dev: true
+
+ /human-signals/2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ dev: true
+
+ /iconv-lite/0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+
+ /ignore-walk/3.0.4:
+ resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==}
+ dependencies:
+ minimatch: 3.1.2
+ dev: true
+
+ /ignore/5.2.0:
+ resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /import-fresh/3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /import-lazy/2.1.0:
+ resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /import-local/3.1.0:
+ resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ pkg-dir: 4.2.0
+ resolve-cwd: 3.0.0
+ dev: true
+
+ /imurmurhash/0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /indent-string/3.2.0:
+ resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /indent-string/4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /inflight/1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ /inherits/2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ /ini/1.3.7:
+ resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==}
+ dev: true
+
+ /ini/1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: true
+
+ /ini/2.0.0:
+ resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /inquirer-autosubmit-prompt/0.2.0:
+ resolution: {integrity: sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==}
+ dependencies:
+ chalk: 2.4.2
+ inquirer: 6.5.2
+ rxjs: 6.6.7
+ dev: true
+
+ /inquirer/6.5.2:
+ resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ ansi-escapes: 3.2.0
+ chalk: 2.4.2
+ cli-cursor: 2.1.0
+ cli-width: 2.2.1
+ external-editor: 3.1.0
+ figures: 2.0.0
+ lodash: 4.17.21
+ mute-stream: 0.0.7
+ run-async: 2.4.1
+ rxjs: 6.6.7
+ string-width: 2.1.1
+ strip-ansi: 5.2.0
+ through: 2.3.8
+ dev: true
+
+ /inquirer/7.3.3:
+ resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ run-async: 2.4.1
+ rxjs: 6.6.7
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ dev: true
+
+ /internal-slot/1.0.3:
+ resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.1.3
+ has: 1.0.3
+ side-channel: 1.0.4
+
+ /io-ts-extra/0.11.6:
+ resolution: {integrity: sha512-rTsvx3W5B2nx7p/eGf+OsEaBTmjSjLzxBDEiweCjwqIL9ZN6CZjG7hFK8zyGJyM0I2uCsRU4uYUhaTgg2SKHkQ==}
+ dependencies:
+ fp-ts: 2.13.1
+ io-ts: 2.2.19_fp-ts@2.13.1
+
+ /io-ts/2.2.19_fp-ts@2.13.1:
+ resolution: {integrity: sha512-ED0GQwvKRr5C2jqOOJCkuJW2clnbzqFexQ8V7Qsb+VB36S1Mk/OKH7k0FjSe4mjKy9qBRA3OqgVGyFMUEKIubw==}
+ peerDependencies:
+ fp-ts: ^2.5.0
+ dependencies:
+ fp-ts: 2.13.1
+
+ /is-arrayish/0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ /is-bigint/1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ dependencies:
+ has-bigints: 1.0.2
+
+ /is-boolean-object/1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ has-tostringtag: 1.0.0
+
+ /is-builtin-module/3.2.0:
+ resolution: {integrity: sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==}
+ engines: {node: '>=6'}
+ dependencies:
+ builtin-modules: 3.3.0
+ dev: true
+
+ /is-callable/1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ /is-ci/2.0.0:
+ resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
+ hasBin: true
+ dependencies:
+ ci-info: 2.0.0
+ dev: true
+
+ /is-core-module/2.11.0:
+ resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
+ dependencies:
+ has: 1.0.3
+
+ /is-date-object/1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+
+ /is-docker/2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dev: true
+
+ /is-extglob/2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-fullwidth-code-point/1.0.0:
+ resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ number-is-nan: 1.0.1
+ dev: true
+
+ /is-fullwidth-code-point/2.0.0:
+ resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /is-fullwidth-code-point/3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-generator-fn/2.1.0:
+ resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /is-glob/4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-installed-globally/0.3.2:
+ resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==}
+ engines: {node: '>=8'}
+ dependencies:
+ global-dirs: 2.1.0
+ is-path-inside: 3.0.3
+ dev: true
+
+ /is-installed-globally/0.4.0:
+ resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ global-dirs: 3.0.0
+ is-path-inside: 3.0.3
+ dev: true
+
+ /is-interactive/1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-negative-zero/2.0.2:
+ resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+ engines: {node: '>= 0.4'}
+
+ /is-npm/5.0.0:
+ resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /is-number-object/1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+
+ /is-number/7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ /is-obj/2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-observable/1.1.0:
+ resolution: {integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==}
+ engines: {node: '>=4'}
+ dependencies:
+ symbol-observable: 1.2.0
+ dev: true
+
+ /is-path-cwd/2.2.0:
+ resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /is-path-inside/3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-plain-obj/1.1.0:
+ resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-promise/2.2.2:
+ resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
+ dev: true
+
+ /is-regex/1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ has-tostringtag: 1.0.0
+
+ /is-scoped/2.1.0:
+ resolution: {integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ scoped-regex: 2.1.0
+ dev: true
+
+ /is-shared-array-buffer/1.0.2:
+ resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ dependencies:
+ call-bind: 1.0.2
+
+ /is-stream/1.1.0:
+ resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-stream/2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-string/1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+
+ /is-symbol/1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+
+ /is-typedarray/1.0.0:
+ resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+ dev: true
+
+ /is-unicode-supported/0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /is-url-superb/4.0.0:
+ resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /is-weakref/1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ dependencies:
+ call-bind: 1.0.2
+
+ /is-wsl/2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ dev: true
+
+ /is-yarn-global/0.3.0:
+ resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==}
+ dev: true
+
+ /isexe/2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /issue-regex/3.1.0:
+ resolution: {integrity: sha512-0RHjbtw9QXeSYnIEY5Yrp2QZrdtz21xBDV9C/GIlY2POmgoS6a7qjkYS5siRKXScnuAj5/SPv1C3YForNCHTJA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /istanbul-lib-coverage/3.2.0:
+ resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /istanbul-lib-instrument/5.2.1:
+ resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/parser': 7.19.6
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.0
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-lib-report/3.0.0:
+ resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==}
+ engines: {node: '>=8'}
+ dependencies:
+ istanbul-lib-coverage: 3.2.0
+ make-dir: 3.1.0
+ supports-color: 7.2.0
+ dev: true
+
+ /istanbul-lib-source-maps/4.0.1:
+ resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+ engines: {node: '>=10'}
+ dependencies:
+ debug: 4.3.4
+ istanbul-lib-coverage: 3.2.0
+ source-map: 0.6.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-reports/3.1.5:
+ resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==}
+ engines: {node: '>=8'}
+ dependencies:
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.0
+ dev: true
+
+ /jest-changed-files/28.1.3:
+ resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ execa: 5.1.1
+ p-limit: 3.1.0
+ dev: true
+
+ /jest-circus/28.1.3:
+ resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/environment': 28.1.3
+ '@jest/expect': 28.1.3
+ '@jest/test-result': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ chalk: 4.1.2
+ co: 4.6.0
+ dedent: 0.7.0
+ is-generator-fn: 2.1.0
+ jest-each: 28.1.3
+ jest-matcher-utils: 28.1.3
+ jest-message-util: 28.1.3
+ jest-runtime: 28.1.3
+ jest-snapshot: 28.1.3
+ jest-util: 28.1.3
+ p-limit: 3.1.0
+ pretty-format: 28.1.3
+ slash: 3.0.0
+ stack-utils: 2.0.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-cli/28.1.3_t5r4bv5a32g5njay4bmjlrj2cu:
+ resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ hasBin: true
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@jest/core': 28.1.3_ts-node@9.1.1
+ '@jest/test-result': 28.1.3
+ '@jest/types': 28.1.3
+ chalk: 4.1.2
+ exit: 0.1.2
+ graceful-fs: 4.2.10
+ import-local: 3.1.0
+ jest-config: 28.1.3_t5r4bv5a32g5njay4bmjlrj2cu
+ jest-util: 28.1.3
+ jest-validate: 28.1.3
+ prompts: 2.4.2
+ yargs: 17.6.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - supports-color
+ - ts-node
+ dev: true
+
+ /jest-config/28.1.3_5vj5zoyyyfvasyfxgnsdm7xdjm:
+ resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ '@types/node': '*'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ '@babel/core': 7.19.6
+ '@jest/test-sequencer': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ babel-jest: 28.1.3_@babel+core@7.19.6
+ chalk: 4.1.2
+ ci-info: 3.5.0
+ deepmerge: 4.2.2
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ jest-circus: 28.1.3
+ jest-environment-node: 28.1.3
+ jest-get-type: 28.0.2
+ jest-regex-util: 28.0.2
+ jest-resolve: 28.1.3
+ jest-runner: 28.1.3
+ jest-util: 28.1.3
+ jest-validate: 28.1.3
+ micromatch: 4.0.5
+ parse-json: 5.2.0
+ pretty-format: 28.1.3
+ slash: 3.0.0
+ strip-json-comments: 3.1.1
+ ts-node: 9.1.1_typescript@4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-config/28.1.3_t5r4bv5a32g5njay4bmjlrj2cu:
+ resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ '@types/node': '*'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ '@babel/core': 7.19.6
+ '@jest/test-sequencer': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 14.18.32
+ babel-jest: 28.1.3_@babel+core@7.19.6
+ chalk: 4.1.2
+ ci-info: 3.5.0
+ deepmerge: 4.2.2
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ jest-circus: 28.1.3
+ jest-environment-node: 28.1.3
+ jest-get-type: 28.0.2
+ jest-regex-util: 28.0.2
+ jest-resolve: 28.1.3
+ jest-runner: 28.1.3
+ jest-util: 28.1.3
+ jest-validate: 28.1.3
+ micromatch: 4.0.5
+ parse-json: 5.2.0
+ pretty-format: 28.1.3
+ slash: 3.0.0
+ strip-json-comments: 3.1.1
+ ts-node: 9.1.1_typescript@4.8.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-diff/26.6.2:
+ resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==}
+ engines: {node: '>= 10.14.2'}
+ dependencies:
+ chalk: 4.1.2
+ diff-sequences: 26.6.2
+ jest-get-type: 26.3.0
+ pretty-format: 26.6.2
+
+ /jest-diff/28.1.3:
+ resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ chalk: 4.1.2
+ diff-sequences: 28.1.1
+ jest-get-type: 28.0.2
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-diff/29.2.1:
+ resolution: {integrity: sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ chalk: 4.1.2
+ diff-sequences: 29.2.0
+ jest-get-type: 29.2.0
+ pretty-format: 29.2.1
+ dev: true
+
+ /jest-docblock/28.1.1:
+ resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ detect-newline: 3.1.0
+ dev: true
+
+ /jest-each/28.1.3:
+ resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ chalk: 4.1.2
+ jest-get-type: 28.0.2
+ jest-util: 28.1.3
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-environment-node/28.1.3:
+ resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/environment': 28.1.3
+ '@jest/fake-timers': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ jest-mock: 28.1.3
+ jest-util: 28.1.3
+ dev: true
+
+ /jest-get-type/26.3.0:
+ resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==}
+ engines: {node: '>= 10.14.2'}
+
+ /jest-get-type/28.0.2:
+ resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dev: true
+
+ /jest-get-type/29.2.0:
+ resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /jest-haste-map/28.1.3:
+ resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@types/graceful-fs': 4.1.5
+ '@types/node': 18.11.3
+ anymatch: 3.1.2
+ fb-watchman: 2.0.2
+ graceful-fs: 4.2.10
+ jest-regex-util: 28.0.2
+ jest-util: 28.1.3
+ jest-worker: 28.1.3
+ micromatch: 4.0.5
+ walker: 1.0.8
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /jest-leak-detector/28.1.3:
+ resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ jest-get-type: 28.0.2
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-matcher-utils/26.6.2:
+ resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==}
+ engines: {node: '>= 10.14.2'}
+ dependencies:
+ chalk: 4.1.2
+ jest-diff: 26.6.2
+ jest-get-type: 26.3.0
+ pretty-format: 26.6.2
+
+ /jest-matcher-utils/28.1.3:
+ resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ chalk: 4.1.2
+ jest-diff: 28.1.3
+ jest-get-type: 28.0.2
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-matcher-utils/29.2.1:
+ resolution: {integrity: sha512-hUTBh7H/Mnb6GTpihbLh8uF5rjAMdekfW/oZNXUMAXi7bbmym2HiRpzgqf/zzkjgejMrVAkPdVSQj+32enlUww==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ chalk: 4.1.2
+ jest-diff: 29.2.1
+ jest-get-type: 29.2.0
+ pretty-format: 29.2.1
+ dev: true
+
+ /jest-message-util/26.6.2:
+ resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==}
+ engines: {node: '>= 10.14.2'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@jest/types': 26.6.2
+ '@types/stack-utils': 2.0.1
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ micromatch: 4.0.5
+ pretty-format: 26.6.2
+ slash: 3.0.0
+ stack-utils: 2.0.5
+
+ /jest-message-util/28.1.3:
+ resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@jest/types': 28.1.3
+ '@types/stack-utils': 2.0.1
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ micromatch: 4.0.5
+ pretty-format: 28.1.3
+ slash: 3.0.0
+ stack-utils: 2.0.5
+ dev: true
+
+ /jest-message-util/29.2.1:
+ resolution: {integrity: sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@jest/types': 29.2.1
+ '@types/stack-utils': 2.0.1
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ micromatch: 4.0.5
+ pretty-format: 29.2.1
+ slash: 3.0.0
+ stack-utils: 2.0.5
+ dev: true
+
+ /jest-mock/28.1.3:
+ resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ dev: true
+
+ /jest-pnp-resolver/1.2.2_jest-resolve@28.1.3:
+ resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ jest-resolve: '*'
+ peerDependenciesMeta:
+ jest-resolve:
+ optional: true
+ dependencies:
+ jest-resolve: 28.1.3
+ dev: true
+
+ /jest-regex-util/26.0.0:
+ resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==}
+ engines: {node: '>= 10.14.2'}
+
+ /jest-regex-util/28.0.2:
+ resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dev: true
+
+ /jest-resolve-dependencies/28.1.3:
+ resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ jest-regex-util: 28.0.2
+ jest-snapshot: 28.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-resolve/28.1.3:
+ resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ jest-haste-map: 28.1.3
+ jest-pnp-resolver: 1.2.2_jest-resolve@28.1.3
+ jest-util: 28.1.3
+ jest-validate: 28.1.3
+ resolve: 1.22.1
+ resolve.exports: 1.1.0
+ slash: 3.0.0
+ dev: true
+
+ /jest-runner/28.1.3:
+ resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/console': 28.1.3
+ '@jest/environment': 28.1.3
+ '@jest/test-result': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ chalk: 4.1.2
+ emittery: 0.10.2
+ graceful-fs: 4.2.10
+ jest-docblock: 28.1.1
+ jest-environment-node: 28.1.3
+ jest-haste-map: 28.1.3
+ jest-leak-detector: 28.1.3
+ jest-message-util: 28.1.3
+ jest-resolve: 28.1.3
+ jest-runtime: 28.1.3
+ jest-util: 28.1.3
+ jest-watcher: 28.1.3
+ jest-worker: 28.1.3
+ p-limit: 3.1.0
+ source-map-support: 0.5.13
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-runtime/28.1.3:
+ resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/environment': 28.1.3
+ '@jest/fake-timers': 28.1.3
+ '@jest/globals': 28.1.3
+ '@jest/source-map': 28.1.2
+ '@jest/test-result': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ chalk: 4.1.2
+ cjs-module-lexer: 1.2.2
+ collect-v8-coverage: 1.0.1
+ execa: 5.1.1
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ jest-haste-map: 28.1.3
+ jest-message-util: 28.1.3
+ jest-mock: 28.1.3
+ jest-regex-util: 28.0.2
+ jest-resolve: 28.1.3
+ jest-snapshot: 28.1.3
+ jest-util: 28.1.3
+ slash: 3.0.0
+ strip-bom: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-snapshot/28.1.3:
+ resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@babel/core': 7.19.6
+ '@babel/generator': 7.19.6
+ '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.19.6
+ '@babel/traverse': 7.19.6
+ '@babel/types': 7.19.4
+ '@jest/expect-utils': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/babel__traverse': 7.18.2
+ '@types/prettier': 2.7.1
+ babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.6
+ chalk: 4.1.2
+ expect: 28.1.3
+ graceful-fs: 4.2.10
+ jest-diff: 28.1.3
+ jest-get-type: 28.0.2
+ jest-haste-map: 28.1.3
+ jest-matcher-utils: 28.1.3
+ jest-message-util: 28.1.3
+ jest-util: 28.1.3
+ natural-compare: 1.4.0
+ pretty-format: 28.1.3
+ semver: 7.3.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-util/28.1.3:
+ resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ chalk: 4.1.2
+ ci-info: 3.5.0
+ graceful-fs: 4.2.10
+ picomatch: 2.3.1
+ dev: true
+
+ /jest-util/29.2.1:
+ resolution: {integrity: sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.2.1
+ '@types/node': 18.11.3
+ chalk: 4.1.2
+ ci-info: 3.5.0
+ graceful-fs: 4.2.10
+ picomatch: 2.3.1
+ dev: true
+
+ /jest-validate/28.1.3:
+ resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ jest-get-type: 28.0.2
+ leven: 3.1.0
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-watcher/28.1.3:
+ resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/test-result': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 18.11.3
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ emittery: 0.10.2
+ jest-util: 28.1.3
+ string-length: 4.0.2
+ dev: true
+
+ /jest-worker/28.1.3:
+ resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@types/node': 18.11.3
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+ dev: true
+
+ /jest/28.1.3_t5r4bv5a32g5njay4bmjlrj2cu:
+ resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ hasBin: true
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@jest/core': 28.1.3_ts-node@9.1.1
+ '@jest/types': 28.1.3
+ import-local: 3.1.0
+ jest-cli: 28.1.3_t5r4bv5a32g5njay4bmjlrj2cu
+ transitivePeerDependencies:
+ - '@types/node'
+ - supports-color
+ - ts-node
+ dev: true
+
+ /jju/1.4.0:
+ resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
+ dev: true
+
+ /js-tokens/4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ /js-yaml/3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ /js-yaml/4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
+ /jsesc/2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ /json-buffer/3.0.0:
+ resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==}
+ dev: true
+
+ /json-buffer/3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+ dev: true
+
+ /json-parse-even-better-errors/2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ /json-schema-traverse/0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-stable-stringify-without-jsonify/1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /json5/1.0.1:
+ resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.7
+ dev: true
+
+ /json5/2.2.1:
+ resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ /jsx-ast-utils/3.3.3:
+ resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ array-includes: 3.1.5
+ object.assign: 4.1.4
+ dev: true
+
+ /keyv/3.1.0:
+ resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}
+ dependencies:
+ json-buffer: 3.0.0
+ dev: true
+
+ /keyv/4.5.0:
+ resolution: {integrity: sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==}
+ dependencies:
+ json-buffer: 3.0.1
+ dev: true
+
+ /kind-of/6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /kleur/3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /language-subtag-registry/0.3.22:
+ resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
+ dev: true
+
+ /language-tags/1.0.5:
+ resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
+ dependencies:
+ language-subtag-registry: 0.3.22
+ dev: true
+
+ /latest-version/5.1.0:
+ resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==}
+ engines: {node: '>=8'}
+ dependencies:
+ package-json: 6.5.0
+ dev: true
+
+ /leven/3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /levn/0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /lines-and-columns/1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ /listr-input/0.2.1:
+ resolution: {integrity: sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==}
+ engines: {node: '>=6'}
+ dependencies:
+ inquirer: 7.3.3
+ inquirer-autosubmit-prompt: 0.2.0
+ rxjs: 6.6.7
+ through: 2.3.8
+ dev: true
+
+ /listr-silent-renderer/1.1.1:
+ resolution: {integrity: sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /listr-update-renderer/0.5.0_listr@0.14.3:
+ resolution: {integrity: sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ listr: ^0.14.2
+ dependencies:
+ chalk: 1.1.3
+ cli-truncate: 0.2.1
+ elegant-spinner: 1.0.1
+ figures: 1.7.0
+ indent-string: 3.2.0
+ listr: 0.14.3
+ log-symbols: 1.0.2
+ log-update: 2.3.0
+ strip-ansi: 3.0.1
+ dev: true
+
+ /listr-verbose-renderer/0.5.0:
+ resolution: {integrity: sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==}
+ engines: {node: '>=4'}
+ dependencies:
+ chalk: 2.4.2
+ cli-cursor: 2.1.0
+ date-fns: 1.30.1
+ figures: 2.0.0
+ dev: true
+
+ /listr/0.14.3:
+ resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@samverschueren/stream-to-observable': 0.3.1_rxjs@6.6.7
+ is-observable: 1.1.0
+ is-promise: 2.2.2
+ is-stream: 1.1.0
+ listr-silent-renderer: 1.1.1
+ listr-update-renderer: 0.5.0_listr@0.14.3
+ listr-verbose-renderer: 0.5.0
+ p-map: 2.1.0
+ rxjs: 6.6.7
+ transitivePeerDependencies:
+ - zen-observable
+ - zenObservable
+ dev: true
+
+ /locate-path/5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-locate: 4.1.0
+
+ /locate-path/6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
+ /lodash.isequal/4.5.0:
+ resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ dev: true
+
+ /lodash.memoize/4.1.2:
+ resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
+ dev: true
+
+ /lodash.merge/4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lodash.zip/4.2.0:
+ resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==}
+ dev: true
+
+ /lodash/4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ /log-symbols/1.0.2:
+ resolution: {integrity: sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ chalk: 1.1.3
+ dev: true
+
+ /log-symbols/4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+ dev: true
+
+ /log-update/2.3.0:
+ resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-escapes: 3.2.0
+ cli-cursor: 2.1.0
+ wrap-ansi: 3.0.1
+ dev: true
+
+ /loose-envify/1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+ dependencies:
+ js-tokens: 4.0.0
+ dev: true
+
+ /lowercase-keys/1.0.1:
+ resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /lowercase-keys/2.0.0:
+ resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /lru-cache/6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /make-dir/3.1.0:
+ resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+ engines: {node: '>=8'}
+ dependencies:
+ semver: 6.3.0
+ dev: true
+
+ /make-error/1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ dev: true
+
+ /makeerror/1.0.12:
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ dependencies:
+ tmpl: 1.0.5
+ dev: true
+
+ /map-age-cleaner/0.1.3:
+ resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-defer: 1.0.0
+ dev: true
+
+ /map-obj/1.0.1:
+ resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /map-obj/4.3.0:
+ resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /meow/8.1.2:
+ resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/minimist': 1.2.2
+ 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.3
+ read-pkg-up: 7.0.1
+ redent: 3.0.0
+ trim-newlines: 3.0.1
+ type-fest: 0.18.1
+ yargs-parser: 20.2.9
+ dev: true
+
+ /merge-stream/2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2/1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /micromatch/4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+
+ /mimic-fn/1.2.0:
+ resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /mimic-fn/2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /mimic-fn/3.1.0:
+ resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /mimic-response/1.0.1:
+ resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /mimic-response/2.1.0:
+ resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /min-indent/1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /minimatch/3.0.4:
+ resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+
+ /minimatch/3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+
+ /minimatch/5.1.0:
+ resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==}
+ engines: {node: '>=10'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
+ /minimist-options/4.1.0:
+ resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
+ engines: {node: '>= 6'}
+ dependencies:
+ arrify: 1.0.1
+ is-plain-obj: 1.1.0
+ kind-of: 6.0.3
+ dev: true
+
+ /minimist/1.2.7:
+ resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
+ dev: true
+
+ /mkdirp/1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: true
+
+ /ms/2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ dev: true
+
+ /ms/2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ /ms/2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ dev: true
+
+ /mute-stream/0.0.7:
+ resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==}
+ dev: true
+
+ /mute-stream/0.0.8:
+ resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+ dev: true
+
+ /natural-compare/1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /new-github-release-url/1.0.0:
+ resolution: {integrity: sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==}
+ engines: {node: '>=10'}
+ dependencies:
+ type-fest: 0.4.1
+ dev: true
+
+ /node-int64/0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+ dev: true
+
+ /node-releases/2.0.6:
+ resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==}
+
+ /normalize-package-data/2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.1
+ semver: 5.7.1
+ validate-npm-package-license: 3.0.4
+
+ /normalize-package-data/3.0.3:
+ resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
+ engines: {node: '>=10'}
+ dependencies:
+ hosted-git-info: 4.1.0
+ is-core-module: 2.11.0
+ semver: 7.3.8
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-path/3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-url/4.5.1:
+ resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /normalize-url/6.1.0:
+ resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /np/7.6.2:
+ resolution: {integrity: sha512-gExmKGKixh7ITc4Q+Lv7nfCby0CVKvzri9zN8970oKD8976T4L5dw8QWUtMcXcIjhFF6h5lbvztao/NurDbmxQ==}
+ engines: {git: '>=2.11.0', node: '>=10', npm: '>=6.8.0', yarn: '>=1.7.0'}
+ hasBin: true
+ dependencies:
+ '@samverschueren/stream-to-observable': 0.3.1_rxjs@6.6.7
+ any-observable: 0.5.1_rxjs@6.6.7
+ async-exit-hook: 2.0.1
+ chalk: 4.1.2
+ cosmiconfig: 7.0.1
+ del: 6.1.1
+ escape-goat: 3.0.0
+ escape-string-regexp: 4.0.0
+ execa: 5.1.1
+ github-url-from-git: 1.5.0
+ has-yarn: 2.1.0
+ hosted-git-info: 3.0.8
+ ignore-walk: 3.0.4
+ import-local: 3.1.0
+ inquirer: 7.3.3
+ is-installed-globally: 0.3.2
+ is-interactive: 1.0.0
+ is-scoped: 2.1.0
+ issue-regex: 3.1.0
+ listr: 0.14.3
+ listr-input: 0.2.1
+ log-symbols: 4.1.0
+ meow: 8.1.2
+ minimatch: 3.1.2
+ new-github-release-url: 1.0.0
+ npm-name: 6.0.1
+ onetime: 5.1.2
+ open: 7.4.2
+ ow: 0.21.0
+ p-memoize: 4.0.4
+ p-timeout: 4.1.0
+ pkg-dir: 5.0.0
+ read-pkg-up: 7.0.1
+ rxjs: 6.6.7
+ semver: 7.3.8
+ split: 1.0.1
+ symbol-observable: 3.0.0
+ terminal-link: 2.1.1
+ update-notifier: 5.1.0
+ transitivePeerDependencies:
+ - zen-observable
+ - zenObservable
+ dev: true
+
+ /npm-name/6.0.1:
+ resolution: {integrity: sha512-fhKRvUAxaYzMEUZim4mXWyfFbVS+M1CbrCLdAo3txWzrctxKka/h+KaBW0O9Cz5uOM00Nldn2JLWhuwnyW3SUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ got: 10.7.0
+ is-scoped: 2.1.0
+ is-url-superb: 4.0.0
+ lodash.zip: 4.2.0
+ org-regex: 1.0.0
+ p-map: 3.0.0
+ registry-auth-token: 4.2.2
+ registry-url: 5.1.0
+ validate-npm-package-name: 3.0.0
+ dev: true
+
+ /npm-run-path/4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
+ /number-is-nan/1.0.1:
+ resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /object-assign/4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /object-inspect/1.12.2:
+ resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
+
+ /object-keys/1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ /object.assign/4.1.4:
+ resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
+ engines: {node: '>= 0.4'}
+ 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:
+ resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /object.fromentries/2.0.5:
+ resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /object.hasown/1.1.1:
+ resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==}
+ dependencies:
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /object.values/1.1.5:
+ resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /once/1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+
+ /onetime/2.0.1:
+ resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ mimic-fn: 1.2.0
+ dev: true
+
+ /onetime/5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ dev: true
+
+ /open/7.4.2:
+ resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+ dev: true
+
+ /optionator/0.9.1:
+ resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.3
+ dev: true
+
+ /org-regex/1.0.0:
+ resolution: {integrity: sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /os-tmpdir/1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ow/0.21.0:
+ resolution: {integrity: sha512-dlsoDe39g7mhdsdrC1R/YwjT7yjVqE3svWwOlMGvN690waBkgEZBmKBdkmKvSt5/wZ6E0Jn/nIesPqMZOpPKqw==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ callsites: 3.1.0
+ dot-prop: 6.0.1
+ lodash.isequal: 4.5.0
+ type-fest: 0.20.2
+ vali-date: 1.0.0
+ dev: true
+
+ /p-cancelable/1.1.0:
+ resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /p-cancelable/2.1.1:
+ resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /p-defer/1.0.0:
+ resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /p-event/4.2.0:
+ resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-timeout: 3.2.0
+ dev: true
+
+ /p-finally/1.0.0:
+ resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /p-limit/2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-try: 2.2.0
+
+ /p-limit/3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
+ /p-locate/4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-limit: 2.3.0
+
+ /p-locate/5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
+ /p-map/2.1.0:
+ resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /p-map/3.0.0:
+ resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ aggregate-error: 3.1.0
+ dev: true
+
+ /p-map/4.0.0:
+ resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ aggregate-error: 3.1.0
+ dev: true
+
+ /p-memoize/4.0.4:
+ resolution: {integrity: sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==}
+ engines: {node: '>=10'}
+ dependencies:
+ map-age-cleaner: 0.1.3
+ mimic-fn: 3.1.0
+ p-settle: 4.1.1
+ dev: true
+
+ /p-reflect/2.1.0:
+ resolution: {integrity: sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /p-settle/4.1.1:
+ resolution: {integrity: sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 2.3.0
+ p-reflect: 2.1.0
+ dev: true
+
+ /p-timeout/3.2.0:
+ resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-finally: 1.0.0
+ dev: true
+
+ /p-timeout/4.1.0:
+ resolution: {integrity: sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /p-try/2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ /package-json/6.5.0:
+ resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ got: 9.6.0
+ registry-auth-token: 4.2.2
+ registry-url: 5.1.0
+ semver: 6.3.0
+ dev: true
+
+ /parent-module/1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /parse-json/5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ /path-browserify/1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+ dev: true
+
+ /path-exists/4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ /path-is-absolute/1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ /path-key/3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-parse/1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ /path-type/4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /picocolors/1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+ /picomatch/2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ /pirates/4.0.5:
+ resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /pkg-dir/4.2.0:
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ dev: true
+
+ /pkg-dir/5.0.0:
+ resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==}
+ engines: {node: '>=10'}
+ dependencies:
+ find-up: 5.0.0
+ dev: true
+
+ /pluralize/8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /prelude-ls/1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prepend-http/2.0.0:
+ resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /prettier-linter-helpers/1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ fast-diff: 1.2.0
+ dev: true
+
+ /prettier/2.7.1:
+ resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dev: true
+
+ /pretty-format/26.6.2:
+ resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@jest/types': 26.6.2
+ ansi-regex: 5.0.1
+ ansi-styles: 4.3.0
+ react-is: 17.0.2
+
+ /pretty-format/28.1.3:
+ resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/schemas': 28.1.3
+ ansi-regex: 5.0.1
+ ansi-styles: 5.2.0
+ react-is: 18.2.0
+ dev: true
+
+ /pretty-format/29.2.1:
+ resolution: {integrity: sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.0.0
+ ansi-styles: 5.2.0
+ react-is: 18.2.0
+ dev: true
+
+ /prompts/2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+ dev: true
+
+ /prop-types/15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+ dev: true
+
+ /pump/3.0.0:
+ resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+ dev: true
+
+ /punycode/2.1.1:
+ resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /pupa/2.1.1:
+ resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==}
+ engines: {node: '>=8'}
+ dependencies:
+ escape-goat: 2.1.1
+ dev: true
+
+ /queue-microtask/1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /quick-lru/4.0.1:
+ resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /rc/1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.7
+ strip-json-comments: 2.0.1
+ dev: true
+
+ /react-is/16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+ dev: true
+
+ /react-is/17.0.2:
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
+ /react-is/18.2.0:
+ resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+ dev: true
+
+ /read-pkg-up/7.0.1:
+ resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ read-pkg: 5.2.0
+ type-fest: 0.8.1
+
+ /read-pkg/5.2.0:
+ resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/normalize-package-data': 2.4.1
+ normalize-package-data: 2.5.0
+ parse-json: 5.2.0
+ type-fest: 0.6.0
+
+ /redent/3.0.0:
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
+ dependencies:
+ indent-string: 4.0.0
+ strip-indent: 3.0.0
+ dev: true
+
+ /regenerator-runtime/0.13.10:
+ resolution: {integrity: sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==}
+ dev: true
+
+ /regexp-tree/0.1.24:
+ resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==}
+ hasBin: true
+ dev: true
+
+ /regexp.prototype.flags/1.4.3:
+ resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ functions-have-names: 1.2.3
+
+ /regexpp/3.2.0:
+ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /registry-auth-token/4.2.2:
+ resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ rc: 1.2.8
+ dev: true
+
+ /registry-url/5.1.0:
+ resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==}
+ engines: {node: '>=8'}
+ dependencies:
+ rc: 1.2.8
+ dev: true
+
+ /require-directory/2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /resolve-cwd/3.0.0:
+ resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ resolve-from: 5.0.0
+ dev: true
+
+ /resolve-from/4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve-from/5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve.exports/1.1.0:
+ resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /resolve/1.19.0:
+ resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==}
+ dependencies:
+ is-core-module: 2.11.0
+ path-parse: 1.0.7
+ dev: true
+
+ /resolve/1.22.1:
+ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.11.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ /resolve/2.0.0-next.4:
+ resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.11.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /responselike/1.0.2:
+ resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
+ dependencies:
+ lowercase-keys: 1.0.1
+ dev: true
+
+ /responselike/2.0.1:
+ resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
+ dependencies:
+ lowercase-keys: 2.0.0
+ dev: true
+
+ /restore-cursor/2.0.0:
+ resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==}
+ engines: {node: '>=4'}
+ dependencies:
+ onetime: 2.0.1
+ signal-exit: 3.0.7
+ dev: true
+
+ /restore-cursor/3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ dev: true
+
+ /reusify/1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /rimraf/3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /run-async/2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /run-parallel/1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /rxjs/6.6.7:
+ resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==}
+ engines: {npm: '>=2.0.0'}
+ dependencies:
+ tslib: 1.14.1
+ dev: true
+
+ /safe-regex-test/1.0.0:
+ resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ is-regex: 1.1.4
+
+ /safe-regex/2.1.1:
+ resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==}
+ dependencies:
+ regexp-tree: 0.1.24
+ dev: true
+
+ /safer-buffer/2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: true
+
+ /scoped-regex/2.1.0:
+ resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /semver-diff/3.1.1:
+ resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==}
+ engines: {node: '>=8'}
+ dependencies:
+ semver: 6.3.0
+ dev: true
+
+ /semver/5.7.1:
+ resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
+ hasBin: true
+
+ /semver/6.3.0:
+ resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
+ hasBin: true
+
+ /semver/7.3.8:
+ resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /shebang-command/2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex/3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /side-channel/1.0.4:
+ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ object-inspect: 1.12.2
+
+ /signal-exit/3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+
+ /sisteransi/1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+ dev: true
+
+ /slash/3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+
+ /slice-ansi/0.0.4:
+ resolution: {integrity: sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /source-map-support/0.5.13:
+ resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ dev: true
+
+ /source-map-support/0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ dev: true
+
+ /source-map/0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map/0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /spdx-correct/3.1.1:
+ resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==}
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.12
+
+ /spdx-exceptions/2.3.0:
+ resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
+
+ /spdx-expression-parse/3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.3.0
+ spdx-license-ids: 3.0.12
+
+ /spdx-license-ids/3.0.12:
+ resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==}
+
+ /split/1.0.1:
+ resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==}
+ dependencies:
+ through: 2.3.8
+ dev: true
+
+ /sprintf-js/1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ /stack-utils/2.0.5:
+ resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==}
+ engines: {node: '>=10'}
+ dependencies:
+ escape-string-regexp: 2.0.0
+
+ /string-length/4.0.2:
+ resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ char-regex: 1.0.2
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string-width/1.0.2:
+ resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ code-point-at: 1.1.0
+ is-fullwidth-code-point: 1.0.0
+ strip-ansi: 3.0.1
+ dev: true
+
+ /string-width/2.1.1:
+ resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==}
+ engines: {node: '>=4'}
+ dependencies:
+ is-fullwidth-code-point: 2.0.0
+ strip-ansi: 4.0.0
+ dev: true
+
+ /string-width/4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string.prototype.matchall/4.0.7:
+ resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ get-intrinsic: 1.1.3
+ has-symbols: 1.0.3
+ internal-slot: 1.0.3
+ regexp.prototype.flags: 1.4.3
+ side-channel: 1.0.4
+
+ /string.prototype.trimend/1.0.5:
+ resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+
+ /string.prototype.trimstart/1.0.5:
+ resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+
+ /strip-ansi/3.0.1:
+ resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-regex: 2.1.1
+ dev: true
+
+ /strip-ansi/4.0.0:
+ resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-regex: 3.0.1
+ dev: true
+
+ /strip-ansi/5.2.0:
+ resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
+ engines: {node: '>=6'}
+ dependencies:
+ ansi-regex: 4.1.1
+ dev: true
+
+ /strip-ansi/6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: true
+
+ /strip-bom/3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /strip-bom/4.0.0:
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /strip-final-newline/2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /strip-indent/3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-json-comments/2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /strip-json-comments/3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /supports-color/2.0.0:
+ resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ /supports-color/5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+
+ /supports-color/7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+
+ /supports-color/8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-hyperlinks/2.3.0:
+ resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /supports-preserve-symlinks-flag/1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ /symbol-observable/1.2.0:
+ resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /symbol-observable/3.0.0:
+ resolution: {integrity: sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /terminal-link/2.1.1:
+ resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ supports-hyperlinks: 2.3.0
+ dev: true
+
+ /test-exclude/6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+ dev: true
+
+ /text-table/0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /through/2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ dev: true
+
+ /tmp/0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+ dependencies:
+ os-tmpdir: 1.0.2
+ dev: true
+
+ /tmpl/1.0.5:
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+ dev: true
+
+ /to-fast-properties/2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ /to-readable-stream/1.0.0:
+ resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /to-readable-stream/2.1.0:
+ resolution: {integrity: sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /to-regex-range/5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+
+ /trim-newlines/3.0.1:
+ resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ts-jest/28.0.8_fpn33pm5xaq635uzupby6e7ufe:
+ resolution: {integrity: sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ hasBin: true
+ peerDependencies:
+ '@babel/core': '>=7.0.0-beta.0 <8'
+ '@jest/types': ^28.0.0
+ babel-jest: ^28.0.0
+ esbuild: '*'
+ jest: ^28.0.0
+ typescript: '>=4.3'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ '@jest/types':
+ optional: true
+ babel-jest:
+ optional: true
+ esbuild:
+ optional: true
+ dependencies:
+ '@babel/core': 7.19.6
+ bs-logger: 0.2.6
+ fast-json-stable-stringify: 2.1.0
+ jest: 28.1.3_t5r4bv5a32g5njay4bmjlrj2cu
+ jest-util: 28.1.3
+ json5: 2.2.1
+ lodash.memoize: 4.1.2
+ make-error: 1.3.6
+ semver: 7.3.8
+ typescript: 4.8.2
+ yargs-parser: 21.1.1
+ dev: true
+
+ /ts-morph/16.0.0:
+ resolution: {integrity: sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==}
+ dependencies:
+ '@ts-morph/common': 0.17.0
+ code-block-writer: 11.0.3
+ dev: true
+
+ /ts-node/9.1.1_typescript@4.8.2:
+ resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=2.7'
+ dependencies:
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ source-map-support: 0.5.21
+ typescript: 4.8.2
+ yn: 3.1.1
+ dev: true
+
+ /tsconfig-paths/3.14.1:
+ resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==}
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.1
+ minimist: 1.2.7
+ strip-bom: 3.0.0
+ dev: true
+
+ /tslib/1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ dev: true
+
+ /tsutils/3.21.0_typescript@4.8.2:
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ 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'
+ dependencies:
+ tslib: 1.14.1
+ typescript: 4.8.2
+ dev: true
+
+ /type-check/0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /type-detect/4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /type-fest/0.10.0:
+ resolution: {integrity: sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-fest/0.18.1:
+ resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/0.4.1:
+ resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /type-fest/0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+
+ /type-fest/0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+
+ /typedarray-to-buffer/3.1.5:
+ resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+ dependencies:
+ is-typedarray: 1.0.0
+ dev: true
+
+ /typescript/4.8.2:
+ resolution: {integrity: sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+ dev: true
+
+ /unbox-primitive/1.0.2:
+ resolution: {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-string/2.0.0:
+ resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
+ engines: {node: '>=8'}
+ dependencies:
+ crypto-random-string: 2.0.0
+ dev: true
+
+ /update-browserslist-db/1.0.10_browserslist@4.21.4:
+ resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.21.4
+ escalade: 3.1.1
+ picocolors: 1.0.0
+
+ /update-notifier/5.1.0:
+ resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==}
+ engines: {node: '>=10'}
+ dependencies:
+ boxen: 5.1.2
+ chalk: 4.1.2
+ configstore: 5.0.1
+ has-yarn: 2.1.0
+ import-lazy: 2.1.0
+ is-ci: 2.0.0
+ is-installed-globally: 0.4.0
+ is-npm: 5.0.0
+ is-yarn-global: 0.3.0
+ latest-version: 5.1.0
+ pupa: 2.1.1
+ semver: 7.3.8
+ semver-diff: 3.1.1
+ xdg-basedir: 4.0.0
+ dev: true
+
+ /uri-js/4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.1.1
+ dev: true
+
+ /url-parse-lax/3.0.0:
+ resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ prepend-http: 2.0.0
+ dev: true
+
+ /v8-to-istanbul/9.0.1:
+ resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==}
+ engines: {node: '>=10.12.0'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.17
+ '@types/istanbul-lib-coverage': 2.0.4
+ convert-source-map: 1.9.0
+ dev: true
+
+ /vali-date/1.0.0:
+ resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /validate-npm-package-license/3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ dependencies:
+ spdx-correct: 3.1.1
+ spdx-expression-parse: 3.0.1
+
+ /validate-npm-package-name/3.0.0:
+ resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==}
+ dependencies:
+ builtins: 1.0.3
+ dev: true
+
+ /walker/1.0.8:
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+ dependencies:
+ makeerror: 1.0.12
+ dev: true
+
+ /which-boxed-primitive/1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ dependencies:
+ is-bigint: 1.0.4
+ is-boolean-object: 1.1.2
+ is-number-object: 1.0.7
+ is-string: 1.0.7
+ is-symbol: 1.0.4
+
+ /which/2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /widest-line/3.1.0:
+ resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
+ engines: {node: '>=8'}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
+ /word-wrap/1.2.3:
+ resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /wrap-ansi/3.0.1:
+ resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ string-width: 2.1.1
+ strip-ansi: 4.0.0
+ dev: true
+
+ /wrap-ansi/7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrappy/1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ /write-file-atomic/3.0.3:
+ resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+ dependencies:
+ imurmurhash: 0.1.4
+ is-typedarray: 1.0.0
+ signal-exit: 3.0.7
+ typedarray-to-buffer: 3.1.5
+ dev: true
+
+ /write-file-atomic/4.0.2:
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+ dev: true
+
+ /xdg-basedir/4.0.0:
+ resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /y18n/5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yallist/4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
+
+ /yaml/1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /yargs-parser/20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yargs-parser/21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /yargs/17.6.0:
+ resolution: {integrity: sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==}
+ engines: {node: '>=12'}
+ 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.8
+ yargs-parser: 21.1.1
+ dev: true
+
+ /yn/3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /yocto-queue/0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..0f21acd
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,161 @@
+import * as path from 'path'
+import * as os from 'os'
+import * as jsYaml from 'js-yaml'
+import {tryCatch} from 'fp-ts/lib/Either'
+import * as eslint from 'eslint'
+import * as presetsModule from './presets'
+import expect from 'expect'
+
+// todo: run prettier on output, if found
+// todo: codegen/fs rule. type fs.anything and it generates an import for fs. same for path and os.
+
+type MatchAll = (text: string, pattern: string | RegExp) => Iterable>>
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const matchAll: MatchAll = require('string.prototype.matchall')
+
+export {Preset} from './presets'
+
+export {presetsModule as presets}
+
+const getPreprocessor = (): eslint.Linter.LintOptions => {
+ return {
+ preprocess: text => [
+ text
+ .split(/\r?\n/)
+ .map(line => line && `// eslint-plugin-codegen:trim${line}`)
+ .join(os.EOL),
+ ],
+ postprocess: messageLists => ([] as eslint.Linter.LintMessage[]).concat(...messageLists),
+ // @ts-expect-error
+ supportsAutofix: true,
+ }
+}
+export const processors: Record = {
+ '.md': getPreprocessor(),
+ '.yml': getPreprocessor(),
+ '.yaml': getPreprocessor(),
+}
+
+const codegen: eslint.Rule.RuleModule = {
+ // @ts-expect-error
+ meta: {fixable: true},
+ create: (context: eslint.Rule.RuleContext) => {
+ const validate = () => {
+ const sourceCode = context
+ .getSourceCode()
+ .text.split(os.EOL)
+ .map(line => `${line}`.replace('// eslint-plugin-codegen:trim', ''))
+ .join(os.EOL)
+
+ const markersByExtension: Record = {
+ '.md': {
+ start: //g,
+ end: //g,
+ },
+ '.ts': {
+ start: /\/\/ codegen:start ?(.*)/g,
+ end: /\/\/ codegen:end/g,
+ },
+ '.yml': {
+ start: /# codegen:start ?(.*)/g,
+ end: /# codegen:end/g,
+ },
+ }
+ markersByExtension['.tsx'] = markersByExtension['.ts']
+ markersByExtension['.js'] = markersByExtension['.ts']
+ markersByExtension['.cjs'] = markersByExtension['.ts']
+ markersByExtension['.mjs'] = markersByExtension['.ts']
+ markersByExtension['.jsx'] = markersByExtension['.ts']
+ markersByExtension['.yaml'] = markersByExtension['.yml']
+
+ const markers = markersByExtension[path.extname(context.getFilename())]
+ const position = (index: number) => {
+ const stringUpToPosition = sourceCode.slice(0, index)
+ const lines = stringUpToPosition.split(os.EOL)
+ return {line: lines.length, column: lines[lines.length - 1].length}
+ }
+
+ const startMatches = [...matchAll(sourceCode, markers.start)].filter(startMatch => {
+ const prevCharacter = sourceCode[startMatch.index! - 1]
+ return !prevCharacter || prevCharacter === '\n'
+ })
+
+ startMatches.forEach((startMatch, startMatchesIndex) => {
+ const startIndex = startMatch.index!.valueOf()
+ const start = position(startIndex)
+ const startMarkerLoc = {start, end: {...start, column: start.column + startMatch[0].length}}
+ const searchForEndMarkerUpTo =
+ startMatchesIndex === startMatches.length - 1 ? sourceCode.length : startMatches[startMatchesIndex + 1].index
+ const endMatch = [...matchAll(sourceCode.slice(0, searchForEndMarkerUpTo), markers.end)].find(
+ e => e.index! > startMatch.index!
+ )
+ if (!endMatch) {
+ const afterStartMatch = startIndex + startMatch[0].length
+ context.report({
+ message: `couldn't find end marker (expected regex ${markers.end})`,
+ loc: startMarkerLoc,
+ fix: fixer =>
+ fixer.replaceTextRange(
+ [afterStartMatch, afterStartMatch],
+ os.EOL + markers.end.source.replace(/\\/g, '')
+ ),
+ })
+ return
+ }
+ const maybeOptions = tryCatch(
+ () => jsYaml.safeLoad(startMatch[1]) as Record,
+ err => err
+ )
+ if (maybeOptions._tag === 'Left') {
+ context.report({message: `Error parsing options. ${maybeOptions.left}`, loc: startMarkerLoc})
+ return
+ }
+ const opts = maybeOptions.right || {}
+ const presets: Record | undefined> = {
+ ...presetsModule,
+ ...context.options[0]?.presets,
+ }
+ const preset = typeof opts?.preset === 'string' && presets[opts.preset]
+ if (typeof preset !== 'function') {
+ context.report({
+ message: `unknown preset ${opts.preset}. Available presets: ${Object.keys(presets).join(', ')}`,
+ loc: startMarkerLoc,
+ })
+ return
+ }
+
+ const range: eslint.AST.Range = [startIndex + startMatch[0].length + os.EOL.length, endMatch.index!]
+ const existingContent = sourceCode.slice(...range)
+ const normalise = (val: string) => val.trim().replace(/\r?\n/g, os.EOL)
+
+ const result = tryCatch(
+ () => {
+ const meta = {filename: context.getFilename(), existingContent}
+ return preset({meta, options: opts})
+ },
+ err => `${err}`
+ )
+
+ if (result._tag === 'Left') {
+ context.report({message: result.left, loc: startMarkerLoc})
+ return
+ }
+ const expected = result.right
+ try {
+ expect(normalise(existingContent)).toBe(normalise(expected))
+ } catch (e: unknown) {
+ const loc = {start: position(range[0]), end: position(range[1])}
+ context.report({
+ message: `content doesn't match: ${e}`,
+ loc,
+ fix: fixer => fixer.replaceTextRange(range, normalise(expected) + os.EOL),
+ })
+ }
+ })
+ }
+ validate()
+ return {}
+ },
+}
+
+export const rules = {codegen}
diff --git a/src/presets/barrel.ts b/src/presets/barrel.ts
new file mode 100644
index 0000000..db1b524
--- /dev/null
+++ b/src/presets/barrel.ts
@@ -0,0 +1,109 @@
+import * as path from 'path'
+import * as lodash from 'lodash'
+import * as glob from 'glob'
+import {match} from 'io-ts-extra'
+import {parse} from '@babel/parser'
+import generate from '@babel/generator'
+
+import type {Preset} from '.'
+
+/**
+ * Bundle several modules into a single convenient one.
+ *
+ * @example
+ * // codegen:start {preset: barrel, include: some/path/*.ts, exclude: some/path/*util.ts}
+ * export * from './some/path/module-a'
+ * export * from './some/path/module-b'
+ * export * from './some/path/module-c'
+ * // codegen:end
+ *
+ * @param include
+ * [optional] If specified, the barrel will only include file paths that match this glob pattern
+ * @param exclude
+ * [optional] If specified, the barrel will exclude file paths that match these glob patterns
+ * @param import
+ * [optional] If specified, matching files will be imported and re-exported rather than directly exported
+ * with `export * from './xyz'`. Use `import: star` for `import * as xyz from './xyz'` style imports.
+ * Use `import: default` for `import xyz from './xyz'` style imports.
+ * @param export
+ * [optional] Only valid if the import style has been specified (either `import: star` or `import: default`).
+ * If specified, matching modules will be bundled into a const or default export based on this name. If set
+ * to `{name: someName, keys: path}` the relative file paths will be used as keys. Otherwise the file paths
+ * will be camel-cased to make them valid js identifiers.
+ */
+export const barrel: Preset<{
+ include?: string
+ exclude?: string | string[]
+ import?: 'default' | 'star'
+ export?: string | {name: string; keys: 'path' | 'camelCase'}
+}> = ({meta, options: opts}) => {
+ const cwd = path.dirname(meta.filename)
+
+ const ext = meta.filename.split('.').slice(-1)[0]
+ const pattern = opts.include || `*.${ext}`
+
+ const relativeFiles = glob
+ .sync(pattern, {cwd, ignore: opts.exclude})
+ .filter(f => path.resolve(cwd, f) !== path.resolve(meta.filename))
+ .map(f => `./${f}`.replace(/(\.\/)+\./g, '.'))
+ .filter(file => ['.js', '.mjs', '.ts', '.tsx'].includes(path.extname(file)))
+ .map(f => f.replace(/\.\w+$/, ''))
+
+ const expectedContent = match(opts.import)
+ .case(undefined, () => {
+ return relativeFiles.map(f => `export * from '${f}'`).join('\n')
+ })
+ .case(String, s => {
+ const importPrefix = s === 'default' ? '' : '* as '
+ const withIdentifiers = lodash
+ .chain(relativeFiles)
+ .map(f => ({
+ file: f,
+ identifier: lodash
+ .camelCase(f)
+ .replace(/^([^a-z])/, '_$1')
+ .replace(/Index$/, ''),
+ }))
+ .groupBy(info => info.identifier)
+ .values()
+ .flatMap(group =>
+ group.length === 1 ? group : group.map((info, i) => ({...info, identifier: `${info.identifier}_${i + 1}`}))
+ )
+ .value()
+
+ const imports = withIdentifiers.map(i => `import ${importPrefix}${i.identifier} from '${i.file}'`).join('\n')
+ const exportProps = match(opts.export)
+ .case({name: String, keys: 'path'}, () =>
+ withIdentifiers.map(i => `${JSON.stringify(i.file)}: ${i.identifier}`)
+ )
+ .default(() => withIdentifiers.map(i => i.identifier))
+ .get()
+
+ const exportPrefix = match(opts.export)
+ .case(undefined, () => 'export')
+ .case('default', () => 'export default')
+ .case({name: 'default'}, () => 'export default')
+ .case(String, name => `export const ${name} =`)
+ .case({name: String}, ({name}) => `export const ${name} =`)
+ .get()
+
+ const exports = exportProps.join(',\n ')
+
+ return `${imports}\n\n${exportPrefix} {\n ${exports}\n}\n`
+ })
+ .get()
+
+ // ignore stylistic differences. babel generate deals with most
+ const normalise = (str: string) =>
+ generate(parse(str, {sourceType: 'module', plugins: ['typescript']}) as any)
+ .code.replace(/'/g, `"`)
+ .replace(/\/index/g, '')
+
+ try {
+ if (normalise(expectedContent) === normalise(meta.existingContent)) {
+ return meta.existingContent
+ }
+ } catch {}
+
+ return expectedContent
+}
diff --git a/src/presets/custom.ts b/src/presets/custom.ts
new file mode 100644
index 0000000..bd239cd
--- /dev/null
+++ b/src/presets/custom.ts
@@ -0,0 +1,58 @@
+import * as path from 'path'
+import * as fs from 'fs'
+
+import type {Preset} from '.'
+
+/**
+ * Define your own codegen function, which will receive all options specified.
+ *
+ * Import the `Preset` type from this library to define a strongly-typed preset function:
+ *
+ * @example
+ * import {Preset} from 'eslint-plugin-codegen'
+ *
+ * export const jsonPrinter: Preset<{myCustomProp: string}> = ({meta, options}) => {
+ * return 'filename: ' + meta.filename + '\\ncustom prop: ' + options.myCustomProp
+ * }
+ *
+ * @description
+ * This can be used with:
+ *
+ * ``
+ *
+ * @param source {string} relative file path containing the export with jsdoc that should be copied to markdown
+ * @param export {string} the name of the export
+ */
+export const markdownFromJsdoc: Preset<{source: string; export?: string}> = ({
+ meta,
+ options: {source: relativeFile, export: exportName},
+}) => {
+ const targetFile = path.join(path.dirname(meta.filename), relativeFile)
+ const targetContent = fs.readFileSync(targetFile).toString()
+ const lines = targetContent.split('\n').map(line => line.trim())
+ const exportLineIndex = lines.findIndex(line => line.startsWith(`export const ${exportName}`))
+ if (exportLineIndex < 2 || lines[exportLineIndex - 1] !== '*/') {
+ throw Error(`Couldn't find export in ${relativeFile} with jsdoc called ${exportName}`)
+ }
+ const contentUpToExport = lines.slice(0, exportLineIndex).join('\n')
+ const jsdoc = contentUpToExport
+ .slice(contentUpToExport.lastIndexOf('/**'))
+ .split('\n')
+ .map(line => line.trim())
+ .map(line => {
+ return line
+ .replace(/^\/\*\*$/, '') // clean up: /**
+ .replace(/^\* /g, '') // clean up: * blah
+ .replace(/^\*$/g, '') // clean up: *
+ .replace(/^\*\/$/, '') // clean up */
+ })
+ .join(os.EOL)
+ const sections = `\n@description ${jsdoc}`
+ .split(/\n@/)
+ .map(section => section.trim() + ' ')
+ .filter(Boolean)
+ .map((section, index) => {
+ const firstSpace = section.search(/\s/)
+ return {type: section.slice(0, firstSpace), index, content: section.slice(firstSpace).trim()}
+ })
+ .filter(s => s.content)
+
+ const formatted = sections.map((sec, i, arr) => {
+ if (sec.type === 'example') {
+ return ['##### Example', '', '```typescript', sec.content, '```'].join(os.EOL)
+ }
+ if (sec.type === 'param') {
+ const allParams = arr.filter(other => other.type === sec.type)
+ if (sec !== allParams[0]) {
+ return null
+ }
+
+ const rows = allParams.map((p): [string, string] => {
+ const whitespaceMatch = p.content.match(/\s/)
+ const firstSpace = whitespaceMatch ? whitespaceMatch.index! : p.content.length
+ const name = p.content.slice(0, firstSpace)
+ const description = p.content
+ .slice(firstSpace + 1)
+ .trim()
+ .replace(/\r?\n/g, '
')
+ return [name, description]
+ })
+
+ const headers: [string, string] = ['name', 'description']
+
+ const nameSize = lodash.max([headers, ...rows].map(r => r[0].length))!
+ const descSize = lodash.max([headers, ...rows].map(r => r[1].length))!
+ const pad = (tuple: [string, string], padding = ' ') =>
+ `|${tuple[0].padEnd(nameSize, padding)}|${tuple[1].padEnd(descSize, padding)}|`
+
+ return [
+ '##### Params', // breakme
+ '',
+ pad(headers),
+ pad(['', ''], '-'),
+ ...rows.map(tuple => pad(tuple)),
+ ].join(os.EOL)
+ }
+ if (sec.type === 'description') {
+ // line breaks that run into letters aren't respected by jsdoc, so shouldn't be in markdown either
+ return sec.content.replace(/\r?\n\s*([A-Za-z])/g, ' $1')
+ }
+ if (sec.type === 'see') {
+ return null
+ }
+ return [`##### ${lodash.startCase(sec.type)}`, sec.content].join(os.EOL + os.EOL)
+ })
+ return [`#### [${exportName}](./${relativeFile}#L${exportLineIndex + 1})`, ...formatted]
+ .filter(Boolean)
+ .join(os.EOL + os.EOL)
+}
diff --git a/src/presets/markdown-from-tests.ts b/src/presets/markdown-from-tests.ts
new file mode 100644
index 0000000..3a69723
--- /dev/null
+++ b/src/presets/markdown-from-tests.ts
@@ -0,0 +1,59 @@
+import * as path from 'path'
+import * as fs from 'fs'
+import * as os from 'os'
+import * as lodash from 'lodash'
+import {parse} from '@babel/parser'
+import traverse from '@babel/traverse'
+
+import type {Preset} from '.'
+
+/**
+ * Use a test file to generate library usage documentation.
+ *
+ * Note: this has been tested with jest. It _might_ also work fine with mocha, and maybe ava, but those haven't been tested.
+ *
+ * ##### Example
+ *
+ * ``
+ *
+ * @param source the jest test file
+ * @param headerLevel The number of `#` characters to prefix each title with
+ */
+export const markdownFromTests: Preset<{source: string; headerLevel?: number}> = ({meta, options}) => {
+ const sourcePath = path.join(path.dirname(meta.filename), options.source)
+ const sourceCode = fs.readFileSync(sourcePath).toString()
+ const ast = parse(sourceCode, {sourceType: 'module', plugins: ['typescript']})
+ const specs: any[] = []
+ traverse(ast, {
+ CallExpression(ce) {
+ const identifier: any = lodash.get(ce, 'node')
+ const isSpec = identifier && ['it', 'test'].includes(lodash.get(identifier, 'callee.name'))
+ if (!isSpec) {
+ return
+ }
+ const hasArgs =
+ identifier.arguments.length >= 2 &&
+ identifier.arguments[0].type === 'StringLiteral' &&
+ identifier.arguments[1].body
+ if (!hasArgs) {
+ return
+ }
+ const func = identifier.arguments[1]
+ const lines = sourceCode.slice(func.start, func.end).split(/\r?\n/).slice(1, -1)
+ const indent = lodash.min(lines.filter(Boolean).map(line => line.length - line.trim().length))!
+ const body = lines.map(line => line.replace(' '.repeat(indent), '')).join(os.EOL)
+ specs.push({title: identifier.arguments[0].value, code: body})
+ },
+ })
+ return specs
+ .map(s => {
+ const lines = [
+ `${'#'.repeat(options.headerLevel || 0)} ${s.title}${lodash.get(s, 'suffix', ':')}${os.EOL}`.trimLeft(),
+ '```typescript',
+ s.code,
+ '```',
+ ]
+ return lines.join(os.EOL).trim()
+ })
+ .join(os.EOL + os.EOL)
+}
diff --git a/src/presets/markdown-toc.ts b/src/presets/markdown-toc.ts
new file mode 100644
index 0000000..798f9dd
--- /dev/null
+++ b/src/presets/markdown-toc.ts
@@ -0,0 +1,48 @@
+import * as fs from 'fs'
+import * as os from 'os'
+import * as lodash from 'lodash'
+
+import type {Preset} from '.'
+
+/**
+ * Generate a table of contents from the current markdown file, based on markdown headers (e.g. `### My section title`)
+ *
+ * ##### Example
+ *
+ * ``
+ *
+ * @param minDepth exclude headers with lower "depth". e.g. if set to 2, `# H1` would be excluded but `## H2` would be included.
+ * @param maxDepth exclude headers with higher "depth". e.g. if set to 3, `#### H4` would be excluded but `### H3` would be included.
+ */
+export const markdownTOC: Preset<{minDepth?: number; maxDepth?: number}> = ({meta, options}) => {
+ const lines = fs
+ .readFileSync(meta.filename)
+ .toString()
+ .split('\n')
+ .map(line => line.trim())
+ const headings = lines
+ .filter(line => line.match(/^#+ /))
+ .filter(line => line.startsWith('#'.repeat(options.minDepth || 1)))
+ .filter(line => line.split(' ')[0].length < (options.maxDepth || Infinity))
+ const minHashes = lodash.min(headings.map(h => h.split(' ')[0].length))!
+ return headings
+ .map(h => {
+ const hashes = h.split(' ')[0]
+ const indent = ' '.repeat(3 * (hashes.length - minHashes))
+ const text = h
+ .slice(hashes.length + 1)
+ .replace(/]\(.*\)/g, '')
+ .replace(/[[\]]/g, '')
+ const href = text
+ .toLowerCase()
+ .replace(/\s/g, '-')
+ .replace(/[^\w-]/g, '')
+ return {indent, text, href}
+ })
+ .map(({indent, text, href}, i, arr) => {
+ const previousDupes = arr.filter((x, j) => x.href === href && j < i)
+ const fixedHref = previousDupes.length === 0 ? href : `${href}-${previousDupes.length}`
+ return `${indent}- [${text}](#${fixedHref})`
+ })
+ .join(os.EOL)
+}
diff --git a/src/presets/monorepo-toc.ts b/src/presets/monorepo-toc.ts
new file mode 100644
index 0000000..e5c67c9
--- /dev/null
+++ b/src/presets/monorepo-toc.ts
@@ -0,0 +1,76 @@
+import * as path from 'path'
+import * as fs from 'fs'
+import * as os from 'os'
+import * as lodash from 'lodash'
+
+import type {Preset} from '.'
+import {getLeafPackages} from './util/monorepo'
+import {relative} from './util/path'
+
+/**
+ * Generate a table of contents for a monorepo.
+ *
+ * ##### Example (basic)
+ *
+ * ``
+ *
+ * ##### Example (using config options)
+ *
+ * ``
+ *
+ * @param repoRoot
+ * [optional] the relative path to the root of the git repository. By default, searches parent directories for a package.json to find the "root".
+ * @param filter
+ * [optional] a dictionary of filter rules to whitelist packages. Filters can be applied based on package.json keys,
+ * e.g. `filter: { package.name: someRegex, path: some/relative/path }`
+ * @param sort
+ * [optional] sort based on package properties (see `filter`), or readme length. Use `-` as a prefix to sort descending.
+ * e.g. `sort: -readme.length`
+ */
+export const monorepoTOC: Preset<{
+ repoRoot?: string
+ filter?: string | Record
+ sort?: string
+}> = ({meta, options}) => {
+ const packages = getLeafPackages(options.repoRoot, meta.filename)
+
+ const leafPackages = packages
+ .map(({path: leafPath, packageJson: leafPkg}) => {
+ const dirname = path.dirname(leafPath)
+ const readmePath = [path.join(dirname, 'readme.md'), path.join(dirname, 'README.md')].find(p => fs.existsSync(p))
+ const readme = [readmePath && fs.readFileSync(readmePath).toString(), leafPkg.description]
+ .filter(Boolean)
+ .join(os.EOL + os.EOL)
+ return {package: leafPkg, leafPath, readme}
+ })
+ .filter(props => {
+ const filter = typeof options.filter === 'object' ? options.filter : {'package.name': options.filter!}
+ return Object.keys(filter)
+ .filter(key => typeof filter[key] === 'string')
+ .every(key => new RegExp(lodash.get(filter, key)).test(lodash.get(props, key)))
+ })
+ .sort((...args) => {
+ const sort = options.sort || 'package.name'
+ const multiplier = sort.startsWith('-') ? -1 : 1
+ const key = sort.replace(/^-/, '')
+ const [a, b] = args.map(arg => lodash.get(arg, key))
+ const comp = a < b ? -1 : a > b ? 1 : 0
+ return comp * multiplier
+ })
+ .map(props => ({leafPath: props.leafPath, leafPkg: props.package, readme: props.readme}))
+ .map(({leafPath, leafPkg, readme}) => {
+ const description = (() => {
+ return readme
+ .split('\n')
+ .map(line => line.trim())
+ .filter(Boolean)
+ .find(line => line.match(/^[A-Za-z]/))
+ })()
+ const name = leafPkg.name
+ const homepage =
+ leafPkg.homepage || relative(path.dirname(meta.filename), leafPath).replace(/\/package.json$/, '')
+ return [`- [${name}](${homepage})`, description].filter(Boolean).join(' - ').trim()
+ })
+
+ return leafPackages.join(os.EOL)
+}
diff --git a/src/presets/util/monorepo.ts b/src/presets/util/monorepo.ts
new file mode 100644
index 0000000..5381690
--- /dev/null
+++ b/src/presets/util/monorepo.ts
@@ -0,0 +1,32 @@
+import * as readPkgUp from 'read-pkg-up'
+import {match} from 'io-ts-extra'
+import * as path from 'path'
+import * as glob from 'glob'
+import * as lodash from 'lodash'
+import * as fs from 'fs'
+import {inspect} from 'util'
+
+export interface PackageGlobbable {
+ repoRoot?: string
+}
+
+export const getLeafPackages = (repoRoot: string | undefined, filename: string) => {
+ const contextDir = match(repoRoot)
+ .case(String, s => path.join(path.dirname(filename), s))
+ .default(() => path.dirname(readPkgUp.sync({cwd: path.dirname(filename)})!.path))
+ .get()
+
+ const readJsonFile = (f: string) => JSON.parse(fs.readFileSync(path.join(contextDir, f)).toString())
+ const parseLernaJson = () => readJsonFile('lerna.json').packages
+ const pkg = readJsonFile('package.json')
+ const packageGlobs = pkg.workspaces?.packages || pkg.workspaces || parseLernaJson()
+
+ if (!Array.isArray(packageGlobs)) {
+ throw Error(`Expected to find workspaces array, got ${inspect(packageGlobs)}`)
+ }
+
+ const packages = lodash
+ .flatMap(packageGlobs, pattern => glob.sync(`${pattern}/package.json`, {cwd: contextDir}))
+ .map(p => ({path: p, packageJson: readJsonFile(p)}))
+ return lodash.compact(packages)
+}
diff --git a/src/presets/util/path.ts b/src/presets/util/path.ts
new file mode 100644
index 0000000..62e157c
--- /dev/null
+++ b/src/presets/util/path.ts
@@ -0,0 +1,7 @@
+import * as path from 'path'
+
+/** replace backslashes with forward slashes */
+export const unixify = (filepath: string) => filepath.replace(/\\/g, '/')
+
+/** get a relative unix-style path between two existing paths */
+export const relative = (from: string, to: string) => `./${unixify(path.relative(from, to))}`.replace(/^\.\/\./, '.')
diff --git a/test/plugin.test.ts b/test/plugin.test.ts
new file mode 100644
index 0000000..408d5e4
--- /dev/null
+++ b/test/plugin.test.ts
@@ -0,0 +1,45 @@
+import {processors} from '../src'
+import dedent from 'dedent'
+
+describe('markdown processor', () => {
+ const markdownProcessor = processors['.md']
+
+ test('preprocessor comments out markdown', () => {
+ const markdown = dedent`
+ # Title
+
+
+
+ html
+
+ \`\`\`js
+ // some javascript
+ const x = 1
+ \`\`\`
+ `
+
+ const preprocessed = markdownProcessor.preprocess!(markdown)
+
+ expect(preprocessed).toMatchInlineSnapshot(`
+ Array [
+ "// eslint-plugin-codegen:trim# Title
+
+ // eslint-plugin-codegen:trim
+
+ // eslint-plugin-codegen:trimhtml
+
+ // eslint-plugin-codegen:trim\`\`\`js
+ // eslint-plugin-codegen:trim// some javascript
+ // eslint-plugin-codegen:trimconst x = 1
+ // eslint-plugin-codegen:trim\`\`\`",
+ ]
+ `)
+ })
+
+ test('postprocessor flattens message lists', () => {
+ // @ts-expect-error
+ const postprocessed = markdownProcessor.postprocess!([[{line: 1}], [{line: 2}]])
+
+ expect(postprocessed).toEqual([{line: 1}, {line: 2}])
+ })
+})
diff --git a/test/presets/barrel.test.ts b/test/presets/barrel.test.ts
new file mode 100644
index 0000000..71096f2
--- /dev/null
+++ b/test/presets/barrel.test.ts
@@ -0,0 +1,298 @@
+import * as preset from '../../src/presets/barrel'
+import * as glob from 'glob'
+import minimatch from 'minimatch'
+
+const mockFs: any = {}
+
+beforeEach(() => {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ Object.keys(mockFs).forEach(k => delete mockFs[k])
+})
+
+jest.mock('glob')
+
+jest.spyOn(glob, 'sync').mockImplementation((pattern, opts) => {
+ const found = Object.keys(mockFs).filter(k => minimatch(k, pattern))
+ const ignores = typeof opts?.ignore === 'string' ? [opts?.ignore] : opts?.ignore || []
+ return found.filter(f => ignores.every(i => !minimatch(f, i)))
+})
+
+test('generates typescript', () => {
+ Object.assign(mockFs, {
+ 'index.ts': '',
+ 'a.ts': '',
+ 'b.ts': '',
+ 'c.ts': '',
+ 'a-util.ts': '',
+ 'b-util.ts': '',
+ 'util.ts': '',
+ })
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {},
+ })
+ ).toMatchInlineSnapshot(`
+ "export * from './a'
+ export * from './b'
+ export * from './c'
+ export * from './a-util'
+ export * from './b-util'
+ export * from './util'"
+ `)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {include: '{a,b}*'},
+ })
+ ).toMatchInlineSnapshot(`
+ "export * from './a'
+ export * from './b'
+ export * from './a-util'
+ export * from './b-util'"
+ `)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {exclude: '*'},
+ })
+ ).toMatchInlineSnapshot(`""`)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {include: '{a,b}*', exclude: ['*util*']},
+ })
+ ).toMatchInlineSnapshot(`
+ "export * from './a'
+ export * from './b'"
+ `)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {include: '{a,b}.ts', import: 'star'},
+ })
+ ).toMatchInlineSnapshot(`
+ "import * as a from './a'
+ import * as b from './b'
+
+ export {
+ a,
+ b
+ }
+ "
+ `)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {include: '{a,b}.ts', import: 'default'},
+ })
+ ).toMatchInlineSnapshot(`
+ "import a from './a'
+ import b from './b'
+
+ export {
+ a,
+ b
+ }
+ "
+ `)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {include: '{a,b}.ts', import: 'star', export: 'default'},
+ })
+ ).toMatchInlineSnapshot(`
+ "import * as a from './a'
+ import * as b from './b'
+
+ export default {
+ a,
+ b
+ }
+ "
+ `)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {include: '{a,b}.ts', import: 'star', export: 'foo'},
+ })
+ ).toMatchInlineSnapshot(`
+ "import * as a from './a'
+ import * as b from './b'
+
+ export const foo = {
+ a,
+ b
+ }
+ "
+ `)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {include: '{a,b}.ts', import: 'star', export: {name: 'foo', keys: 'path'}},
+ })
+ ).toMatchInlineSnapshot(`
+ "import * as a from './a'
+ import * as b from './b'
+
+ export const foo = {
+ \\"./a\\": a,
+ \\"./b\\": b
+ }
+ "
+ `)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {include: '{a,b}.ts', import: 'star', export: {name: 'foo', keys: 'camelCase'}},
+ })
+ ).toMatchInlineSnapshot(`
+ "import * as a from './a'
+ import * as b from './b'
+
+ export const foo = {
+ a,
+ b
+ }
+ "
+ `)
+
+ expect(
+ preset.barrel({
+ meta: {filename: 'index.ts', existingContent: ''},
+ options: {include: '{a,b}.ts', import: 'star', export: {name: 'default', keys: 'path'}},
+ })
+ ).toMatchInlineSnapshot(`
+ "import * as a from './a'
+ import * as b from './b'
+
+ export default {
+ \\"./a\\": a,
+ \\"./b\\": b
+ }
+ "
+ `)
+})
+
+test('is unopinionated about formatting', () => {
+ Object.assign(mockFs, {
+ 'index.ts': '',
+ 'a.ts': '',
+ 'b.ts': '',
+ 'c.ts': '',
+ })
+
+ const oldContent = [
+ `export * from './a';\n`, // breakme
+ `export * from "./b";\r\n`,
+ `export * from "./c"`,
+ ].join('')
+
+ expect(
+ preset.barrel({
+ meta: {
+ filename: 'index.ts',
+ existingContent: oldContent,
+ },
+ options: {},
+ })
+ ).toEqual(oldContent)
+})
+
+test(`generates valid identifiers for filenames that don't start with letters`, () => {
+ Object.assign(mockFs, {
+ '2000-01-01.one.ts': '',
+ '~two.ts': '',
+ '_three.ts': '',
+ })
+
+ expect(
+ preset.barrel({
+ meta: {
+ filename: 'index.ts',
+ existingContent: '',
+ },
+ options: {
+ import: 'star',
+ },
+ })
+ ).toMatchInlineSnapshot(`
+ "import * as _20000101One from './2000-01-01.one'
+ import * as two from './~two'
+ import * as three from './_three'
+
+ export {
+ _20000101One,
+ two,
+ three
+ }
+ "
+ `)
+})
+
+test(`ambiguously named files get unique, valid identifiers`, () => {
+ Object.assign(mockFs, {
+ 'ambiguous-naming.ts': '',
+ 'ambiguous_naming.ts': '',
+ })
+
+ expect(
+ preset.barrel({
+ meta: {
+ filename: 'index.ts',
+ existingContent: '',
+ },
+ options: {
+ import: 'star',
+ },
+ })
+ ).toMatchInlineSnapshot(`
+ "import * as ambiguousNaming_1 from './ambiguous-naming'
+ import * as ambiguousNaming_2 from './ambiguous_naming'
+
+ export {
+ ambiguousNaming_1,
+ ambiguousNaming_2
+ }
+ "
+ `)
+})
+
+test(`index files are sensibly-named`, () => {
+ Object.assign(mockFs, {
+ 'foo/index.ts': '',
+ 'bar/index.tsx': '',
+ })
+
+ expect(
+ preset.barrel({
+ meta: {
+ filename: 'barrel.ts',
+ existingContent: '',
+ },
+ options: {
+ include: '*/*',
+ import: 'star',
+ },
+ })
+ ).toMatchInlineSnapshot(`
+ "import * as foo from './foo/index'
+ import * as bar from './bar/index'
+
+ export {
+ foo,
+ bar
+ }
+ "
+ `)
+})
diff --git a/test/presets/custom-preset.js b/test/presets/custom-preset.js
new file mode 100644
index 0000000..d0d0e55
--- /dev/null
+++ b/test/presets/custom-preset.js
@@ -0,0 +1,5 @@
+module.exports = ({options}) => 'Whole module export with input: ' + options.input
+module.exports.getText = ({options}) => 'Named export with input: ' + options.input
+module.exports.thrower = () => {
+ throw Error('test error!')
+}
diff --git a/test/presets/custom-preset.ts b/test/presets/custom-preset.ts
new file mode 100644
index 0000000..b95736a
--- /dev/null
+++ b/test/presets/custom-preset.ts
@@ -0,0 +1 @@
+export const getText = () => 'typescript text'
diff --git a/test/presets/custom.test.ts b/test/presets/custom.test.ts
new file mode 100644
index 0000000..2da8ed0
--- /dev/null
+++ b/test/presets/custom.test.ts
@@ -0,0 +1,103 @@
+import * as preset from '../../src/presets/custom'
+import * as path from 'path'
+
+jest.mock('ts-node/register/transpile-only')
+
+test('custom preset validation', () => {
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
+ const customPreset = require('./custom-preset')
+
+ expect(Object.keys(customPreset)).toEqual(['getText', 'thrower'])
+
+ expect(customPreset.getText.toString().trim()).toMatch(/'Named export with input: ' \+ options.input/)
+})
+
+test('named export', () => {
+ expect(
+ preset.custom({
+ meta: {filename: __filename, existingContent: ''},
+ options: {source: './custom-preset.js', export: 'getText', input: 'abc'},
+ })
+ ).toMatchInlineSnapshot(`"Named export with input: abc"`)
+})
+
+test('whole module export', () => {
+ expect(
+ preset.custom({
+ meta: {filename: __filename, existingContent: ''},
+ options: {source: './custom-preset.js', input: 'def'},
+ })
+ ).toMatchInlineSnapshot(`"Whole module export with input: def"`)
+})
+
+test('load typescript with ts-node', () => {
+ expect(
+ preset.custom({
+ meta: {filename: __filename, existingContent: ''},
+ options: {source: './custom-preset.ts', export: 'getText'},
+ })
+ ).toMatchInlineSnapshot(`"typescript text"`)
+})
+
+test('dev mode, deletes require cache', () => {
+ expect(
+ preset.custom({
+ meta: {filename: __filename, existingContent: ''},
+ options: {source: './custom-preset.js', input: 'ghi', dev: true},
+ })
+ ).toMatchInlineSnapshot(`"Whole module export with input: ghi"`)
+})
+
+test(`when source isn't specified, uses filename`, () => {
+ expect(
+ preset.custom({
+ meta: {filename: path.join(__dirname, 'custom-preset.js'), existingContent: ''},
+ options: {input: 'abc'},
+ })
+ ).toEqual('Whole module export with input: abc')
+})
+
+test('errors for non-existent source file', () => {
+ expect(() =>
+ preset.custom({
+ meta: {filename: __filename, existingContent: ''},
+ options: {source: './does-not-exist.ts'},
+ })
+ ).toThrowError(/Source path is not a file: .*does-not-exist.ts/)
+})
+
+test('errors if directory passed as source', () => {
+ expect(() =>
+ preset.custom({
+ meta: {filename: __filename, existingContent: ''},
+ options: {source: '__tests__'},
+ })
+ ).toThrowError(/Source path is not a file: .*__tests__/)
+})
+
+test('errors for non-existent export', () => {
+ expect(() =>
+ preset.custom({
+ meta: {filename: __filename, existingContent: ''},
+ options: {source: './custom-preset.js', export: 'doesNotExist', input: 'abc'},
+ })
+ ).toThrowError(/Couldn't find export doesNotExist from .*custom-preset.js - got undefined/)
+})
+
+test('errors for export with wrong type', () => {
+ expect(() =>
+ preset.custom({
+ meta: {filename: __filename, existingContent: ''},
+ options: {source: './invalid-custom-preset.js', input: 'abc'},
+ })
+ ).toThrowError(/Couldn't find export function from .*invalid-custom-preset.js - got object/)
+})
+
+test('can require module first', () => {
+ expect(() =>
+ preset.custom({
+ meta: {filename: __filename, existingContent: ''},
+ options: {source: './custom-preset.js', require: 'thismoduledoesnotexist'},
+ })
+ ).toThrowError(/Cannot find module 'thismoduledoesnotexist' from 'src\/presets\/custom.ts'/)
+})
diff --git a/test/presets/empty.test.ts b/test/presets/empty.test.ts
new file mode 100644
index 0000000..9835649
--- /dev/null
+++ b/test/presets/empty.test.ts
@@ -0,0 +1,12 @@
+import * as preset from '../../src/presets/empty'
+
+const emptyReadme = {filename: 'readme.md', existingContent: ''}
+
+test('generates nothing', () => {
+ expect(
+ preset.empty({
+ meta: emptyReadme,
+ options: {},
+ })
+ ).toEqual('')
+})
diff --git a/test/presets/invalid-custom-preset.js b/test/presets/invalid-custom-preset.js
new file mode 100644
index 0000000..f81d1ca
--- /dev/null
+++ b/test/presets/invalid-custom-preset.js
@@ -0,0 +1 @@
+module.exports = {x: 1}
diff --git a/test/presets/labeler.test.ts b/test/presets/labeler.test.ts
new file mode 100644
index 0000000..1fe835a
--- /dev/null
+++ b/test/presets/labeler.test.ts
@@ -0,0 +1,78 @@
+import * as preset from '../../src/presets/labeler'
+import * as glob from 'glob'
+import minimatch from 'minimatch'
+import readPkgUp from 'read-pkg-up'
+
+const mockFs: any = {}
+
+beforeEach(() => {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ Object.keys(mockFs).forEach(k => delete mockFs[k])
+})
+
+jest.mock('fs', () => {
+ const actual = jest.requireActual('fs')
+ const reader = (orig: string) => (...args: any[]) => {
+ const path = args[0].replace(process.cwd() + '\\', '').replace(/\\/g, '/')
+ // const fn = path in mockFs ? mockImpl : actual[orig]
+ if (path in mockFs) {
+ return mockFs[path]
+ }
+ return actual[orig](...args)
+ }
+ return {
+ ...actual,
+ readFileSync: reader('readFileSync'),
+ existsSync: reader('existsSync'),
+ readdirSync: (path: string) => Object.keys(mockFs).filter(k => k.startsWith(path.replace(/^\.\/?/, ''))),
+ statSync: () => ({isFile: () => true, isDirectory: () => false}),
+ }
+})
+
+jest.mock('glob')
+
+jest.spyOn(glob, 'sync').mockImplementation((pattern, opts) => {
+ const found = Object.keys(mockFs).filter(k => minimatch(k, pattern))
+ const ignores = typeof opts?.ignore === 'string' ? [opts?.ignore] : opts?.ignore || []
+ return found.filter(f => ignores.every(i => !minimatch(f, i)))
+})
+
+jest.mock('read-pkg-up')
+
+jest.spyOn(readPkgUp, 'sync').mockImplementation(options =>
+ Object.entries(mockFs)
+ .map(([path, content]) => ({
+ path,
+ packageJson: JSON.parse(content as string),
+ }))
+ .find(p => options.cwd?.includes(p.path.replace('package.json', '')))
+)
+
+const labelerDotYml = {filename: '.github/labeler.yml', existingContent: ''}
+
+beforeEach(() => {
+ Object.assign(mockFs, {
+ 'package.json': '{ "workspaces": ["packages/*"] }',
+
+ 'packages/package1/package.json': '{ "name": "package1-aaa"}',
+ 'packages/package2/package.json': '{ "name": "package2-bbb"}',
+ 'packages/package3/package.json': '{ "name": "package3-ccc"}',
+ })
+})
+
+test('generate labels', () => {
+ expect(
+ preset.labeler({
+ meta: labelerDotYml,
+ options: {},
+ })
+ ).toMatchInlineSnapshot(`
+ "package1-aaa:
+ - packages/package1/**/*
+ package2-bbb:
+ - packages/package2/**/*
+ package3-ccc:
+ - packages/package3/**/*
+ "
+ `)
+})
diff --git a/test/presets/markdown-from-jsdoc.test.ts b/test/presets/markdown-from-jsdoc.test.ts
new file mode 100644
index 0000000..404c994
--- /dev/null
+++ b/test/presets/markdown-from-jsdoc.test.ts
@@ -0,0 +1,140 @@
+import * as preset from '../../src/presets/markdown-from-jsdoc'
+import dedent from 'dedent'
+
+const mockFs: any = {}
+
+beforeEach(() => {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ Object.keys(mockFs).forEach(k => delete mockFs[k])
+})
+
+jest.mock('fs', () => {
+ const actual = jest.requireActual('fs')
+ const reader = (orig: string) => (...args: any[]) => {
+ const path = args[0].replace(/\\/g, '/')
+ // const fn = path in mockFs ? mockImpl : actual[orig]
+ if (path in mockFs) {
+ return mockFs[path]
+ }
+ return actual[orig](...args)
+ }
+ return {
+ readFileSync: reader('readFileSync'),
+ existsSync: reader('existsSync'),
+ readdirSync: (path: string) => Object.keys(mockFs).filter(k => k.startsWith(path.replace(/^\.\/?/, ''))),
+ statSync: () => ({isFile: () => true, isDirectory: () => false}),
+ }
+})
+
+const emptyReadme = {filename: 'readme.md', existingContent: ''}
+test('generate markdown', () => {
+ Object.assign(mockFs, {
+ 'index.ts': dedent`
+ /**
+ * Adds two numbers
+ *
+ * @example const example1 = fn(1, 2) // returns 3
+ *
+ * @description Uses js \`+\` operator
+ *
+ * @example const example1 = fn(1, 20) // returns 21
+ *
+ * @see subtract for the converse
+ *
+ * @link http://google.com has a calculator in it too
+ *
+ * @param a {number} the first number
+ * @param b {number} the second number
+ */
+ export const add = (a: number, b: number) => a + b
+
+ /**
+ * Subtracts two numbers
+ *
+ * @example const example1 = subtract(5, 3) // returns 2
+ *
+ * @description Uses js \`-\` operator
+ *
+ * @param a {number} the first number
+ * @param b {number} the second number
+ */
+ export const add = (a: number, b: number) => a - b
+
+ /**
+ * @param a
+ * @param b
+ * multi-line description
+ * for 'b'
+ */
+ export const multiply = (a: number, b: number) => a * b
+ `,
+ })
+
+ expect(
+ preset.markdownFromJsdoc({
+ meta: emptyReadme,
+ options: {source: 'index.ts', export: 'add'},
+ })
+ ).toMatchInlineSnapshot(`
+ "#### [add](./index.ts#L17)
+
+ Adds two numbers
+
+ ##### Example
+
+ \`\`\`typescript
+ const example1 = fn(1, 2) // returns 3
+ \`\`\`
+
+ Uses js \`+\` operator
+
+ ##### Example
+
+ \`\`\`typescript
+ const example1 = fn(1, 20) // returns 21
+ \`\`\`
+
+ ##### Link
+
+ http://google.com has a calculator in it too
+
+ ##### Params
+
+ |name|description |
+ |----|--------------------------|
+ |a |{number} the first number |
+ |b |{number} the second number|"
+ `)
+
+ expect(
+ preset.markdownFromJsdoc({
+ meta: emptyReadme,
+ options: {source: 'index.ts', export: 'multiply'},
+ })
+ ).toMatchInlineSnapshot(`
+ "#### [multiply](./index.ts#L37)
+
+ ##### Params
+
+ |name|description |
+ |----|-----------------------------------|
+ |a | |
+ |b |multi-line description
for 'b'|"
+ `)
+})
+
+test('not found export', () => {
+ Object.assign(mockFs, {
+ 'index.ts': dedent`
+ /** docs */
+ export const add = (a: number, b: number) => a + b
+ `,
+ })
+
+ expect(() =>
+ preset.markdownFromJsdoc({
+ meta: emptyReadme,
+ options: {source: 'index.ts', export: 'subtract'},
+ })
+ ).toThrowError(/Couldn't find export in .*index.ts with jsdoc called subtract/)
+})
diff --git a/test/presets/markdown-from-tests.test.ts b/test/presets/markdown-from-tests.test.ts
new file mode 100644
index 0000000..2f5a33f
--- /dev/null
+++ b/test/presets/markdown-from-tests.test.ts
@@ -0,0 +1,92 @@
+import * as preset from '../../src/presets/markdown-from-tests'
+import dedent from 'dedent'
+
+const mockFs: any = {}
+
+beforeEach(() => {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ Object.keys(mockFs).forEach(k => delete mockFs[k])
+})
+
+jest.mock('fs', () => {
+ const actual = jest.requireActual('fs')
+ const reader = (orig: string) => (...args: any[]) => {
+ const path = args[0].replace(/\\/g, '/')
+ // const fn = path in mockFs ? mockImpl : actual[orig]
+ if (path in mockFs) {
+ return mockFs[path]
+ }
+ return actual[orig](...args)
+ }
+ return {
+ readFileSync: reader('readFileSync'),
+ existsSync: reader('existsSync'),
+ readdirSync: (path: string) => Object.keys(mockFs).filter(k => k.startsWith(path.replace(/^\.\/?/, ''))),
+ statSync: () => ({isFile: () => true, isDirectory: () => false}),
+ }
+})
+
+const emptyReadme = {filename: 'readme.md', existingContent: ''}
+
+test('generate markdown', () => {
+ Object.assign(mockFs, {
+ 'test.ts': dedent`
+ import {calculator} from '..'
+
+ beforeEach(() => {
+ calculator.setup()
+ })
+
+ test('addition', () => {
+ expect(calculator.add(1, 1)).toEqual(2)
+ })
+
+ it('subtraction', () => {
+ expect(calculator.subtract(1, 1)).toEqual(0)
+ })
+
+ const nonLiteralTestName = 'also subtraction'
+ it(nonLiteralTestName, () => {
+ expect(calculator.subtract(1, 1)).toEqual(0)
+ })
+
+ test('multiplication', () => {
+ expect(calculator.multiply(2, 3)).toEqual(6)
+ })
+
+ test.skip('division', () => {
+ expect(calculator.divide(1, 0)).toEqual(Infinity)
+ })
+ `,
+ })
+
+ const withHeaders = preset.markdownFromTests({
+ meta: emptyReadme,
+ options: {source: 'test.ts', headerLevel: 4},
+ })
+ expect(withHeaders).toMatchInlineSnapshot(`
+ "#### addition:
+
+ \`\`\`typescript
+ expect(calculator.add(1, 1)).toEqual(2)
+ \`\`\`
+
+ #### subtraction:
+
+ \`\`\`typescript
+ expect(calculator.subtract(1, 1)).toEqual(0)
+ \`\`\`
+
+ #### multiplication:
+
+ \`\`\`typescript
+ expect(calculator.multiply(2, 3)).toEqual(6)
+ \`\`\`"
+ `)
+ const withoutHeaders = preset.markdownFromTests({
+ meta: emptyReadme,
+ options: {source: 'test.ts'},
+ })
+
+ expect(withoutHeaders).toEqual(withHeaders.replace(/#### /g, ''))
+})
diff --git a/test/presets/markdown-toc.test.ts b/test/presets/markdown-toc.test.ts
new file mode 100644
index 0000000..f38728b
--- /dev/null
+++ b/test/presets/markdown-toc.test.ts
@@ -0,0 +1,115 @@
+import * as preset from '../../src/presets/markdown-toc'
+import dedent from 'dedent'
+
+const mockFs: any = {}
+
+beforeEach(() => {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ Object.keys(mockFs).forEach(k => delete mockFs[k])
+})
+
+jest.mock('fs', () => {
+ const actual = jest.requireActual('fs')
+ const reader = (orig: string) => (...args: any[]) => {
+ const path = args[0].replace(/\\/g, '/')
+ // const fn = path in mockFs ? mockImpl : actual[orig]
+ if (path in mockFs) {
+ return mockFs[path]
+ }
+ return actual[orig](...args)
+ }
+ return {
+ readFileSync: reader('readFileSync'),
+ existsSync: reader('existsSync'),
+ readdirSync: (path: string) => Object.keys(mockFs).filter(k => k.startsWith(path.replace(/^\.\/?/, ''))),
+ statSync: () => ({isFile: () => true, isDirectory: () => false}),
+ }
+})
+
+const emptyReadme = {filename: 'readme.md', existingContent: ''}
+
+test('generate markdown', () => {
+ Object.assign(mockFs, {
+ 'readme.md': dedent`
+ # H1
+ Text
+ ## H2
+ More text
+ ### H3
+ Some content
+ ![](an-image.png)
+ ### Another H3
+ #### H4 duplicate
+ ##### H5
+ ##### H5
+ #### H4 duplicate
+ More
+ ## Another H2
+ `,
+ })
+
+ expect(
+ preset.markdownTOC({
+ meta: emptyReadme,
+ options: {},
+ })
+ ).toMatchInlineSnapshot(`
+ "- [H1](#h1)
+ - [H2](#h2)
+ - [H3](#h3)
+ - [Another H3](#another-h3)
+ - [H4 duplicate](#h4-duplicate)
+ - [H5](#h5)
+ - [H5](#h5-1)
+ - [H4 duplicate](#h4-duplicate-1)
+ - [Another H2](#another-h2)"
+ `)
+
+ expect(
+ preset.markdownTOC({
+ meta: emptyReadme,
+ options: {
+ minDepth: 2,
+ maxDepth: 3,
+ },
+ })
+ ).toMatchInlineSnapshot(`
+ "- [H2](#h2)
+ - [Another H2](#another-h2)"
+ `)
+})
+
+test('calculates min hashes', () => {
+ Object.assign(mockFs, {
+ 'readme.md': dedent`
+ ### H3
+ ### Another H3
+ #### H4 duplicate
+ ##### H5
+ ##### H5
+ `,
+ })
+
+ expect(
+ preset.markdownTOC({
+ meta: emptyReadme,
+ options: {},
+ })
+ ).toMatchInlineSnapshot(`
+ "- [H3](#h3)
+ - [Another H3](#another-h3)
+ - [H4 duplicate](#h4-duplicate)
+ - [H5](#h5)
+ - [H5](#h5-1)"
+ `)
+
+ expect(
+ preset.markdownTOC({
+ meta: emptyReadme,
+ options: {
+ minDepth: 2,
+ maxDepth: 3,
+ },
+ })
+ ).toMatchInlineSnapshot(`""`)
+})
diff --git a/test/presets/monorepo-toc.test.ts b/test/presets/monorepo-toc.test.ts
new file mode 100644
index 0000000..3b9960c
--- /dev/null
+++ b/test/presets/monorepo-toc.test.ts
@@ -0,0 +1,171 @@
+import * as preset from '../../src/presets/monorepo-toc'
+import dedent from 'dedent'
+import * as glob from 'glob'
+import minimatch from 'minimatch'
+
+const mockFs: any = {}
+
+beforeEach(() => {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ Object.keys(mockFs).forEach(k => delete mockFs[k])
+})
+
+jest.mock('fs', () => {
+ const actual = jest.requireActual('fs')
+ const reader = (orig: string) => (...args: any[]) => {
+ const path = args[0]
+ .replace(process.cwd() + '\\', '')
+ .replace(process.cwd() + '/', '')
+ .replace(/\\/g, '/')
+ // const fn = path in mockFs ? mockImpl : actual[orig]
+ if (path in mockFs) {
+ return mockFs[path]
+ }
+ return actual[orig](...args)
+ }
+ return {
+ ...actual,
+ readFileSync: reader('readFileSync'),
+ existsSync: reader('existsSync'),
+ readdirSync: (path: string) => Object.keys(mockFs).filter(k => k.startsWith(path.replace(/^\.\/?/, ''))),
+ statSync: () => ({isFile: () => true, isDirectory: () => false}),
+ }
+})
+
+jest.mock('glob')
+
+jest.spyOn(glob, 'sync').mockImplementation((pattern, opts) => {
+ const found = Object.keys(mockFs).filter(k => minimatch(k, pattern))
+ const ignores = typeof opts?.ignore === 'string' ? [opts?.ignore] : opts?.ignore || []
+ return found.filter(f => ignores.every(i => !minimatch(f, i)))
+})
+
+const emptyReadme = {filename: 'readme.md', existingContent: ''}
+
+beforeEach(() => {
+ Object.assign(mockFs, {
+ 'package.json': '{ "workspaces": ["packages/*"] }',
+
+ 'withBadWorkspaces/package.json': '{ "workspaces": "not an array!" }',
+
+ 'lerna.json': '{ "packages": ["packages/package1", "packages/package2"] }',
+
+ 'packages/package1/package.json':
+ '{ "name": "package1", "description": "first package with an inline package.json description. Quite a long inline description, in fact." }',
+
+ 'packages/package2/package.json': '{ "name": "package2", "description": "package 2" }',
+ 'packages/package2/readme.md': dedent`
+ # Package 2
+ Readme for package 2
+ `,
+
+ 'packages/package3/package.json': '{ "name": "package3", "description": "package 3" }',
+ 'packages/package3/readme.md': dedent`
+ # Package 3
+ Readme for package 3
+ `,
+
+ 'packages/package4/package.json': '{ "name": "package4", "description": "fourth package" }',
+ 'packages/package4/README.md': dedent`
+ # Package 4
+
+ ## Subheading
+
+ More details about package 4. Package 4 has a detailed readme, with multiple sections
+
+ ### Sub-sub-heading
+
+ Here's another section, with more markdown content in it.
+ `,
+ })
+})
+
+test('generate markdown', () => {
+ expect(
+ preset.monorepoTOC({
+ meta: emptyReadme,
+ options: {},
+ })
+ ).toMatchInlineSnapshot(`
+ "- [package1](./packages/package1) - first package with an inline package.json description. Quite a long inline description, in fact.
+ - [package2](./packages/package2) - Readme for package 2
+ - [package3](./packages/package3) - Readme for package 3
+ - [package4](./packages/package4) - More details about package 4. Package 4 has a detailed readme, with multiple sections"
+ `)
+})
+
+test('generate markdown with filter', () => {
+ expect(
+ preset.monorepoTOC({
+ meta: emptyReadme,
+ options: {filter: {'package.name': 'package1|package3'}},
+ })
+ ).toMatchInlineSnapshot(`
+ "- [package1](./packages/package1) - first package with an inline package.json description. Quite a long inline description, in fact.
+ - [package3](./packages/package3) - Readme for package 3"
+ `)
+})
+
+test('generate markdown with sorting', () => {
+ expect(
+ preset.monorepoTOC({
+ meta: emptyReadme,
+ options: {sort: '-readme.length'},
+ })
+ ).toMatchInlineSnapshot(`
+ "- [package4](./packages/package4) - More details about package 4. Package 4 has a detailed readme, with multiple sections
+ - [package1](./packages/package1) - first package with an inline package.json description. Quite a long inline description, in fact.
+ - [package2](./packages/package2) - Readme for package 2
+ - [package3](./packages/package3) - Readme for package 3"
+ `)
+})
+
+test('generate markdown default to lerna to find packages', () => {
+ mockFs['package.json'] = '{}'
+ expect(
+ preset.monorepoTOC({
+ meta: emptyReadme,
+ options: {},
+ })
+ ).toMatchInlineSnapshot(`
+ "- [package1](./packages/package1) - first package with an inline package.json description. Quite a long inline description, in fact.
+ - [package2](./packages/package2) - Readme for package 2"
+ `)
+})
+
+test('generate markdown fails when no package.json exists', () => {
+ expect(() =>
+ preset.monorepoTOC({
+ meta: {filename: 'subdir/test.md', existingContent: ''},
+ options: {},
+ })
+ ).toThrowError(/ENOENT: no such file or directory, open '.*subdir.*package.json'/)
+})
+
+test('generate markdown with separate rootDir', () => {
+ expect(
+ preset.monorepoTOC({
+ meta: {filename: 'subdir/test.md', existingContent: ''},
+ options: {repoRoot: '..'},
+ })
+ ).toMatchInlineSnapshot(`
+ "- [package1](../packages/package1) - first package with an inline package.json description. Quite a long inline description, in fact.
+ - [package2](../packages/package2) - Readme for package 2
+ - [package3](../packages/package3) - Readme for package 3
+ - [package4](../packages/package4) - More details about package 4. Package 4 has a detailed readme, with multiple sections"
+ `)
+})
+
+test('invalid workspaces', () => {
+ Object.assign(mockFs, {
+ 'package.json': '{ "workspaces": "package.json - not an array" }',
+ 'lerna.json': '{ "packages": "lerna.json - not an array" }',
+ })
+
+ expect(() =>
+ preset.monorepoTOC({
+ meta: emptyReadme,
+ options: {},
+ })
+ ).toThrowError(/Expected to find workspaces array, got 'package.json - not an array'/)
+})
diff --git a/test/rule.test.ts b/test/rule.test.ts
new file mode 100644
index 0000000..8f7c8fe
--- /dev/null
+++ b/test/rule.test.ts
@@ -0,0 +1,114 @@
+import {RuleTester} from 'eslint'
+import * as codegen from '../src'
+import baseDedent from 'dedent'
+import * as os from 'os'
+
+jest.mock('glob', () => ({
+ sync: () => ['foo.ts', 'bar.ts'],
+}))
+
+/** wrapper for dedent which respects os.EOL */
+const dedent = (...args: Parameters) => {
+ const result = baseDedent(...args)
+ return result.replace(/\r?\n/g, os.EOL)
+}
+
+Object.assign(RuleTester, {
+ /* eslint-disable jest/expect-expect, jest/valid-title */
+ it: (name: string, fn: any) => {
+ test(name.replace(/\r?\n/g, ' \\n ').trim(), fn)
+ },
+ /* eslint-enable jest/expect-expect, jest/valid-title */
+})
+
+const tester = new RuleTester()
+tester.run('codegen', codegen.rules.codegen, {
+ valid: [
+ {
+ filename: 'index.ts',
+ code: '',
+ },
+ {
+ filename: __filename,
+ code: dedent`
+ // codegen:start {preset: empty}
+ // codegen:end
+ `,
+ },
+ ],
+ invalid: [
+ {
+ filename: 'index.ts',
+ code: dedent`
+ // codegen:start {preset: barrel}
+ `,
+ errors: [{message: `couldn't find end marker (expected regex /\\/\\/ codegen:end/g)`}],
+ output: dedent`
+ // codegen:start {preset: barrel}
+ // codegen:end
+ `,
+ },
+ {
+ filename: __filename,
+ code: dedent`
+ // codegen:start ""
+ // codegen:end
+ `,
+ errors: [{message: /unknown preset undefined./}],
+ },
+ {
+ filename: __filename,
+ code: dedent`
+ // codegen:start {preset: doesNotExist}
+ // codegen:end
+ `,
+ errors: [{message: /unknown preset doesNotExist. Available presets: .*/}],
+ },
+ {
+ filename: __filename,
+ code: dedent`
+ // codegen:start {abc: !Tag: not valid yaml!}
+ // codegen:end
+ `,
+ errors: [{message: /Error parsing options. YAMLException/}],
+ },
+ {
+ filename: __filename,
+ code: dedent`
+ // codegen:start {preset: empty}
+ // codegen:start {preset: empty}
+ // codegen:end
+ `,
+ errors: [{message: /couldn't find end marker/}],
+ output: dedent`
+ // codegen:start {preset: empty}
+ // codegen:end
+ // codegen:start {preset: empty}
+ // codegen:end
+ `,
+ },
+ {
+ filename: __filename,
+ parserOptions: {ecmaVersion: 2015, sourceType: 'module'},
+ code: dedent`
+ // codegen:start {preset: barrel}
+ // codegen:end
+ `,
+ errors: [{message: /content doesn't match/}],
+ output: dedent`
+ // codegen:start {preset: barrel}
+ export * from './foo'
+ export * from './bar'
+ // codegen:end
+ `,
+ },
+ {
+ filename: __filename,
+ code: dedent`
+ // codegen:start {preset: custom, source: ./presets/custom-preset.js, export: thrower}
+ // codegen:end
+ `,
+ errors: [{message: /Error: test error!/}],
+ },
+ ],
+})
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..2f281fd
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "lib": ["es2017", "DOM"],
+ "target": "es2017",
+ "module": "commonjs",
+ "strict": true,
+ "noEmit": true,
+ "noErrorTruncation": true,
+ "esModuleInterop": true
+ },
+ "include": ["src", "test", "*.js", ".*.*js", "*.md"]
+}
diff --git a/tsconfig.lib.json b/tsconfig.lib.json
new file mode 100644
index 0000000..c38db65
--- /dev/null
+++ b/tsconfig.lib.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "noEmit": false,
+ "declaration": true,
+ "outDir": "dist"
+ },
+ "include": ["src"]
+}