diff --git a/.commitlintrc.json b/.commitlintrc.json new file mode 100644 index 00000000..39e857c8 --- /dev/null +++ b/.commitlintrc.json @@ -0,0 +1,24 @@ +{ + "extends": ["@commitlint/config-conventional"], + "rules": { + "body-max-line-length": [0], + "type-enum": [ + 2, + "always", + [ + "build", + "chore", + "ci", + "docs", + "feat", + "fix", + "perf", + "refactor", + "revert", + "style", + "test", + "meta" + ] + ] + } +} diff --git a/.editorconfig b/.editorconfig index ea6e20f5..0b01722f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,3 @@ indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true - -[*.md] -insert_final_newline = false -trim_trailing_whitespace = false diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..d5c47c80 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,26 @@ +module.exports = { + env: { + es2021: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + parserOptions: { + ecmaVersion: 2021, + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint'], + rules: { + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/explicit-module-boundary-types': [ + 'error', + { + allowArgumentsExplicitlyTypedAsAny: true, + }, + ], + }, +}; diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..eba656e7 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +# For more information see: https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'daily' + + - package-ecosystem: 'npm' + directory: '/' + schedule: + interval: 'daily' diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml new file mode 100644 index 00000000..84418383 --- /dev/null +++ b/.github/workflows/commitlint.yml @@ -0,0 +1,18 @@ +# For more information see: https://github.com/marketplace/actions/commit-linter + +name: 'Lint Commit Messages' + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + commitlint: + runs-on: ubuntu-latest + steps: + - uses: 'actions/checkout@v3.1.0' + with: + fetch-depth: 0 + - uses: 'wagoid/commitlint-github-action@v5.3.0' diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 00000000..59dfd56e --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,36 @@ +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: 'Node.js CI' + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + build: + runs-on: 'ubuntu-latest' + + strategy: + matrix: + node-version: [10.x, 12.x, 14.x, 16.x] + + steps: + - uses: 'actions/checkout@v3.1.0' + + - name: Use Node.js ${{ matrix.node-version }} + uses: 'actions/setup-node@v3.5.1' + with: + node-version: ${{ matrix.node-version }} + + - run: 'npm ci' + - name: Lint + if: ${{ matrix.node-version != '10.x' }} + run: 'npm run lint' + - name: Markdownlint + if: ${{ matrix.node-version != '10.x' }} + run: 'npm run markdownlint' + - run: 'npm run build' + - run: 'DISABLE_LOGGING=1 npm run cover' + - run: 'npx nyc report --reporter=lcov > coverage.lcov && npx codecov' diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml new file mode 100644 index 00000000..55b582d7 --- /dev/null +++ b/.github/workflows/npm-publish.yml @@ -0,0 +1,24 @@ +# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages + +name: 'Node.js Package' + +on: + release: + types: [created] + +jobs: + publish-npm: + runs-on: 'ubuntu-latest' + steps: + - uses: 'actions/checkout@v3.1.0' + + - uses: 'actions/setup-node@v3.5.1' + with: + node-version: 16 + registry-url: 'https://registry.npmjs.org/' + + - run: 'npm ci' + - run: 'npm run build' + - run: 'npm publish' + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.gitignore b/.gitignore index 1a9f90f3..25b99376 100644 --- a/.gitignore +++ b/.gitignore @@ -12,9 +12,9 @@ node_modules npm-debug.log # build -**/*.js -**/*.js.map -**/*.d.ts +dist/**/*.js +dist/**/*.js.map +dist/**/*.d.ts # src !src/hooks/shared/hooks.d.ts @@ -27,3 +27,8 @@ npm-debug.log coverage .nyc_output !test/tsconfig.mocha.js +!.mocharc.js + + +# lockFile +*.lock diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 00000000..c9cdc63b --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ \ No newline at end of file diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 00000000..7cd8dd9a --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install commitlint --edit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..8d8e8b33 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,5 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm run lint +npm run markdownlint diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 00000000..307f3aa1 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,5 @@ +{ + "default": true, + "MD013": false, + "MD024": false +} diff --git a/.mocharc.js b/.mocharc.js new file mode 100644 index 00000000..7d4ee313 --- /dev/null +++ b/.mocharc.js @@ -0,0 +1,12 @@ +/** + * @type {MochaSetupOptions} + */ +module.exports = { + extension: ['ts'], + require: [ + 'test/tsconfig.mocha.js' + ], + package: './package.json', + 'watch-files': ['test/**/*.spec.ts'], + // 'watch-ignore': ['lib/vendor'] +}; diff --git a/.npmrc b/.npmrc index 449691b7..cffe8cde 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -save-exact=true \ No newline at end of file +save-exact=true diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 00000000..49df6e0b --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,4 @@ +module.exports = { + printWidth: 100, + singleQuote: true +}; diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c3746e0c..00000000 --- a/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: node_js - -node_js: - - "8" - -before_install: - - npm i -g npm@6 - -install: - - npm install - -script: - - npm run lint - - npm run build - - export SEQ_SILENT=true - - npm run cover - -after_success: - - 'nyc report --reporter=lcov > coverage.lcov && codecov' diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..371cfb3d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,121 @@ + + +## [2.1.6](https://github.com/RobinBuschmann/sequelize-typescript/compare/v2.1.5...v2.1.6) (2023-11-24) + + +### Bug Fixes + +* deny modifying the object prototype ([#1698](https://github.com/RobinBuschmann/sequelize-typescript/issues/1698)) ([5ce8afd](https://github.com/RobinBuschmann/sequelize-typescript/commit/5ce8afdd1671b08c774ce106b000605ba8fccf78)) + +# Changelog + +## [2.1.5](https://github.com/RobinBuschmann/sequelize-typescript/compare/v2.1.4...v2.1.5) (2022-10-17) + +### Bug Fixes + +- **deps:** revert to glob@7.2.0 for sequelize@6 & node@10 compatibility ([#1479](https://github.com/RobinBuschmann/sequelize-typescript/issues/1479)) ([7c8eea7](https://github.com/RobinBuschmann/sequelize-typescript/commit/7c8eea7bb7f9de5fdb03fef56afb0654808a0d18)) + +## [2.1.4](https://github.com/RobinBuschmann/sequelize-typescript/compare/v2.1.3...v2.1.4) (2022-10-15) + +### Bug Fixes + +- **ci:** bump markdownlint ([#1470](https://github.com/RobinBuschmann/sequelize-typescript/issues/1470)) ([b24869b](https://github.com/RobinBuschmann/sequelize-typescript/commit/b24869bc770289c37b9b74f43630aa63eab706b4)) +- **model:** compatible constructor with sequelize ([#1310](https://github.com/RobinBuschmann/sequelize-typescript/issues/1310)) ([4f03520](https://github.com/RobinBuschmann/sequelize-typescript/commit/4f03520c4c3076a3d7c6ed6fc4ed76f1c06f9ef7)) +- update to TypeScript 4.8 ([#1453](https://github.com/RobinBuschmann/sequelize-typescript/issues/1453)) ([5ddfa61](https://github.com/RobinBuschmann/sequelize-typescript/commit/5ddfa612de51750f0f81e1d8c7e4fc2d03824713)) + +## [2.1.3](https://github.com/RobinBuschmann/sequelize-typescript/compare/v2.1.2...v2.1.3) (2022-02-16) + +### Bug Fixes + +- Fix sequelize/types/lib/hooks path ([#1202](https://github.com/RobinBuschmann/sequelize-typescript/issues/1198)) ([ab45c14](https://github.com/RobinBuschmann/sequelize-typescript/commit/ab45c14da8cbd388f7611c0703e1f198e1f4541b)) + +## [2.1.2](https://github.com/RobinBuschmann/sequelize-typescript/compare/v2.1.1...v2.1.2) (2022-01-03) + +### Bug Fixes + +- use custom decorator on column have a property descriptor ([#1070](https://github.com/RobinBuschmann/sequelize-typescript/issues/1070)) ([7ce03de](https://github.com/RobinBuschmann/sequelize-typescript/commit/7ce03de76b465172994f41a55058ea49f3ce27c3)) +- **validators:** allow any values for isIn/notIn ([#1124](https://github.com/RobinBuschmann/sequelize-typescript/issues/1124)) ([d25b392](https://github.com/RobinBuschmann/sequelize-typescript/commit/d25b39282d2a49e4e5cf286100344e7d1fda3c84)) + +## [2.1.1](https://github.com/RobinBuschmann/sequelize-typescript/compare/v2.1.0...v2.1.1) (2021-10-10) + +### Bug Fixes + +- **model:** adjust init method to recently introduced sequelize type changes ([b60c011](https://github.com/RobinBuschmann/sequelize-typescript/commit/b60c011be2e971e56cb783d4ade994965faab916)) + +## [2.1.0](https://github.com/RobinBuschmann/sequelize-typescript/compare/v2.0.0-beta.1...v2.1.0) (2021-02-14) + +Initial release with Changelog. + +### Bug Fixes + +- allow $set null (remove association) ([#774](https://github.com/RobinBuschmann/sequelize-typescript/issues/774)) ([ffe1c78](https://github.com/RobinBuschmann/sequelize-typescript/commit/ffe1c78df73df7f287b8ce345d6ac0df30283723)) +- model associations methods to reflect sequelize v6 ([#888](https://github.com/RobinBuschmann/sequelize-typescript/issues/888)) ([6b1e3ff](https://github.com/RobinBuschmann/sequelize-typescript/commit/6b1e3fffd974f087be2e18258306f81860923ba3)) +- typeof Model errors by using typeof Model generics ([#900](https://github.com/RobinBuschmann/sequelize-typescript/issues/900)) ([b865840](https://github.com/RobinBuschmann/sequelize-typescript/commit/b8658404f12e7a44893c9b8652714473bb25f495)) + +### Features + +- infer bigint data type ([#893](https://github.com/RobinBuschmann/sequelize-typescript/issues/893)) ([7c467d4](https://github.com/RobinBuschmann/sequelize-typescript/commit/7c467d404a200b3153cc7aa2605d1e542bef3da9)) + +## Older versions + +### ⚠️ sequelize@5 + +`sequelize@5` requires `sequelize-typescript@1`. See +[documentation](https://github.com/RobinBuschmann/sequelize-typescript/tree/1.0.0) for version `1.0`. + +```sh +npm install sequelize-typescript@1.0 +``` + +#### V5 Model definition + +```typescript +import { Table, Model } from 'sequelize-typescript'; + +@Table +class Person extends Model {} +``` + +### ⚠️ sequelize@4 + +`sequelize@4` requires `sequelize-typescript@0.6`. See +[documentation](https://github.com/RobinBuschmann/sequelize-typescript/tree/0.6.X) for version `0.6`. + +```sh +npm install sequelize-typescript@0.6 +``` + +### Upgrade to `sequelize-typescript@2` + +- `sequelize-typescript@2` only works with `sequelize@6.2>=`. + For `sequelize@5` use `sequelize-typescript@1.0`. + +#### Breaking Changes + +- All breaking changes of `sequelize@6` are also valid for `sequelize-typescript@2`. + See [Upgrade to v6](https://sequelize.org/master/manual/upgrade-to-v6.html) for details. +- `@types/bluebird` is no longer needed, `sequelize@6` removed usage of `bluebird` +- Sequelize v6.2 introduced additional model attributes typings, which affects how the model is defined. +- See below comparison between V5 and V6 model definition to show how to upgrade models. +- For more details, see [sequelize typescript docs](https://sequelize.org/master/manual/typescript.html). + +### Upgrade to `sequelize-typescript@1` + +`sequelize-typescript@1` only works with `sequelize@5>=`. +For `sequelize@4` & `sequelize@3` use `sequelize-typescript@0.6`. + +#### Breaking Changes @5 + +All breaking changes of `sequelize@5` are also valid for `sequelize-typescript@1`. +See [Upgrade to v5](https://sequelize.org/v5/manual/upgrade-to-v5.html) for details. + +#### Official Sequelize Typings + +sequelize-typescript now uses the official typings bundled with sequelize +(See [this](https://sequelize.org/v5/manual/upgrade-to-v5.html#typescript-support)). +Please note the following details: + +- Most of the sequelize-typescript interfaces of the previous version are replaced by the official ones +- `@types/sequelize` is no longer used +- `@types/bluebird` is no longer an explicit dependency +- The official typings are less strict than the former sequelize-typescript ones \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5e67904d..1d42e370 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,10 +1,12 @@ -To contribute you can: +# To contribute you can + - Open issues and participate in discussion of other issues. - Fork the project to open up PR's. - Update the [types of Sequelize](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/sequelize). - Anything else constructively helpful. In order to open a pull request please: + - Create a new branch. - Run tests locally (`npm install && npm run build && npm run cover`) and ensure your commits don't break the tests. - Document your work well with commit messages, a good PR description, comments in code when necessary, etc. @@ -12,7 +14,7 @@ In order to open a pull request please: In order to update the types for sequelize please go to [the Definitely Typed repo](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/sequelize), it would also be a good idea to open a PR into [sequelize](https://github.com/sequelize/sequelize) so that Sequelize can maintain its own types, but that might be harder than getting updated types into microsoft's repo. The Typescript team is slowly trying to encourage -npm package maintainers to maintain their own typings, but Microsoft still has dedicated and good people maintaining the DT repo, +npm package maintainers to maintain their own typings, but Microsoft still has dedicated and good people maintaining the DT repo, accepting PR's and keeping quality high. **Keep in mind `sequelize-typescript` does not provide typings for `sequelize`** - these are seperate things. diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 4fffa365..ecf9aefe 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -2,33 +2,44 @@ -**Versions** +# Issue + +## Versions + -- sequelize: -- sequelize-typescript: -- typescript -**I'm submitting a ...** +- sequelize: +- sequelize-typescript: +- typescript: + +## Issue type + -[ ] bug report -[ ] feature request -**Actual behavior:** +- [ ] bug report +- [ ] feature request + +## Actual behavior + -**Expected behavior:** +## Expected behavior + -**Steps to reproduce:** +## Steps to reproduce + -**Related code:** +## Related code + + ```ts insert short code snippets here ``` diff --git a/README.md b/README.md index 111e8d2a..be9411d9 100644 --- a/README.md +++ b/README.md @@ -1,106 +1,87 @@ -[![Build Status](https://travis-ci.org/RobinBuschmann/sequelize-typescript.svg?branch=master)](https://travis-ci.org/RobinBuschmann/sequelize-typescript) -[![codecov](https://codecov.io/gh/RobinBuschmann/sequelize-typescript/branch/master/graph/badge.svg)](https://codecov.io/gh/RobinBuschmann/sequelize-typescript) +# sequelize-typescript + +[![Build Status](https://github.com/sequelize/sequelize-typescript/workflows/Node.js%20CI/badge.svg)](https://github.com/sequelize/sequelize-typescript/actions?query=workflow%3A%22Node.js+CI%22) +[![codecov](https://codecov.io/gh/sequelize/sequelize-typescript/branch/master/graph/badge.svg)](https://codecov.io/gh/sequelize/sequelize-typescript) [![NPM](https://img.shields.io/npm/v/sequelize-typescript.svg)](https://www.npmjs.com/package/sequelize-typescript) -[![Dependency Status](https://img.shields.io/david/RobinBuschmann/sequelize-typescript.svg)](https://www.npmjs.com/package/sequelize-typescript) -# sequelize-typescript -Decorators and some other features for sequelize (v5). - - - [Installation](#installation) - - [Upgrade to `sequelize-typescript@1`](#upgrade-to-sequelize-typescript1) - - [Model Definition](#model-definition) - - [`@Table` API](#table-api) - - [`@Column` API](#column-api) - - [Usage](#usage) - - [Configuration](#configuration) - - [globs](#globs) - - [Model-path resolving](#model-path-resolving) - - [Model association](#model-association) - - [One-to-many](#one-to-many) - - [Many-to-many](#many-to-many) - - [One-to-one](#one-to-one) - - [`@ForeignKey`, `@BelongsTo`, `@HasMany`, `@HasOne`, `@BelongsToMany` API](#foreignkey-belongsto-hasmany-hasone-belongstomany-api) - - [Generated getter and setter](#type-safe-usage-of-auto-generated-functions) - - [Multiple relations of same models](#multiple-relations-of-same-models) - - [Repository mode](#repository-mode) - - [How to enable repository mode?](#how-to-enable-repository-mode) - - [How to use repository mode?](#how-to-use-repository-mode) - - [How to use associations with repository mode?](#how-to-use-associations-with-repository-mode) - - [Limitations of repository mode](#limitations-of-repository-mode) - - [Model validation](#model-validation) - - [Scopes](#scopes) - - [Hooks](#hooks) - - [Why `() => Model`?](#user-content-why---model) - - [Recommendations and limitations](#recommendations-and-limitations) +Decorators and some other features for sequelize (v6). + +- [Installation](#installation) +- [Model Definition](#model-definition) + - [`@Table` API](#table-api) + - [`@Column` API](#column-api) +- [Usage](#usage) + - [Configuration](#configuration) + - [globs](#globs) + - [Model-path resolving](#model-path-resolving) +- [Model association](#model-association) + - [One-to-many](#one-to-many) + - [Many-to-many](#many-to-many) + - [One-to-one](#one-to-one) + - [`@ForeignKey`, `@BelongsTo`, `@HasMany`, `@HasOne`, `@BelongsToMany` API](#foreignkey-belongsto-hasmany-hasone-belongstomany-api) + - [Generated getter and setter](#type-safe-usage-of-auto-generated-functions) + - [Multiple relations of same models](#multiple-relations-of-same-models) +- [Indexes](#indexes) + - [`@Index` API](#index) + - [`createIndexDecorator()` API](#createindexdecorator) +- [Repository mode](#repository-mode) + - [How to enable repository mode?](#how-to-enable-repository-mode) + - [How to use repository mode?](#how-to-use-repository-mode) + - [How to use associations with repository mode?](#how-to-use-associations-with-repository-mode) + - [Limitations of repository mode](#limitations-of-repository-mode) +- [Model validation](#model-validation) +- [Scopes](#scopes) +- [Hooks](#hooks) +- [Why `() => Model`?](#why---model) +- [Recommendations and limitations](#recommendations-and-limitations) ## Installation -*sequelize-typescript* requires [sequelize](https://github.com/sequelize/sequelize), additional typings as documented [here](http://docs.sequelizejs.com/manual/typescript.html) and [reflect-metadata](https://www.npmjs.com/package/reflect-metadata) -``` -npm install sequelize -npm install @types/bluebird @types/node @types/validator -npm install reflect-metadata -``` -``` -npm install sequelize-typescript + +- this assumes usage of `sequelize@6` +- _sequelize-typescript_ requires [sequelize](https://github.com/sequelize/sequelize) +- additional typings as documented [here](https://sequelize.org/master/manual/typescript.html) and [reflect-metadata](https://www.npmjs.com/package/reflect-metadata) + +```sh +npm install --save-dev @types/node @types/validator +npm install sequelize reflect-metadata sequelize-typescript ``` + Your `tsconfig.json` needs the following flags: + ```json "target": "es6", // or a more recent ecmascript version "experimentalDecorators": true, "emitDecoratorMetadata": true ``` -### ⚠️ sequelize@4 -`sequelize@4` requires `sequelize-typescript@0.6`. See -[documentation](https://github.com/RobinBuschmann/sequelize-typescript/tree/0.6.X) for version `0.6`. -``` -npm install sequelize-typescript@0.6 -``` - -## Upgrade to `sequelize-typescript@1` -`sequelize-typescript@1` only works with `sequelize@5>=`. -For `sequelize@4` & `sequelize@3` use `sequelize-typescript@0.6`. - -### Breaking Changes -All breaking changes of `sequelize@5` are also valid for `sequelize-typescript@1`. -See [Upgrade to v5](https://github.com/sequelize/sequelize/blob/master/docs/upgrade-to-v5.md) for details. +### Sequelize Options -#### Official Sequelize Typings -sequelize-typescript now uses the official typings bundled with sequelize -(See [this](https://github.com/sequelize/sequelize/blob/master/docs/upgrade-to-v5.md#typescript-support)). -Please note the following details: -- Most of the sequelize-typescript interfaces of the previous version are replaced by the official ones -- `@types/sequelize` is no longer used -- `@types/bluebird` is no longer an explicit dependency -- The official typings are less strict than the former sequelize-typescript ones - -#### Sequelize Options - `SequelizeConfig` renamed to `SequelizeOptions` - `modelPaths` property renamed to `models` -#### Scopes Options +### Scopes Options + The `@Scopes` and `@DefaultScope` decorators now take lambda's as options + ```ts @DefaultScope(() => ({...})) @Scopes(() => ({...})) ``` + instead of deprecated way: + ```ts @DefaultScope({...}) @Scopes({...})) ``` -### Repository Mode -With `sequelize-typescript@1` comes a repository mode. See [docs](#repository-mode) for details. - - ## Model definition + ```typescript -import {Table, Column, Model, HasMany} from 'sequelize-typescript'; +import { Table, Column, Model, HasMany } from 'sequelize-typescript'; @Table -class Person extends Model { - +class Person extends Model { @Column name: string; @@ -111,70 +92,109 @@ class Person extends Model { hobbies: Hobby[]; } ``` + +### Less strict + +```typescript +import { Table, Model } from 'sequelize-typescript'; + +@Table +class Person extends Model {} +``` + +### More strict + +```typescript +import { Optional } from 'sequelize'; +import { Table, Model } from 'sequelize-typescript'; + +interface PersonAttributes { + id: number; + name: string; +} + +interface PersonCreationAttributes extends Optional {} + +@Table +class Person extends Model {} +``` + The model needs to extend the `Model` class and has to be annotated with the `@Table` decorator. All properties that should appear as a column in the database require the `@Column` annotation. See more advanced example [here](https://github.com/RobinBuschmann/sequelize-typescript-example). - + ### `@Table` + The `@Table` annotation can be used without passing any parameters. To specify some more define options, use -an object literal (all [define options](http://docs.sequelizejs.com/manual/tutorial/models-definition.html#configuration) +an object literal (all [define options](https://sequelize.org/v5/manual/models-definition.html#configuration) from sequelize are valid): + ```typescript @Table({ timestamps: true, ... }) -class Person extends Model {} +class Person extends Model {} ``` + #### Table API -Decorator | Description ---------------------------------------|--------------------- - `@Table` | sets `options.tableName=` and `options.modelName=` automatically - `@Table(options: DefineOptions)` | sets [define options](http://docs.sequelizejs.com/manual/tutorial/models-definition.html#configuration) (also sets `options.tableName=` and `options.modelName=` if not already defined by define options) +| Decorator | Description | +| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@Table` | sets `options.tableName=` and `options.modelName=` automatically | +| `@Table(options: DefineOptions)` | sets [define options](https://sequelize.org/v5/manual/models-definition.html#configuration) (also sets `options.tableName=` and `options.modelName=` if not already defined by define options) | #### Primary key -A primary key (`id`) will be inherited from base class `Model`. This primary key is by default an `INTEGER` and has -`autoIncrement=true` (This behaviour is a native sequelize thing). The id can easily be overridden by marking another + +A primary key (`id`) will be inherited from base class `Model`. This primary key is by default an `INTEGER` and has +`autoIncrement=true` (This behaviour is a native sequelize thing). The id can easily be overridden by marking another attribute as primary key. So either set `@Column({primaryKey: true})` or use `@PrimaryKey` together with `@Column`. #### `@CreatedAt`, `@UpdatedAt`, `@DeletedAt` + Annotations to define custom and type safe `createdAt`, `updatedAt` and `deletedAt` attributes: + ```typescript @CreatedAt creationDate: Date; @UpdatedAt updatedOn: Date; - + @DeletedAt deletionDate: Date; ``` -Decorator | Description --------------------|--------------------- - `@CreatedAt` | sets `timestamps=true` and `createdAt='creationDate'` - `@UpdatedAt` | sets `timestamps=true` and `updatedAt='updatedOn'` - `@DeletedAt` | sets `timestamps=true`, `paranoid=true` and `deletedAt='deletionDate'` +| Decorator | Description | +| ------------ | ---------------------------------------------------------------------- | +| `@CreatedAt` | sets `timestamps=true` and `createdAt='creationDate'` | +| `@UpdatedAt` | sets `timestamps=true` and `updatedAt='updatedOn'` | +| `@DeletedAt` | sets `timestamps=true`, `paranoid=true` and `deletedAt='deletionDate'` | ### `@Column` + The `@Column` annotation can be used without passing any parameters. But therefore it is necessary that the js type can be inferred automatically (see [Type inference](#type-inference) for details). + ```typescript @Column name: string; ``` + If the type cannot or should not be inferred, use: + ```typescript import {DataType} from 'sequelize-typescript'; @Column(DataType.TEXT) name: string; ``` -Or for a more detailed column description, use an object literal -(all [attribute options](http://docs.sequelizejs.com/manual/tutorial/models-definition.html#configuration) + +Or for a more detailed column description, use an object literal +(all [attribute options](https://sequelize.org/v5/manual/models-definition.html#configuration) from sequelize are valid): + ```typescript @Column({ type: DataType.FLOAT, @@ -183,82 +203,94 @@ from sequelize are valid): }) value: number; ``` + #### Column API -Decorator | Description ---------------------------------------|--------------------- - `@Column` | tries to infer [dataType](http://docs.sequelizejs.com/manual/tutorial/models-definition.html#data-types) from js type - `@Column(dataType: DateType)` | sets [dataType](http://docs.sequelizejs.com/manual/tutorial/models-definition.html#data-types) explicitly - `@Column(options: AttributeOptions)` | sets [attribute options](http://docs.sequelizejs.com/manual/tutorial/models-definition.html#configuration) +| Decorator | Description | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------- | +| `@Column` | tries to infer [dataType](https://sequelize.org/v5/manual/models-definition.html#data-types) from js type | +| `@Column(dataType: DataType)` | sets [dataType](https://sequelize.org/v5/manual/models-definition.html#data-types) explicitly | +| `@Column(options: AttributeOptions)` | sets [attribute options](https://sequelize.org/v5/manual/models-definition.html#configuration) | + +#### _Shortcuts_ -#### *Shortcuts* -If you're in love with decorators: *sequelize-typescript* provides some more of them. The following decorators can be +If you're in love with decorators: _sequelize-typescript_ provides some more of them. The following decorators can be used together with the @Column annotation to make some attribute options easier available: -Decorator | Description ---------------------------------------|--------------------- - `@AllowNull(allowNull?: boolean)` | sets `attribute.allowNull` (default is `true`) - `@AutoIncrement` | sets `attribute.autoIncrement=true` - `@Unique` | sets `attribute.unique=true` - `@Default(value: any)` | sets `attribute.defaultValue` to specified value - `@PrimaryKey` | sets `attribute.primaryKey=true` - `@Comment(value: string)` | sets `attribute.comment` to specified string - Validate annotations | see [Model validation](#model-validation) +| Decorator | Description | Options | +| --------------------------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | +| `@AllowNull(allowNull?: boolean)` | sets `attribute.allowNull` (default is `true`) | +| `@AutoIncrement` | sets `attribute.autoIncrement=true` | +| `@Unique(options? UniqueOptions)` | sets `attribute.unique=true` | [UniqueOptions](https://github.com/sequelize/sequelize-typescript/blob/master/src/model/column/column-options/unique.ts#L3) | +| `@Default(value: any)` | sets `attribute.defaultValue` to specified value | +| `@PrimaryKey` | sets `attribute.primaryKey=true` | +| `@Comment(value: string)` | sets `attribute.comment` to specified string | +| Validate annotations | see [Model validation](#model-validation) | ### Type inference + The following types can be automatically inferred from javascript type. Others have to be defined explicitly. -Design type | Sequelize data type ------------------|--------------------- - `string` | `STRING` - `boolean` | `BOOLEAN` - `number` | `INTEGER` - `Date` | `DATE` - `Buffer` | `BLOB` - +| Design type | Sequelize data type | +| ----------- | ------------------- | +| `string` | `STRING` | +| `boolean` | `BOOLEAN` | +| `number` | `INTEGER` | +| `bigint` | `BIGINT` | +| `Date` | `DATE` | +| `Buffer` | `BLOB` | + ### Accessors + Get/set accessors do work as well + ```typescript @Table -class Person extends Model { - +class Person extends Model { @Column get name(): string { return 'My name is ' + this.getDataValue('name'); } - + set name(value: string) { this.setDataValue('name', value); } } ``` - + ## Usage -Except for minor variations *sequelize-typescript* will work like pure sequelize. -(See sequelize [docs](http://docs.sequelizejs.com/manual/tutorial/models-usage.html)) + +Except for minor variations _sequelize-typescript_ will work like pure sequelize. +(See sequelize [docs](https://docs.sequelizejs.com/manual/tutorial/models-usage.html)) + ### Configuration -To make the defined models available, you have to configure a `Sequelize` instance from `sequelize-typescript`(!). + +To make the defined models available, you have to configure a `Sequelize` instance from `sequelize-typescript`(!). + ```typescript -import {Sequelize} from 'sequelize-typescript'; +import { Sequelize } from 'sequelize-typescript'; -const sequelize = new Sequelize({ - database: 'some_db', - dialect: 'sqlite', - username: 'root', - password: '', - storage: ':memory:', - models: [__dirname + '/models'], // or [Player, Team], +const sequelize = new Sequelize({ + database: 'some_db', + dialect: 'sqlite', + username: 'root', + password: '', + storage: ':memory:', + models: [__dirname + '/models'], // or [Player, Team], }); ``` -Before you can use your models you have to tell sequelize where they can be found. So either set `models` in the -sequelize config or add the required models later on by calling `sequelize.addModels([Person])` or + +Before you can use your models you have to tell sequelize where they can be found. So either set `models` in the +sequelize config or add the required models later on by calling `sequelize.addModels([Person])` or `sequelize.addModels([__dirname + '/models'])`: ```typescript sequelize.addModels([Person]); sequelize.addModels(['path/to/models']); ``` + ### globs + ```typescript import {Sequelize} from 'sequelize-typescript'; @@ -271,11 +303,14 @@ sequelize.addModels([__dirname + '/**/*.model.ts']); ``` #### Model-path resolving + A model is matched to a file by its filename. E.g. + ```typescript // File User.ts matches the following exported model. -export class User extends Model {} +export class User extends Model {} ``` + This is done by comparison of the filename against all exported members. The matching can be customized by specifying the `modelMatch` function in the configuration object. @@ -305,7 +340,7 @@ export const UserN = 'Not a model'; export const NUser = 'Not a model'; @Table -export class User extends Model { +export class User extends Model { @Column nickname: string; @@ -313,7 +348,8 @@ export class User extends Model { ``` The `modelMatch` function will be called three times with the following arguments. -``` + +```text user.model UserN -> false user.model NUser -> false user.model User -> true (User will be added as model) @@ -322,74 +358,76 @@ user.model User -> true (User will be added as model) Another way to match model to file is to make your model the default export. ```TypeScript -export default class User extends Model {} +export default class User extends Model {} ``` > ⚠️ When using paths to add models, keep in mind that they will be loaded during runtime. This means that the path -> may differ from development time to execution time. For instance, using `.ts` extension within paths will only work +> may differ from development time to execution time. For instance, using `.ts` extension within paths will only work > together with [ts-node](https://github.com/TypeStrong/ts-node). ### Build and create + Instantiation and inserts can be achieved in the good old sequelize way + ```typescript -const person = Person.build({name: 'bob', age: 99}); +const person = Person.build({ name: 'bob', age: 99 }); person.save(); -Person.create({name: 'bob', age: 99}); +Person.create({ name: 'bob', age: 99 }); ``` -but *sequelize-typescript* also makes it possible to create instances with `new`: + +but _sequelize-typescript_ also makes it possible to create instances with `new`: + ```typescript -const person = new Person({name: 'bob', age: 99}); +const person = new Person({ name: 'bob', age: 99 }); person.save(); ``` ### Find and update -Finding and updating entries does also work like using native sequelize. So see sequelize -[docs](http://docs.sequelizejs.com/manual/tutorial/models-usage.html) for more details. -```typescript -Person - .findOne() - .then(person => { - - person.age = 100; - return person.save(); - }); - -Person - .update({ - name: 'bobby' - }, {where: {id: 1}}) - .then(() => { - - }); + +Finding and updating entries does also work like using native sequelize. So see sequelize +[docs](https://docs.sequelizejs.com/manual/tutorial/models-usage.html) for more details. + +```typescript +Person.findOne().then((person) => { + person.age = 100; + return person.save(); +}); + +Person.update( + { + name: 'bobby', + }, + { where: { id: 1 } } +).then(() => {}); ``` ## Model association + Relations can be described directly in the model by the `@HasMany`, `@HasOne`, `@BelongsTo`, `@BelongsToMany` and `@ForeignKey` annotations. ### One-to-many + ```typescript @Table -class Player extends Model { - +class Player extends Model { @Column name: string; @Column num: number; - + @ForeignKey(() => Team) @Column teamId: number; - + @BelongsTo(() => Team) team: Team; } @Table -class Team extends Model { - +class Team extends Model { @Column name: string; @@ -397,36 +435,34 @@ class Team extends Model { players: Player[]; } ``` -That's all, *sequelize-typescript* does everything else for you. So when retrieving a team by `find` -```typescript -Team - .findOne({include: [Player]}) - .then(team => { - - team.players.forEach(player => console.log(`Player ${player.name}`)); - }) +That's all, _sequelize-typescript_ does everything else for you. So when retrieving a team by `find` + +```typescript +Team.findOne({ include: [Player] }).then((team) => { + team.players.forEach((player) => console.log(`Player ${player.name}`)); +}); ``` + the players will also be resolved (when passing `include: Player` to the find options) ### Many-to-many + ```typescript @Table -class Book extends Model { +class Book extends Model { @BelongsToMany(() => Author, () => BookAuthor) authors: Author[]; } @Table -class Author extends Model { - +class Author extends Model { @BelongsToMany(() => Book, () => BookAuthor) books: Book[]; } @Table -class BookAuthor extends Model { - +class BookAuthor extends Model { @ForeignKey(() => Book) @Column bookId: number; @@ -436,65 +472,69 @@ class BookAuthor extends Model { authorId: number; } ``` -#### Type safe *through*-table instance access -To access the *through*-table instance (instanceOf `BookAuthor` in the upper example) type safely, the type + +#### Type safe _through_-table instance access + +To access the _through_-table instance (instanceOf `BookAuthor` in the upper example) type safely, the type need to be set up manually. For `Author` model it can be achieved like so: + ```ts @BelongsToMany(() => Book, () => BookAuthor) books: Array; ``` ### One-to-one -For one-to-one use `@HasOne(...)`(foreign key for the relation exists on the other model) and + +For one-to-one use `@HasOne(...)`(foreign key for the relation exists on the other model) and `@BelongsTo(...)` (foreign key for the relation exists on this model) ### `@ForeignKey`, `@BelongsTo`, `@HasMany`, `@HasOne`, `@BelongsToMany` API -Decorator | Description -------------------------------------------|--------------------- - `@ForeignKey(relatedModelGetter: () => typeof Model)` | marks property as `foreignKey` for related class - `@BelongsTo(relatedModelGetter: () => typeof Model)` | sets `SourceModel.belongsTo(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is resolved from source class - `@BelongsTo(relatedModelGetter: () => typeof Model, foreignKey: string)` | sets `SourceModel.belongsTo(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is explicitly specified value - `@BelongsTo(relatedModelGetter: () => typeof Model, options: AssociationOptionsBelongsTo)` | sets `SourceModel.belongsTo(RelatedModel, ...)` while `as` is key of annotated property and `options` are additional association options - `@HasMany(relatedModelGetter: () => typeof Model)` | sets `SourceModel.hasMany(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is resolved from target related class - `@HasMany(relatedModelGetter: () => typeof Model, foreignKey: string)` | sets `SourceModel.hasMany(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is explicitly specified value - `@HasMany(relatedModelGetter: () => typeof Model, options: AssociationOptionsHasMany)` | sets `SourceModel.hasMany(RelatedModel, ...)` while `as` is key of annotated property and `options` are additional association options - `@HasOne(relatedModelGetter: () => typeof Model)` | sets `SourceModel.hasOne(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is resolved from target related class - `@HasOne(relatedModelGetter: () => typeof Model, foreignKey: string)` | sets `SourceModel.hasOne(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is explicitly specified value - `@HasOne(relatedModelGetter: () => typeof Model, options: AssociationOptionsHasOne)` | sets `SourceModel.hasOne(RelatedModel, ...)` while `as` is key of annotated property and `options` are additional association options - `@BelongsToMany(relatedModelGetter: () => typeof Model, through: (() => typeof Model))` | sets `SourceModel.belongsToMany(RelatedModel, {through: ThroughModel, ...})` while `as` is key of annotated property and `foreignKey`/`otherKey` is resolved from through class - `@BelongsToMany(relatedModelGetter: () => typeof Model, through: (() => typeof Model), foreignKey: string)`| sets `SourceModel.belongsToMany(RelatedModel, {through: ThroughModel, ...})` while `as` is key of annotated property, `foreignKey` is explicitly specified value and `otherKey` is resolved from through class - `@BelongsToMany(relatedModelGetter: () => typeof Model, through: (() => typeof Model), foreignKey: string, otherKey: string)`| sets `SourceModel.belongsToMany(RelatedModel, {through: ThroughModel, ...})` while `as` is key of annotated property and `foreignKey`/`otherKey` are explicitly specified values - `@BelongsToMany(relatedModelGetter: () => typeof Model, through: string, foreignKey: string, otherKey: string)` | sets `SourceModel.belongsToMany(RelatedModel, {through: throughString, ...})` while `as` is key of annotated property and `foreignKey`/`otherKey` are explicitly specified values - `@BelongsToMany(relatedModelGetter: () => typeof Model, options: AssociationOptionsBelongsToMany)` | sets `SourceModel.belongsToMany(RelatedModel, {through: throughString, ...})` while `as` is key of annotated property and `options` are additional association values, including `foreignKey` and `otherKey`. +| Decorator | Description | +| ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@ForeignKey(relatedModelGetter: () => typeof Model)` | marks property as `foreignKey` for related class | +| `@BelongsTo(relatedModelGetter: () => typeof Model)` | sets `SourceModel.belongsTo(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is resolved from source class | +| `@BelongsTo(relatedModelGetter: () => typeof Model, foreignKey: string)` | sets `SourceModel.belongsTo(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is explicitly specified value | +| `@BelongsTo(relatedModelGetter: () => typeof Model, options: AssociationOptionsBelongsTo)` | sets `SourceModel.belongsTo(RelatedModel, ...)` while `as` is key of annotated property and `options` are additional association options | +| `@HasMany(relatedModelGetter: () => typeof Model)` | sets `SourceModel.hasMany(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is resolved from target related class | +| `@HasMany(relatedModelGetter: () => typeof Model, foreignKey: string)` | sets `SourceModel.hasMany(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is explicitly specified value | +| `@HasMany(relatedModelGetter: () => typeof Model, options: AssociationOptionsHasMany)` | sets `SourceModel.hasMany(RelatedModel, ...)` while `as` is key of annotated property and `options` are additional association options | +| `@HasOne(relatedModelGetter: () => typeof Model)` | sets `SourceModel.hasOne(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is resolved from target related class | +| `@HasOne(relatedModelGetter: () => typeof Model, foreignKey: string)` | sets `SourceModel.hasOne(RelatedModel, ...)` while `as` is key of annotated property and `foreignKey` is explicitly specified value | +| `@HasOne(relatedModelGetter: () => typeof Model, options: AssociationOptionsHasOne)` | sets `SourceModel.hasOne(RelatedModel, ...)` while `as` is key of annotated property and `options` are additional association options | +| `@BelongsToMany(relatedModelGetter: () => typeof Model, through: (() => typeof Model))` | sets `SourceModel.belongsToMany(RelatedModel, {through: ThroughModel, ...})` while `as` is key of annotated property and `foreignKey`/`otherKey` is resolved from through class | +| `@BelongsToMany(relatedModelGetter: () => typeof Model, through: (() => typeof Model), foreignKey: string)` | sets `SourceModel.belongsToMany(RelatedModel, {through: ThroughModel, ...})` while `as` is key of annotated property, `foreignKey` is explicitly specified value and `otherKey` is resolved from through class | +| `@BelongsToMany(relatedModelGetter: () => typeof Model, through: (() => typeof Model), foreignKey: string, otherKey: string)` | sets `SourceModel.belongsToMany(RelatedModel, {through: ThroughModel, ...})` while `as` is key of annotated property and `foreignKey`/`otherKey` are explicitly specified values | +| `@BelongsToMany(relatedModelGetter: () => typeof Model, through: string, foreignKey: string, otherKey: string)` | sets `SourceModel.belongsToMany(RelatedModel, {through: throughString, ...})` while `as` is key of annotated property and `foreignKey`/`otherKey` are explicitly specified values | +| `@BelongsToMany(relatedModelGetter: () => typeof Model, options: AssociationOptionsBelongsToMany)` | sets `SourceModel.belongsToMany(RelatedModel, {through: throughString, ...})` while `as` is key of annotated property and `options` are additional association values, including `foreignKey` and `otherKey`. | Note that when using AssociationOptions, certain properties will be overwritten when the association is built, based on reflection metadata or explicit attribute parameters. For example, `as` will always be the annotated property's name, and `through` will be the explicitly stated value. - + ### Multiple relations of same models -*sequelize-typescript* resolves the foreign keys by identifying the corresponding class references. + +_sequelize-typescript_ resolves the foreign keys by identifying the corresponding class references. So if you define a model with multiple relations like + ```typescript @Table -class Book extends Model { - +class Book extends Model { @ForeignKey(() => Person) @Column authorId: number; - + @BelongsTo(() => Person) - author: Person; - + author: Person; + @ForeignKey(() => Person) @Column proofreaderId: number; - + @BelongsTo(() => Person) proofreader: Person; } @Table -class Person extends Model { - +class Person extends Model { @HasMany(() => Book) writtenBooks: Book[]; @@ -502,17 +542,19 @@ class Person extends Model { proofedBooks: Book[]; } ``` -*sequelize-typescript* cannot know which foreign key to use for which relation. So you have to add the foreign keys + +_sequelize-typescript_ cannot know which foreign key to use for which relation. So you have to add the foreign keys explicitly: + ```typescript // in class "Books": @BelongsTo(() => Person, 'authorId') - author: Person; + author: Person; @BelongsTo(() => Person, 'proofreaderId') - proofreader: Person; - + proofreader: Person; + // in class "Person": @HasMany(() => Book, 'authorId') writtenBooks: Book[]; @@ -522,73 +564,201 @@ explicitly: ``` ### Type safe usage of auto generated functions + With the creation of a relation, sequelize generates some method on the corresponding models. So when you create a 1:n relation between `ModelA` and `ModelB`, an instance of `ModelA` will -have the functions `getModelBs`, `setModelBs`, `addModelB`, `removeModelB`, `hasModelB`. These functions still exist with *sequelize-typescript*. -But TypeScript wont recognize them and will complain if you try to access `getModelB`, `setModelB` or -`addModelB`. To make TypeScript happy, the `Model.prototype` of *sequelize-typescript* has `$set`, `$get`, `$add` -functions. +have the functions `getModelBs`, `setModelBs`, `addModelB`, `removeModelB`, `hasModelB`. These functions still exist with _sequelize-typescript_. +But TypeScript wont recognize them and will complain if you try to access `getModelB`, `setModelB` or +`addModelB`. To make TypeScript happy, the `Model.prototype` of _sequelize-typescript_ has `$set`, `$get`, `$add` +functions. + ```typescript @Table -class ModelA extends Model { - +class ModelA extends Model { @HasMany(() => ModelB) bs: ModelB[]; } @Table -class ModelB extends Model { - +class ModelB extends Model { @BelongsTo(() => ModelA) a: ModelA; } ``` + To use them, pass the property key of the respective relation as the first parameter: + ```typescript const modelA = new ModelA(); -modelA.$set('bs', [ /* instance */]).then( /* ... */); -modelA.$add('b', /* instance */).then( /* ... */); -modelA.$get('bs').then( /* ... */); -modelA.$count('bs').then( /* ... */); -modelA.$has('bs').then( /* ... */); -modelA.$remove('bs', /* instance */ ).then( /* ... */); -modelA.$create('bs', /* value */ ).then( /* ... */); +modelA + .$set('bs', [ + /* instance */ + ]) + .then(/* ... */); +modelA.$add('b' /* instance */).then(/* ... */); +modelA.$get('bs').then(/* ... */); +modelA.$count('bs').then(/* ... */); +modelA.$has('bs').then(/* ... */); +modelA.$remove('bs' /* instance */).then(/* ... */); +modelA.$create('bs' /* value */).then(/* ... */); +``` + +## Indexes + +### `@Index` + +The `@Index` annotation can be used without passing any parameters. + +```typescript +@Table +class Person extends Model { + @Index // Define an index with default name + @Column + name: string; + + @Index // Define another index + @Column + birthday: Date; +} +``` + +To specify index and index field options, use +an object literal (see [indexes define option](https://sequelize.org/v5/manual/models-definition.html#indexes)): + +```typescript +@Table +class Person extends Model { + @Index('my-index') // Define a multi-field index on name and birthday + @Column + name: string; + + @Index('my-index') // Add birthday as the second field to my-index + @Column + birthday: Date; + + @Index({ + // index options + name: 'job-index', + parser: 'my-parser', + type: 'UNIQUE', + unique: true, + where: { isEmployee: true }, + concurrently: true, + using: 'BTREE', + operator: 'text_pattern_ops', + prefix: 'test-', + // index field options + length: 10, + order: 'ASC', + collate: 'NOCASE', + }) + @Column + jobTitle: string; + + @Column + isEmployee: boolean; +} +``` + +#### Index API + +| Decorator | Description | +| ---------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| `@Index` | adds new index on decorated field to `options.indexes` | +| `@Index(name: string)` | adds new index or adds the field to an existing index with specified name | +| `@Table(options: IndexDecoratorOptions)` | sets both index and index field [options](https://sequelize.org/v5/manual/models-definition.html#indexes) | + +### `createIndexDecorator()` + +The `createIndexDecorator()` function can be used to create a decorator for an index with options specified with an object literal supplied as the argument. Fields are added to the index by decorating properties. + +```typescript +const SomeIndex = createIndexDecorator(); +const JobIndex = createIndexDecorator({ + // index options + name: 'job-index', + parser: 'my-parser', + type: 'UNIQUE', + unique: true, + where: { isEmployee: true }, + concurrently: true, + using: 'BTREE', + operator: 'text_pattern_ops', + prefix: 'test-', +}); + +@Table +class Person extends Model { + @SomeIndex // Add name to SomeIndex + @Column + name: string; + + @SomeIndex // Add birthday to SomeIndex + @Column + birthday: Date; + + @JobIndex({ + // index field options + length: 10, + order: 'ASC', + collate: 'NOCASE', + }) + @Column + jobTitle: string; + + @Column + isEmployee: boolean; +} ``` ## Repository mode -The repository mode makes it possible to separate static operations like `find`, `create`, ... from model definitions. + +With `sequelize-typescript@1` comes a repository mode. See [docs](#repository-mode) for details. + +The repository mode makes it possible to separate static operations like `find`, `create`, ... from model definitions. It also empowers models so that they can be used with multiple sequelize instances. ### How to enable repository mode? + Enable repository mode by setting `repositoryMode` flag: + ```typescript const sequelize = new Sequelize({ repositoryMode: true, ..., }); ``` + ### How to use repository mode? + Retrieve repository to create instances or perform search operations: + ```typescript const userRepository = sequelize.getRepository(User); -const luke = await userRepository.create({name: 'Luke Skywalker'}); -const luke = await userRepository.findOne({where: {name: 'luke'}}); +const luke = await userRepository.create({ name: 'Luke Skywalker' }); +const luke = await userRepository.findOne({ where: { name: 'luke' } }); ``` + ### How to use associations with repository mode? + For now one need to use the repositories within the include options in order to retrieve or create related data: + ```typescript const userRepository = sequelize.getRepository(User); const addressRepository = sequelize.getRepository(Address); -userRepository.find({include: [addressRepository]}); -userRepository.create({name: 'Bear'}, {include: [addressRepository]}); +userRepository.find({ include: [addressRepository] }); +userRepository.create({ name: 'Bear' }, { include: [addressRepository] }); ``` + > ⚠️ This will change in the future: One will be able to refer the model classes instead of the repositories. ### Limitations of repository mode + Nested scopes and includes in general won't work when using `@Scope` annotation together with repository mode like: + ```typescript @Scopes(() => ({ // includes @@ -598,37 +768,40 @@ Nested scopes and includes in general won't work when using `@Scope` annotation // nested scopes withAddressIncludingLatLng: { include: [() => Address.scope('withLatLng')], - } + }, })) @Table -class User extends Model {} +class User extends Model {} ``` + > ⚠️ This will change in the future: Simple includes will be implemented. ## Model validation -Validation options can be set through the `@Column` annotation, but if you prefer to use separate decorators for -validation instead, you can do so by simply adding the validate options *as* decorators: -So that `validate.isEmail=true` becomes `@IsEmail`, `validate.equals='value'` becomes `@Equals('value')` -and so on. Please notice that a validator that expects a boolean is translated to an annotation without a parameter. -See sequelize [docs](http://docs.sequelizejs.com/manual/tutorial/models-definition.html#validations) +Validation options can be set through the `@Column` annotation, but if you prefer to use separate decorators for +validation instead, you can do so by simply adding the validate options _as_ decorators: +So that `validate.isEmail=true` becomes `@IsEmail`, `validate.equals='value'` becomes `@Equals('value')` +and so on. Please notice that a validator that expects a boolean is translated to an annotation without a parameter. + +See sequelize [docs](https://sequelize.org/v5/manual/models-definition.html#validations) for all validators. ### Exceptions + The following validators cannot simply be translated from sequelize validator to an annotation: -Validator | Annotation ----------------------------------|-------------------------------------------------------- - `validate.len=[number, number]` | `@Length({max?: number, min?: number})` - `validate[customName: string]` | For custom validators also use the `@Is(...)` annotation: Either `@Is('custom', (value) => { /* ... */})` or with named function `@Is(function custom(value) { /* ... */})` - +| Validator | Annotation | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `validate.len=[number, number]` | `@Length({max?: number, min?: number})` | +| `validate[customName: string]` | For custom validators also use the `@Is(...)` annotation: Either `@Is('custom', (value) => { /* ... */})` or with named function `@Is(function custom(value) { /* ... */})` | + ### Example + ```typescript const HEX_REGEX = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/; @Table -export class Shoe extends Model { - +export class Shoe extends Model { @IsUUID(4) @PrimaryKey @Column @@ -642,7 +815,7 @@ export class Shoe extends Model { @Column special: string; - @Length({min: 3, max: 15}) + @Length({ min: 3, max: 15 }) @Column brand: string; @@ -678,25 +851,26 @@ export class Shoe extends Model { ``` ## Scopes + Scopes can be defined with annotations as well. The scope options are identical to native -sequelize (See sequelize [docs](http://docs.sequelizejs.com/manual/tutorial/scopes.html) for more details) +sequelize (See sequelize [docs](https://sequelize.org/master/manual/scopes.html) for more details) ### `@DefaultScope` and `@Scopes` + ```typescript @DefaultScope(() => ({ - attributes: ['id', 'primaryColor', 'secondaryColor', 'producedAt'] + attributes: ['id', 'primaryColor', 'secondaryColor', 'producedAt'], })) @Scopes(() => ({ full: { - include: [Manufacturer] + include: [Manufacturer], }, yellow: { - where: {primaryColor: 'yellow'} - } + where: { primaryColor: 'yellow' }, + }, })) @Table -export class ShoeWithScopes extends Model { - +export class ShoeWithScopes extends Model { @Column readonly secretKey: string; @@ -719,6 +893,7 @@ export class ShoeWithScopes extends Model { ``` ## Hooks + Hooks can be attached to your models. All Model-level hooks are supported. See [the related unit tests](test/models/Hook.ts) for a summary. Each hook must be a `static` method. Multiple hooks can be attached to a single method, and you can define multiple methods for a given hook. @@ -727,7 +902,7 @@ The name of the method cannot be the same as the name of the hook (for example, ```typescript @Table -export class Person extends Model { +export class Person extends Model { @Column name: string; @@ -747,41 +922,46 @@ export class Person extends Model { ``` ## Why `() => Model`? + `@ForeignKey(Model)` is much easier to read, so why is `@ForeignKey(() => Model)` so important? When it comes to circular-dependencies (which are in general solved by node for you) `Model` can be `undefined` when it gets passed to @ForeignKey. With the usage of a function, which returns the actual model, we prevent this issue. -## Recommendations and limitations +## Recommendations and limitations ### One Sequelize instance per model (without repository mode) -Unless you are using the [repository mode](#repository-mode), you won't be able to add one and the same model to multiple + +Unless you are using the [repository mode](#repository-mode), you won't be able to add one and the same model to multiple Sequelize instances with differently configured connections. So that one model will only work for one connection. ### One model class per file + This is not only good practice regarding design, but also matters for the order -of execution. Since Typescript creates a `__metadata("design:type", SomeModel)` call due to `emitDecoratorMetadata` +of execution. Since Typescript creates a `__metadata("design:type", SomeModel)` call due to `emitDecoratorMetadata` compile option, in some cases `SomeModel` is probably not defined(not undefined!) and would throw a `ReferenceError`. When putting `SomeModel` in a separate file, it would look like `__metadata("design:type", SomeModel_1.SomeModel)`, which does not throw an error. ### Minification -If you need to minify your code, you need to set `tableName` and `modelName` + +If you need to minify your code, you need to set `tableName` and `modelName` in the `DefineOptions` for `@Table` annotation. sequelize-typescript -uses the class name as default name for `tableName` and `modelName`. +uses the class name as default name for `tableName` and `modelName`. When the code is minified the class name will no longer be the originally defined one (So that `class User` will become `class b` for example). - -# Contributing +## Contributing To contribute you can: + - Open issues and participate in discussion of other issues. - Fork the project to open up PR's. - Update the [types of Sequelize](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/sequelize). - Anything else constructively helpful. In order to open a pull request please: + - Create a new branch. - Run tests locally (`npm install && npm run build && npm run cover`) and ensure your commits don't break the tests. - Document your work well with commit messages, a good PR description, comments in code when necessary, etc. @@ -789,7 +969,7 @@ In order to open a pull request please: In order to update the types for sequelize please go to [the Definitely Typed repo](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/sequelize), it would also be a good idea to open a PR into [sequelize](https://github.com/sequelize/sequelize) so that Sequelize can maintain its own types, but that might be harder than getting updated types into microsoft's repo. The Typescript team is slowly trying to encourage -npm package maintainers to maintain their own typings, but Microsoft still has dedicated and good people maintaining the DT repo, +npm package maintainers to maintain their own typings, but Microsoft still has dedicated and good people maintaining the DT repo, accepting PR's and keeping quality high. **Keep in mind `sequelize-typescript` does not provide typings for `sequelize`** - these are seperate things. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..32ae5b6b --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,16 @@ +# Security Policy + +## Supported versions + +The following table describes the versions of this project that are currently supported with security updates: + +| Version | Supported | +| ------- | ------------------ | +| 2.x | :heavy_check_mark: | + +## Responsible disclosure policy + +At Sequelize, we prioritize security issues and will try to fix them as soon as they are disclosed. + +If you discover a security vulnerability, please create a security advisory [here](https://github.com/sequelize/sequelize-typescript/security/advisories/new). +Otherwise, contact the project maintainers privately. You can find related information in [CONTACT.md](https://github.com/sequelize/sequelize/blob/main/CONTACT.md) of the core sequelize repository. diff --git a/examples/repository-mode/lib/posts/Post.ts b/examples/repository-mode/lib/posts/Post.ts index 444f5532..714c17f2 100644 --- a/examples/repository-mode/lib/posts/Post.ts +++ b/examples/repository-mode/lib/posts/Post.ts @@ -3,7 +3,7 @@ import {Model, Table, Column, ForeignKey, BelongsTo} from 'sequelize-typescript' import {User} from '../users/User'; @Table -export class Post extends Model { +export class Post extends Model { @Column text!: string; @ForeignKey(() => User) @Column userId!: number; diff --git a/examples/repository-mode/lib/users/User.ts b/examples/repository-mode/lib/users/User.ts index 301dc8df..5b3d0f78 100644 --- a/examples/repository-mode/lib/users/User.ts +++ b/examples/repository-mode/lib/users/User.ts @@ -3,7 +3,7 @@ import {Model, Table, Column, HasMany} from 'sequelize-typescript'; import {Post} from '../posts/Post'; @Table -export class User extends Model { +export class User extends Model { @Column name!: string; @HasMany(() => Post) posts: Post[]; diff --git a/examples/repository-mode/package-lock.json b/examples/repository-mode/package-lock.json index 34b339e1..e4c833ea 100644 --- a/examples/repository-mode/package-lock.json +++ b/examples/repository-mode/package-lock.json @@ -100,7 +100,7 @@ "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "argparse": { "version": "1.0.10", @@ -132,9 +132,9 @@ "integrity": "sha1-NUvjMH/9CEM6ePXh4glYRfifx/4=" }, "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { "version": "1.18.3", @@ -186,7 +186,7 @@ "cls-bluebird": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", - "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", + "integrity": "sha512-XVb0RPmHQyy35Tz9z34gvtUcBKUK8A/1xkGCyeFc9B0C7Zr5SysgFaswRVdwI5NEMcO+3JKlIDGIOgERSn9NdA==", "requires": { "is-bluebird": "^1.0.2", "shimmer": "^1.1.0" @@ -259,9 +259,9 @@ "dev": true }, "dottie": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", - "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, "ee-first": { "version": "1.1.1", @@ -432,7 +432,7 @@ "inflection": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==" }, "inflight": { "version": "1.0.6", @@ -461,7 +461,7 @@ "is-bluebird": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", - "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" + "integrity": "sha512-PDRu1vVip5dGQg5tfn2qVCCyxbBYu5MhYUJwSfL/RoGBI97n1fxvilVazxzptZW0gcmsMH17H4EVZZI5E/RSeA==" }, "is-buffer": { "version": "1.1.6", @@ -495,9 +495,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "make-error": { "version": "1.3.5", @@ -572,43 +572,35 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "version": "1.2.7", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.6", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + "minimist": "^1.2.6" } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.23.tgz", - "integrity": "sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w==", + "version": "0.5.37", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.37.tgz", + "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==", "requires": { "moment": ">= 2.9.0" } @@ -780,55 +772,51 @@ } }, "sequelize": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.1.0.tgz", - "integrity": "sha512-LmjEAedMTItkIx0mcBfXVmdkkIQOc+1reuv+UpqSADGvQofZ4Sn9ElUBE8egLgCK4oWjy1Ybsju+YDAJpCv1ww==", + "version": "5.22.5", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.22.5.tgz", + "integrity": "sha512-ySIHof18sJbeVG4zjEvsDL490cd9S14/IhkCrZR/g0C/FPlZq1AzEJVeSAo++9/sgJH2eERltAIGqYQNgVqX/A==", "requires": { "bluebird": "^3.5.0", "cls-bluebird": "^2.1.0", "debug": "^4.1.1", - "depd": "^2.0.0", "dottie": "^2.0.0", "inflection": "1.12.0", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "moment": "^2.24.0", "moment-timezone": "^0.5.21", - "retry-as-promised": "^3.1.0", - "semver": "^5.6.0", - "sequelize-pool": "^1.0.2", + "retry-as-promised": "^3.2.0", + "semver": "^6.3.0", + "sequelize-pool": "^2.3.0", "toposort-class": "^1.0.1", - "uuid": "^3.2.1", - "validator": "^10.11.0", - "wkx": "^0.4.6" + "uuid": "^8.3.2", + "validator": "^13.7.0", + "wkx": "^0.4.8" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "sequelize-pool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-1.0.2.tgz", - "integrity": "sha512-VMKl/gCCdIvB1gFZ7p+oqLFEyZEz3oMMYjkKvfEC7GoO9bBcxmfOOU9RdkoltfXGgBZFigSChihRly2gKtsh2w==", - "requires": { - "bluebird": "^3.5.3" - } + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", + "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==" }, "sequelize-typescript": { "version": "1.0.0-alpha.9", @@ -991,7 +979,7 @@ "toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" }, "ts-node": { "version": "7.0.1", @@ -1029,14 +1017,14 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" }, "vary": { "version": "1.1.2", @@ -1052,9 +1040,9 @@ } }, "wkx": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.6.tgz", - "integrity": "sha512-LHxXlzRCYQXA9ZHgs8r7Gafh0gVOE8o3QmudM1PIkOdkXXjW7Thcl+gb2P2dRuKgW8cqkitCRZkkjtmWzpHi7A==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", + "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", "requires": { "@types/node": "*" } diff --git a/examples/repository-mode/package.json b/examples/repository-mode/package.json index 74edfbeb..139d73f1 100644 --- a/examples/repository-mode/package.json +++ b/examples/repository-mode/package.json @@ -17,7 +17,7 @@ "dependencies": { "body-parser": "^1.18.3", "express": "^4.16.4", - "sequelize": "^5.1.0", + "sequelize": "^5.22.5", "sequelize-typescript": "^1.0.0-alpha.9", "strong-error-handler": "^3.2.0" } diff --git a/examples/simple/lib/posts/Post.ts b/examples/simple/lib/posts/Post.ts index 444f5532..714c17f2 100644 --- a/examples/simple/lib/posts/Post.ts +++ b/examples/simple/lib/posts/Post.ts @@ -3,7 +3,7 @@ import {Model, Table, Column, ForeignKey, BelongsTo} from 'sequelize-typescript' import {User} from '../users/User'; @Table -export class Post extends Model { +export class Post extends Model { @Column text!: string; @ForeignKey(() => User) @Column userId!: number; diff --git a/examples/simple/lib/users/User.ts b/examples/simple/lib/users/User.ts index 301dc8df..5b3d0f78 100644 --- a/examples/simple/lib/users/User.ts +++ b/examples/simple/lib/users/User.ts @@ -3,7 +3,7 @@ import {Model, Table, Column, HasMany} from 'sequelize-typescript'; import {Post} from '../posts/Post'; @Table -export class User extends Model { +export class User extends Model { @Column name!: string; @HasMany(() => Post) posts: Post[]; diff --git a/examples/simple/package-lock.json b/examples/simple/package-lock.json index 34b339e1..3a1e7e6e 100644 --- a/examples/simple/package-lock.json +++ b/examples/simple/package-lock.json @@ -82,7 +82,7 @@ "accept-language": { "version": "3.0.18", "resolved": "https://registry.npmjs.org/accept-language/-/accept-language-3.0.18.tgz", - "integrity": "sha1-9QJfF79lpGaoRYOMz5jNuHfYM4Q=", + "integrity": "sha512-sUofgqBPzgfcF20sPoBYGQ1IhQLt2LSkxTnlQSuLF3n5gPEqd5AimbvOvHEi0T1kLMiGVqPWzI5a9OteBRth3A==", "requires": { "bcp47": "^1.1.2", "stable": "^0.1.6" @@ -97,10 +97,18 @@ "negotiator": "0.6.1" } }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "argparse": { "version": "1.0.10", @@ -121,6 +129,11 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -129,12 +142,12 @@ "bcp47": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/bcp47/-/bcp47-1.1.2.tgz", - "integrity": "sha1-NUvjMH/9CEM6ePXh4glYRfifx/4=" + "integrity": "sha512-JnkkL4GUpOvvanH9AZPX38CxhiLsXMBicBY2IAtqiVN8YulGDQybUydWA4W6yAMtw6iShtw+8HEF6cfrTHU+UQ==" }, "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { "version": "1.18.3", @@ -173,25 +186,47 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" }, "cldrjs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.5.0.tgz", - "integrity": "sha1-N76S2NGo5myO4S8TA+0xbYXY6zc=" + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.5.5.tgz", + "integrity": "sha512-KDwzwbmLIPfCgd8JERVDpQKrUUM1U4KpFJJg2IROv89rF172lLufoJnqJ/Wea6fXL5bO6WjuLMzY8V52UWPvkA==" }, "cls-bluebird": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", - "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", + "integrity": "sha512-XVb0RPmHQyy35Tz9z34gvtUcBKUK8A/1xkGCyeFc9B0C7Zr5SysgFaswRVdwI5NEMcO+3JKlIDGIOgERSn9NdA==", "requires": { "is-bluebird": "^1.0.2", "shimmer": "^1.1.0" } }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -218,21 +253,19 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" }, "debug": { "version": "2.6.9", @@ -259,9 +292,9 @@ "dev": true }, "dottie": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", - "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, "ee-first": { "version": "1.1.1", @@ -269,9 +302,12 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "requires": { + "jake": "^10.8.5" + } }, "encodeurl": { "version": "1.0.2", @@ -279,9 +315,9 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } @@ -297,17 +333,19 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, "express": { @@ -347,6 +385,37 @@ "vary": "~1.1.2" } }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "finalhandler": { "version": "1.1.1", "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", @@ -377,34 +446,39 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { "pump": "^3.0.0" } }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "globalize": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.4.0.tgz", - "integrity": "sha1-TACnneZ9c5qbf/g7ZrkNAlfCdJM=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.7.0.tgz", + "integrity": "sha512-faR46vTIbFCeAemyuc9E6/d7Wrx9k2ae2L60UhakztFg6VuE42gENVJNuPFtt7Sdjrk9m2w8+py7Jj+JTNy59w==", "requires": { - "cldrjs": "^0.5.0" + "cldrjs": "^0.5.4" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "http-errors": { "version": "1.6.3", "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -417,9 +491,14 @@ } }, "http-status": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.3.1.tgz", - "integrity": "sha512-PcI9NUm6EUOhHlaxYABCqDQQWS7IgoBZ/PmPkhuzj+oR01ffjv3EJfKnnWJZcUhILtUh6/NdJi1Zs/mIr6v8DA==" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.5.3.tgz", + "integrity": "sha512-jCClqdnnwigYslmtfb28vPplOgoiZ0siP2Z8C5Ua+3UKbx410v+c+jT+jh1bbI4TvcEySuX0vd/CfFZFbDkJeQ==" + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" }, "iconv-lite": { "version": "0.4.23", @@ -432,7 +511,7 @@ "inflection": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==" }, "inflight": { "version": "1.0.6", @@ -449,9 +528,9 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", + "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==" }, "ipaddr.js": { "version": "1.8.0", @@ -461,7 +540,7 @@ "is-bluebird": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", - "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" + "integrity": "sha512-PDRu1vVip5dGQg5tfn2qVCCyxbBYu5MhYUJwSfL/RoGBI97n1fxvilVazxzptZW0gcmsMH17H4EVZZI5E/RSeA==" }, "is-buffer": { "version": "1.1.6", @@ -469,35 +548,46 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } }, "js2xmlparser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", - "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", "requires": { - "xmlcreate": "^1.0.1" + "xmlcreate": "^2.0.4" } }, "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", + "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", "requires": { - "invert-kv": "^2.0.0" + "invert-kv": "^3.0.0" } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "make-error": { "version": "1.3.5", @@ -514,13 +604,13 @@ } }, "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" } }, "media-typer": { @@ -529,13 +619,13 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", + "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.0" } }, "merge-descriptors": { @@ -543,6 +633,11 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -567,48 +662,42 @@ } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.7", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.6", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + "minimist": "^1.2.6" } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.23.tgz", - "integrity": "sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w==", + "version": "0.5.37", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.37.tgz", + "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==", "requires": { "moment": ">= 2.9.0" } @@ -623,17 +712,12 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" } }, "on-finished": { @@ -652,30 +736,33 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", + "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "execa": "^4.0.0", + "lcid": "^3.0.0", + "mem": "^5.0.0" } }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==" }, "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "parseurl": { "version": "1.3.2", @@ -688,9 +775,9 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-to-regexp": { "version": "0.1.7", @@ -754,11 +841,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -780,55 +862,51 @@ } }, "sequelize": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.1.0.tgz", - "integrity": "sha512-LmjEAedMTItkIx0mcBfXVmdkkIQOc+1reuv+UpqSADGvQofZ4Sn9ElUBE8egLgCK4oWjy1Ybsju+YDAJpCv1ww==", + "version": "5.22.5", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.22.5.tgz", + "integrity": "sha512-ySIHof18sJbeVG4zjEvsDL490cd9S14/IhkCrZR/g0C/FPlZq1AzEJVeSAo++9/sgJH2eERltAIGqYQNgVqX/A==", "requires": { "bluebird": "^3.5.0", "cls-bluebird": "^2.1.0", "debug": "^4.1.1", - "depd": "^2.0.0", "dottie": "^2.0.0", "inflection": "1.12.0", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "moment": "^2.24.0", "moment-timezone": "^0.5.21", - "retry-as-promised": "^3.1.0", - "semver": "^5.6.0", - "sequelize-pool": "^1.0.2", + "retry-as-promised": "^3.2.0", + "semver": "^6.3.0", + "sequelize-pool": "^2.3.0", "toposort-class": "^1.0.1", - "uuid": "^3.2.1", - "validator": "^10.11.0", - "wkx": "^0.4.6" + "uuid": "^8.3.2", + "validator": "^13.7.0", + "wkx": "^0.4.8" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "sequelize-pool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-1.0.2.tgz", - "integrity": "sha512-VMKl/gCCdIvB1gFZ7p+oqLFEyZEz3oMMYjkKvfEC7GoO9bBcxmfOOU9RdkoltfXGgBZFigSChihRly2gKtsh2w==", - "requires": { - "bluebird": "^3.5.3" - } + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", + "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==" }, "sequelize-typescript": { "version": "1.0.0-alpha.9", @@ -871,17 +949,17 @@ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shimmer": { "version": "1.2.1", @@ -889,9 +967,9 @@ "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "source-map": { "version": "0.6.1", @@ -912,7 +990,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "stable": { "version": "0.1.8", @@ -924,74 +1002,88 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, - "strip-eof": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, "strong-error-handler": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-3.2.0.tgz", - "integrity": "sha512-WBU5itMkVPoEPf1W3ptb0AjtPvRWabDzVO4Lcy8MbJQUbo8vdWngLAcNQptQovdFoMGLgQAgJzZkelm6FRADuQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-3.5.0.tgz", + "integrity": "sha512-PCMOf6RYni7wMD3ytGN/TBIJdKZ/EfgItgE8tVrJNGVAf2X39L7I0r/tlDyn+1G9qfVCZL0mSeutljpkOpBy1Q==", "requires": { "@types/express": "^4.16.0", "accepts": "^1.3.3", - "debug": "^3.1.0", - "ejs": "^2.6.1", + "debug": "^4.1.1", + "ejs": "^3.1.3", + "fast-safe-stringify": "^2.0.6", "http-status": "^1.1.2", - "js2xmlparser": "^3.0.0", - "strong-globalize": "^4.1.0" + "js2xmlparser": "^4.0.0", + "strong-globalize": "^6.0.1" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "strong-globalize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-4.1.2.tgz", - "integrity": "sha512-2ks3/fuQy4B/AQDTAaEvTXYSqH4TWrv9VGlbZ4YujzijEJbIWbptF/9dO13duv87aRhWdM5ABEiTy7ZmnmBhdQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-6.0.5.tgz", + "integrity": "sha512-7nfUli41TieV9/TSc0N62ve5Q4nfrpy/T0nNNy6TyD3vst79QWmeylCyd3q1gDxh8dqGEtabLNCdPQP1Iuvecw==", "requires": { "accept-language": "^3.0.18", - "debug": "^4.0.1", - "globalize": "^1.3.0", - "lodash": "^4.17.4", - "md5": "^2.2.1", - "mkdirp": "^0.5.1", - "os-locale": "^3.0.1", + "debug": "^4.2.0", + "globalize": "^1.6.0", + "lodash": "^4.17.20", + "md5": "^2.3.0", + "mkdirp": "^1.0.4", + "os-locale": "^5.0.0", "yamljs": "^0.3.0" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, "toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" }, "ts-node": { "version": "7.0.1", @@ -1029,14 +1121,14 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" }, "vary": { "version": "1.1.2", @@ -1044,17 +1136,17 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } }, "wkx": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.6.tgz", - "integrity": "sha512-LHxXlzRCYQXA9ZHgs8r7Gafh0gVOE8o3QmudM1PIkOdkXXjW7Thcl+gb2P2dRuKgW8cqkitCRZkkjtmWzpHi7A==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", + "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", "requires": { "@types/node": "*" } @@ -1065,9 +1157,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xmlcreate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", - "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==" }, "yamljs": { "version": "0.3.0", diff --git a/examples/simple/package.json b/examples/simple/package.json index 74edfbeb..3c9b609a 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -17,8 +17,8 @@ "dependencies": { "body-parser": "^1.18.3", "express": "^4.16.4", - "sequelize": "^5.1.0", + "sequelize": "^5.22.5", "sequelize-typescript": "^1.0.0-alpha.9", - "strong-error-handler": "^3.2.0" + "strong-error-handler": "^3.5.0" } } diff --git a/package-lock.json b/package-lock.json index 4034da1d..e33b2db8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,2948 +1,18685 @@ { "name": "sequelize-typescript", - "version": "1.0.0-beta.4", - "lockfileVersion": 1, + "version": "2.1.6", + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "packages": { + "": { + "name": "sequelize-typescript", + "version": "2.1.6", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "glob": "7.2.0" + }, + "devDependencies": { + "@commitlint/cli": "17.2.0", + "@commitlint/config-conventional": "17.2.0", + "@release-it/conventional-changelog": "5.1.1", + "@types/chai": "4.3.4", + "@types/chai-as-promised": "7.1.5", + "@types/chai-datetime": "0.0.37", + "@types/lodash": "4.14.190", + "@types/mocha": "9.1.0", + "@types/node": "18.11.9", + "@types/prettyjson": "0.0.30", + "@types/sinon": "10.0.11", + "@types/sinon-chai": "3.2.9", + "@typescript-eslint/eslint-plugin": "5.44.0", + "@typescript-eslint/parser": "5.42.0", + "chai": "4.3.7", + "chai-as-promised": "7.1.1", + "chai-datetime": "1.8.0", + "codecov": "3.8.3", + "copyfiles": "2.4.1", + "eslint": "8.27.0", + "eslint-config-prettier": "8.5.0", + "eslint-plugin-prettier": "4.2.1", + "has-flag": "5.0.1", + "husky": "8.0.2", + "lodash": "4.17.21", + "markdownlint-cli": "0.32.2", + "mocha": "9.2.2", + "moment": "2.29.4", + "mysql2": "2.3.3", + "nyc": "15.1.0", + "pinst": "3.0.0", + "prettier": "2.8.0", + "prettyjson": "1.2.5", + "reflect-metadata": "0.1.13", + "release-it": "15.5.0", + "sequelize": "6.29.0", + "sinon": "13.0.1", + "sinon-chai": "3.7.0", + "source-map-support": "0.5.21", + "sqlite3": "5.1.2", + "ts-node": "10.9.1", + "typescript": "4.8.4", + "uuid-validate": "0.0.3" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "@types/validator": "*", + "reflect-metadata": "*", + "sequelize": ">=6.20.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.1.tgz", + "integrity": "sha512-Aolwjd7HSC2PyY0fDj/wA/EimQT4HfEnFYNp5s9CQlrdhyvWTtvZ5YzrUPu6R6/1jKiUlxu8bUhkdSnKHNAHMA==", "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.0" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/generator": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.3.tgz", - "integrity": "sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==", + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, - "requires": { - "@babel/types": "^7.3.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "node_modules/@babel/compat-data": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", + "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "node_modules/@babel/core": { + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz", + "integrity": "sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==", "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "dependencies": { + "@ampproject/remapping": "^2.0.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "node_modules/@babel/generator": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz", + "integrity": "sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==", "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.3.tgz", - "integrity": "sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==", - "dev": true - }, - "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.2.2", - "@babel/types": "^7.2.2" + "engines": { + "node": ">=0.10.0" } }, - "@babel/traverse": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", - "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.2.3", - "@babel/types": "^7.2.2", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.10" - }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/types": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz", - "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "@types/bluebird": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.25.tgz", - "integrity": "sha512-yfhIBix+AIFTmYGtkC0Bi+XGjSkOINykqKvO/Wqdz/DuXlAKK7HmhLAXdPIGsV4xzKcL3ev/zYc4yLNo+OvGaw==", - "dev": true - }, - "@types/chai": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-3.4.35.tgz", - "integrity": "sha1-6NZfg0ktKUT4FvxiB0GCHCioyQA=", - "dev": true + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@types/chai-as-promised": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-0.0.29.tgz", - "integrity": "sha1-Q9UokqqZjhhaPePiR37bhXO+HXc=", + "node_modules/@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dev": true, - "requires": { - "@types/chai": "*", - "@types/promises-a-plus": "*" + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "@types/chai-datetime": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/chai-datetime/-/chai-datetime-0.0.30.tgz", - "integrity": "sha1-EhNEEGcsFkO9qlrKIzmw43F68Yg=", + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, - "requires": { - "@types/chai": "*" + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "@types/lodash": { - "version": "4.14.109", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.109.tgz", - "integrity": "sha512-hop8SdPUEzbcJm6aTsmuwjIYQo1tqLseKCM+s2bBqTU2gErwI4fE+aqUVOlscPSQbKHKgtMMPoC+h4AIGOJYvw==", - "dev": true + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@types/mocha": { - "version": "2.2.39", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.39.tgz", - "integrity": "sha1-9o1j24tpw46VWLQHNSXPlsT3qCk=", - "dev": true + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@types/node": { - "version": "11.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.4.tgz", - "integrity": "sha512-+rabAZZ3Yn7tF/XPGHupKIL5EcAbrLxnTr/hgQICxbeuAfWtT0UZSfULE+ndusckBItcv4o6ZeOJplQikVcLvQ==", - "dev": true + "node_modules/@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@types/prettyjson": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@types/prettyjson/-/prettyjson-0.0.28.tgz", - "integrity": "sha1-ExqJDe1kIbG1RfRRCkrqvG1GUnU=", - "dev": true + "node_modules/@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@types/promises-a-plus": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@types/promises-a-plus/-/promises-a-plus-0.0.27.tgz", - "integrity": "sha1-xkZRE0YUyEuPXXEUzokB02pgl4A=", - "dev": true + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@types/sinon": { - "version": "1.16.35", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-1.16.35.tgz", - "integrity": "sha1-7mh8xC0aeUSCVvHAEqM6CEDoXFw=", - "dev": true + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@types/sinon-chai": { - "version": "2.7.27", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-2.7.27.tgz", - "integrity": "sha1-63cpBY3fJTppeeVZuytJEISWmqE=", + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true, - "requires": { - "@types/chai": "*", - "@types/sinon": "*" + "engines": { + "node": ">=6.9.0" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "node_modules/@babel/helpers": { + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", + "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "ajv": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", - "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "node_modules/@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "ansicolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", - "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", - "dev": true + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "engines": { + "node": ">=4" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "sprintf-js": "~1.0.2" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true + "node_modules/@babel/parser": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "node_modules/@babel/traverse": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz", + "integrity": "sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==", "dev": true, - "requires": { - "safer-buffer": "~2.1.0" + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.0", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "node_modules/@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "node_modules/@commitlint/cli": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.2.0.tgz", + "integrity": "sha512-kd1zykcrjIKyDRftWW1E1TJqkgzeosEkv1BiYPCdzkb/g/3BrfgwZUHR1vg+HO3qKUb/0dN+jNXArhGGAHpmaQ==", + "dev": true, + "dependencies": { + "@commitlint/format": "^17.0.0", + "@commitlint/lint": "^17.2.0", + "@commitlint/load": "^17.2.0", + "@commitlint/read": "^17.2.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" + } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "node_modules/@commitlint/config-conventional": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.2.0.tgz", + "integrity": "sha512-g5hQqRa80f++SYS233dbDSg16YdyounMTAhVcmqtInNeY/GF3aA4st9SVtJxpeGrGmueMrU4L+BBb+6Vs5wrcg==", "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "dependencies": { + "conventional-changelog-conventionalcommits": "^5.0.0" }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", + "dev": true, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + "node_modules/@commitlint/config-validator": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.1.0.tgz", + "integrity": "sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.0.0", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, - "requires": { - "tweetnacl": "^0.14.3" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "brace-expansion": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", - "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" + "node_modules/@commitlint/ensure": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz", + "integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.0.0", + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=v14" } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "node_modules/@commitlint/execute-rule": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz", + "integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==", + "dev": true, + "engines": { + "node": ">=v14" + } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "node_modules/@commitlint/format": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz", + "integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.0.0", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "node_modules/@commitlint/is-ignored": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.2.0.tgz", + "integrity": "sha512-rgUPUQraHxoMLxiE8GK430HA7/R2vXyLcOT4fQooNrZq9ERutNrP6dw3gdKLkq22Nede3+gEHQYUzL4Wu75ndg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.0.0", + "semver": "7.3.7" + }, + "engines": { + "node": ">=v14" + } }, - "cardinal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", - "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", + "node_modules/@commitlint/lint": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.2.0.tgz", + "integrity": "sha512-N2oLn4Dj672wKH5qJ4LGO+73UkYXGHO+NTVUusGw83SjEv7GjpqPGKU6KALW2kFQ/GsDefSvOjpSi3CzWHQBDg==", "dev": true, - "requires": { - "ansicolors": "~0.2.1", - "redeyed": "~1.0.0" + "dependencies": { + "@commitlint/is-ignored": "^17.2.0", + "@commitlint/parse": "^17.2.0", + "@commitlint/rules": "^17.2.0", + "@commitlint/types": "^17.0.0" + }, + "engines": { + "node": ">=v14" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "node_modules/@commitlint/load": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.2.0.tgz", + "integrity": "sha512-HDD57qSqNrk399R4TIjw31AWBG8dBjNj1MrDKZKmC/wvimtnIFlqzcu1+sxfXIOHj/+M6tcMWDtvknGUd7SU+g==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.1.0", + "@commitlint/execute-rule": "^17.0.0", + "@commitlint/resolve-extends": "^17.1.0", + "@commitlint/types": "^17.0.0", + "@types/node": "^14.0.0", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load/node_modules/@types/node": { + "version": "14.18.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz", + "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==", "dev": true }, - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "node_modules/@commitlint/message": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.2.0.tgz", + "integrity": "sha512-/4l2KFKxBOuoEn1YAuuNNlAU05Zt7sNsC9H0mPdPm3chOrT4rcX0pOqrQcLtdMrMkJz0gC7b3SF80q2+LtdL9Q==", "dev": true, - "requires": { - "assertion-error": "^1.0.1", - "deep-eql": "^0.1.3", - "type-detect": "^1.0.0" + "engines": { + "node": ">=v14" } }, - "chai-as-promised": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-6.0.0.tgz", - "integrity": "sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY=", + "node_modules/@commitlint/parse": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.2.0.tgz", + "integrity": "sha512-vLzLznK9Y21zQ6F9hf8D6kcIJRb2haAK5T/Vt1uW2CbHYOIfNsR/hJs0XnF/J9ctM20Tfsqv4zBitbYvVw7F6Q==", "dev": true, - "requires": { - "check-error": "^1.0.2" + "dependencies": { + "@commitlint/types": "^17.0.0", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + }, + "engines": { + "node": ">=v14" } }, - "chai-datetime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/chai-datetime/-/chai-datetime-1.4.1.tgz", - "integrity": "sha1-M3n8GNng0A8u1GWZh1JNYhHGQqg=", + "node_modules/@commitlint/read": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.2.0.tgz", + "integrity": "sha512-bbblBhrHkjxra3ptJNm0abxu7yeAaxumQ8ZtD6GIVqzURCETCP7Dm0tlVvGRDyXBuqX6lIJxh3W7oyKqllDsHQ==", "dev": true, - "requires": { - "chai": ">1.9.0" + "dependencies": { + "@commitlint/top-level": "^17.0.0", + "@commitlint/types": "^17.0.0", + "fs-extra": "^10.0.0", + "git-raw-commits": "^2.0.0", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@commitlint/resolve-extends": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.1.0.tgz", + "integrity": "sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==", "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "dependencies": { + "@commitlint/config-validator": "^17.1.0", + "@commitlint/types": "^17.0.0", + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/rules": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.2.0.tgz", + "integrity": "sha512-1YynwD4Eh7HXZNpqG8mtUlL2pSX2jBy61EejYJv4ooZPcg50Ak7LPOyD3a9UZnsE76AXWFBz+yo9Hv4MIpAa0Q==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@commitlint/ensure": "^17.0.0", + "@commitlint/message": "^17.2.0", + "@commitlint/to-lines": "^17.0.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" } }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true + "node_modules/@commitlint/to-lines": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz", + "integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==", + "dev": true, + "engines": { + "node": ">=v14" + } }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true + "node_modules/@commitlint/top-level": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz", + "integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "node_modules/@commitlint/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz", + "integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==", "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "dependencies": { + "chalk": "^4.1.0" }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "cls-bluebird": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", - "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", + "node_modules/@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, - "requires": { - "is-bluebird": "^1.0.2", - "shimmer": "^1.1.0" + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "codecov": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.1.0.tgz", - "integrity": "sha512-aWQc/rtHbcWEQLka6WmBAOpV58J2TwyXqlpAQGhQaSiEUoigTTUk6lLd2vB3kXkhnDyzyH74RXfmV4dq2txmdA==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "requires": { - "argv": "^0.0.2", - "ignore-walk": "^3.0.1", - "js-yaml": "^3.12.0", - "request": "^2.87.0", - "urlgrey": "^0.4.4" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "requires": { - "color-name": "1.1.3" + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "color-name": { + "node_modules/@gar/promisify": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true, + "optional": true }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, - "requires": { - "delayed-stream": "~1.0.0" + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "commander": { - "version": "2.15.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "copyfiles": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.1.0.tgz", - "integrity": "sha512-cAeDE0vL/koE9WSEGxqPpSyvU638Kgfu6wfrnj7kqp9FWa1CWsU54Coo6sdYZP4GstWa39tL/wIVJWfXcujgNA==", + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true, - "requires": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^0.5.1", - "noms": "0.0.0", - "through2": "^2.0.1", - "yargs": "^11.0.0" + "engines": { + "node": ">=6.9.0" } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", "dev": true }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { - "assert-plus": "^1.0.0" + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { - "ms": "2.0.0" + "dependencies": { + "p-locate": "^4.1.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } }, - "deep-eql": { + "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "requires": { - "type-detect": "0.1.1" + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } }, - "denque": { + "node_modules/@npmcli/fs": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.1.1.tgz", - "integrity": "sha1-ECKcK4juwb0V/4LF/eNW5762254=", - "dev": true + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "node_modules/@octokit/auth-token": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.1.tgz", + "integrity": "sha512-/USkK4cioY209wXRpund6HZzHo9GmjakpV9ycOkpMcMxMk7QVcVFVyCMtzvXYiHsB2crgDgrtNYSELYFBXhhaA==", + "dev": true, + "dependencies": { + "@octokit/types": "^7.0.0" + }, + "engines": { + "node": ">= 14" + } }, - "dottie": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", - "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==", - "dev": true + "node_modules/@octokit/core": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.5.tgz", + "integrity": "sha512-4R3HeHTYVHCfzSAi0C6pbGXV8UDI5Rk+k3G7kLVNckswN9mvpOzW9oENfjfH3nEmzg8y3AmKmzs8Sg6pLCeOCA==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^7.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "node_modules/@octokit/endpoint": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.1.tgz", + "integrity": "sha512-/wTXAJwt0HzJ2IeE4kQXO+mBScfzyCkI0hMtkIaqyXd9zg76OpOfNQfHL9FlaxAV2RsNiOXZibVWloy8EexENg==", "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "dependencies": { + "@octokit/types": "^7.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "node_modules/@octokit/graphql": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.1.tgz", + "integrity": "sha512-sxmnewSwAixkP1TrLdE6yRG53eEhHhDTYUykUwdV9x8f91WcbhunIHk9x1PZLALdBZKRPUO2HRcm4kezZ79HoA==", + "dev": true, + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^7.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } }, - "esprima": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", - "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", + "node_modules/@octokit/openapi-types": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.6.0.tgz", + "integrity": "sha512-bxftLwoZ2J6zsU1rzRvk0O32j7lVB0NWWn+P5CDHn9zPzytasR3hdAeXlTngRDkqv1LyEeuy5psVnDkmOSwrcQ==", "dev": true }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "node_modules/@octokit/plugin-paginate-rest": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-4.2.0.tgz", + "integrity": "sha512-8otLCIK9esfmOCY14CBnG/xPqv0paf14rc+s9tHpbOpeFwrv5CnECKW1qdqMAT60ngAa9eB1bKQ+l2YCpi0HPQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^7.2.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "peerDependencies": { + "@octokit/core": ">=3" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.4.0.tgz", + "integrity": "sha512-YP4eUqZ6vORy/eZOTdil1ZSrMt0kv7i/CVw+HhC2C0yJN+IqTc/rot957JQ7JfyeJD6HZOjLg6Jp1o9cPhI9KA==", + "dev": true, + "dependencies": { + "@octokit/types": "^7.2.0", + "deprecation": "^2.3.1" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "node_modules/@octokit/request": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.1.tgz", + "integrity": "sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^7.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "node_modules/@octokit/request-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", + "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^7.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "node_modules/@octokit/rest": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.4.tgz", + "integrity": "sha512-LwG668+6lE8zlSYOfwPj4FxWdv/qFXYBpv79TWIQEpBLKA9D/IMcWsF/U9RGpA3YqMVDiTxpgVpEW3zTFfPFTA==", + "dev": true, + "dependencies": { + "@octokit/core": "^4.0.0", + "@octokit/plugin-paginate-rest": "^4.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/@octokit/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.2.0.tgz", + "integrity": "sha512-pYQ/a1U6mHptwhGyp6SvsiM4bWP2s3V95olUeTxas85D/2kN78yN5C8cGN+P4LwJSWUqIEyvq0Qn2WUn6NQRjw==", "dev": true, - "requires": { - "locate-path": "^2.0.0" + "dependencies": { + "@octokit/openapi-types": "^13.6.0" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.1.tgz", + "integrity": "sha512-gkINruT2KUhZLTaiHxwCOh1O4NVnFT0wLjWFBHmTz9vpKag/C/noIMJXBxFe4F0mYpUVX2puLwAieLYFg2NvoA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/@pnpm/npm-conf": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.4.tgz", + "integrity": "sha512-o5YFq/+ksEJMbSzzkaQDHlp00aonLDU5xNPVTRL12hTWBbVSSeWXxPukq75h+mvXnoOWT95vV2u1HSTw2C4XOw==", "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "dependencies": { + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" } }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "node_modules/@release-it/conventional-changelog": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-5.1.1.tgz", + "integrity": "sha512-QtbDBe36dQfzexAfDYrbLPvd5Cb5bMWmLcjcGhCOWBss7fe1/gCjoxDULVz+7N7G5Nu2UMeBwHcUp/w8RDh5VQ==", "dev": true, - "requires": { - "samsam": "~1.1" + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog": "^3.1.25", + "conventional-recommended-bump": "^6.1.0", + "semver": "7.3.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "release-it": "^15.4.1" } }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "node_modules/@release-it/conventional-changelog/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, - "requires": { - "minipass": "^2.2.1" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "node_modules/@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "dependencies": { + "type-detect": "4.0.8" } }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.0.tgz", + "integrity": "sha512-M8vapsv9qQupMdzrVzkn5rb9jG7aUTEPAZdMtME2PuBaefksFZVE2C1g4LBRTkF/k3nRDNbDc5tp5NFC1PEYxA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true + "node_modules/@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, - "requires": { - "assert-plus": "^1.0.0" + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" } }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" } }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", "dev": true }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "dependencies": { + "@types/chai": "*" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "node_modules/@types/chai-datetime": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/chai-datetime/-/chai-datetime-0.0.37.tgz", + "integrity": "sha512-teAlKuUV2mxuN0hRxfSXnk7v5lDZUtQWMZ72pIvm5OJ8SuMmgjQgNiebha+MYr7EiSVCQxDY8yH1j7TIXy3nEQ==", "dev": true, - "requires": { - "ansi-regex": "^2.0.0" + "dependencies": { + "@types/chai": "*" } }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "node_modules/@types/lodash": { + "version": "4.14.190", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz", + "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw==", "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true }, - "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", + "node_modules/@types/mocha": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", "dev": true }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "node_modules/@types/prettyjson": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/prettyjson/-/prettyjson-0.0.30.tgz", + "integrity": "sha512-BQ15wnnSvzlvDAVvd4t+zXjd9o6QAcfBeEUlZcinDYeb0A1xTfRBc0s8nxHlctojnsxDrbiG7amTqLWbXsiK7Q==", "dev": true }, - "is-bluebird": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", - "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=", + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "node_modules/@types/sinon": { + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz", + "integrity": "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==", "dev": true, - "requires": { - "number-is-nan": "^1.0.0" + "dependencies": { + "@types/sinonjs__fake-timers": "*" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "node_modules/@types/sinon-chai": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.9.tgz", + "integrity": "sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==", + "dev": true, + "dependencies": { + "@types/chai": "*", + "@types/sinon": "*" + } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "node_modules/@types/validator": { + "version": "13.7.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.1.tgz", + "integrity": "sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q==" }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz", + "integrity": "sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.44.0", + "@typescript-eslint/type-utils": "5.44.0", + "@typescript-eslint/utils": "5.44.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz", + "integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", - "dev": true + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", + "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", + "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", "dev": true, - "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" + "dependencies": { + "@typescript-eslint/types": "5.44.0", + "eslint-visitor-keys": "^3.3.0" }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "node_modules/@typescript-eslint/parser": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.42.0.tgz", + "integrity": "sha512-Ixh9qrOTDRctFg3yIwrLkgf33AHyEIn6lhyf5cCfwwiGtkWhNpVKlEZApi3inGQR/barWnY7qY8FbGKBO7p3JA==", "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "@typescript-eslint/scope-manager": "5.42.0", + "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/typescript-estree": "5.42.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.0.tgz", + "integrity": "sha512-l5/3IBHLH0Bv04y+H+zlcLiEMEMjWGaCX6WyHE5Uk2YkSGAMlgdUPsT/ywTSKgu9D1dmmKMYgYZijObfA39Wow==", "dev": true, - "requires": { - "invert-kv": "^1.0.0" + "dependencies": { + "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/visitor-keys": "5.42.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz", + "integrity": "sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==", "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "dependencies": { + "@typescript-eslint/typescript-estree": "5.44.0", + "@typescript-eslint/utils": "5.44.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", - "dev": true - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "dev": true + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", + "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz", + "integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==", "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "dependencies": { + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", + "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.44.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "requires": { - "mimic-fn": "^1.0.0" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true + "node_modules/@typescript-eslint/types": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.0.tgz", + "integrity": "sha512-t4lzO9ZOAUcHY6bXQYRuu+3SSYdD9TS8ooApZft4WARt4/f2Cj/YpvbTe8A4GuhT4bNW72goDMOy7SW71mZwGw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.0.tgz", + "integrity": "sha512-2O3vSq794x3kZGtV7i4SCWZWCwjEtkWfVqX4m5fbUBomOsEOyd6OAD1qU2lbvV5S8tgy/luJnOYluNyYVeOTTg==", "dev": true, - "requires": { - "mime-db": "~1.37.0" + "dependencies": { + "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/visitor-keys": "5.42.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" + "node_modules/@typescript-eslint/utils": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.44.0.tgz", + "integrity": "sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.44.0", + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/typescript-estree": "5.44.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz", + "integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", + "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz", + "integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==", + "dev": true, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } } }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", + "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", "dev": true, - "requires": { - "minipass": "^2.2.1" + "dependencies": { + "@typescript-eslint/types": "5.44.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "node_modules/@typescript-eslint/utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "requires": { - "minimist": "0.0.8" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.0.tgz", + "integrity": "sha512-QHbu5Hf/2lOEOwy+IUw0GoSCuAzByTAWWrOTKzTzsotiUnWFpuKnXcAhC9YztAf2EElQ0VvIK+pHJUPkM0q7jg==", "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@typescript-eslint/types": "5.42.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "moment": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", - "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==", + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, - "moment-timezone": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", - "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, - "requires": { - "moment": ">= 2.9.0" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", "dev": true }, - "mysql2": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.3.5.tgz", - "integrity": "sha1-rmoJkiij3Ln5RUZ2B2/pOT1wrv4=", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, - "requires": { - "cardinal": "1.0.0", - "denque": "^1.1.1", - "generate-function": "^2.0.0", - "iconv-lite": "^0.4.18", - "long": "^3.2.0", - "lru-cache": "^4.1.1", - "named-placeholders": "1.1.1", - "object-assign": "^4.1.1", - "readable-stream": "2.2.11", - "safe-buffer": "^5.0.1", - "seq-queue": "0.0.5", - "sqlstring": "^2.2.0" + "dependencies": { + "debug": "4" }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "optional": true, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "integrity": "sha512-h+8+r3MKEhkiVrwdKL8aWs1oc1VvBu33ueshOvS26RsZQ3Amhx/oO3TKe4lApSV9ueY6as8EAh7mtuFjdlhg9Q==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.0.1", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true - } - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" } }, - "named-placeholders": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.1.tgz", - "integrity": "sha1-O3oNJiA910s6nfTJz7gnsvuQfmQ=", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "requires": { - "lru-cache": "2.5.0" + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { - "lru-cache": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=", - "dev": true - } + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "nan": { - "version": "2.10.0", - "resolved": "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } }, - "needle": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "engines": { + "node": ">=6" } }, - "node-pre-gyp": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", - "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", + "node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "npm-bundled": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", - "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, - "npm-packlist": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.12.tgz", - "integrity": "sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g==", + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "requires": { - "path-key": "^2.0.0" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "node_modules/argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "engines": { + "node": ">=0.6.10" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, - "nyc": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", - "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^3.0.1", - "convert-source-map": "^1.6.0", - "find-cache-dir": "^2.0.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.1", - "make-dir": "^1.3.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.1.0", - "uuid": "^3.3.2", - "yargs": "^12.0.5", - "yargs-parser": "^11.1.1" + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz", + "integrity": "sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "async": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "caching-transform": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^1.3.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.3.0" - } + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "camelcase": { - "version": "5.0.0", - "bundled": true, - "dev": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "cliui": { + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", + "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", + "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.16.0.tgz", + "integrity": "sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.1.tgz", + "integrity": "sha512-3tLJyBjGuXw1s5gpKFSG3iS4kaKT4id04dZi98wzHQp/8cqZNweBnrF9J+rrlvrf4M53OdtDGNctNHFias8BEA==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.0", + "keyv": "^4.5.0", + "mimic-response": "^4.0.0", + "normalize-url": "^7.1.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001311", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001311.tgz", + "integrity": "sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chai-datetime": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/chai-datetime/-/chai-datetime-1.8.0.tgz", + "integrity": "sha512-qBG84K8oQNz8LWacuzmCBfdoeG2UBFfbGKTSQj6lS+sjuzGUdBvjJxfZfGA4zDAMiCSqApKcuqSLO0lQQ25cHw==", + "dev": true, + "dependencies": { + "chai": ">1.9.0" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", + "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/codecov": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", + "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", + "deprecated": "https://about.codecov.io/blog/codecov-uploader-deprecation-plan/", + "dev": true, + "dependencies": { + "argv": "0.0.2", + "ignore-walk": "3.0.4", + "js-yaml": "3.14.1", + "teeny-request": "7.1.1", + "urlgrey": "1.0.0" + }, + "bin": { + "codecov": "bin/codecov" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dev": true, + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/configstore/node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/conventional-changelog": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "dev": true, + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/copyfiles/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/copyfiles/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/copyfiles/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/copyfiles/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/copyfiles/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/copyfiles/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.2.0.tgz", + "integrity": "sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=3" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", + "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dottie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.68", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.68.tgz", + "integrity": "sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "optional": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", + "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "dev": true, + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fast-url-parser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.3.tgz", + "integrity": "sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dev": true, + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/get-uri/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "dependencies": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dev": true, + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "dev": true, + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.1.tgz", + "integrity": "sha512-sD16AK8cCyUoPtKr/NMvLTFFa+T3i3S+zoiuvhq0HP2YiqBZA9AtlBjAdsQBsLBK7slPuvmfE0OxhGi7N5dD4w==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", + "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", + "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.2.tgz", + "integrity": "sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true, + "optional": true + }, + "node_modules/inflection": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.2.tgz", + "integrity": "sha512-cmZlljCRTBFouT8UzMzrGcVEvkv6D/wBdcdKG7J1QH5cXjtU75Dm+P27v9EKu/Y43UYyCJd1WC4zLebRrC8NBw==", + "dev": true, + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inquirer": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.2.tgz", + "integrity": "sha512-Hj2Ml1WpxKJU2npP2Rj0OURGkHV+GtNW2CwFdHDiXlqUBAUrWTcZHxCkFywX/XHzOS7wrG/kExgJFbUkVgyHzg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^5.0.0", + "chalk": "^5.0.1", + "cli-cursor": "^4.0.0", + "cli-width": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^6.1.2", + "run-async": "^2.4.0", + "rxjs": "^7.5.6", + "string-width": "^5.1.2", + "strip-ansi": "^7.0.1", + "through": "^2.3.6", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "optional": true + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dev": true, + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.0.tgz", + "integrity": "sha512-HneQBCrXGBy15QnaDfcn6OLoU8AQPAa0Qn0IeJR/QCo4E8dNZaGGwxpCwWyEBQC5QvFonP8d6t60iGpAHVAfNA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/macos-release": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz", + "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/markdownlint": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.26.2.tgz", + "integrity": "sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==", + "dev": true, + "dependencies": { + "markdown-it": "13.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/markdownlint-cli": { + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.32.2.tgz", + "integrity": "sha512-xmJT1rGueUgT4yGNwk6D0oqQr90UJ7nMyakXtqjgswAkEhYYqjHew9RY8wDbOmh2R270IWjuKSeZzHDEGPAUkQ==", + "dev": true, + "dependencies": { + "commander": "~9.4.0", + "get-stdin": "~9.0.0", + "glob": "~8.0.3", + "ignore": "~5.2.0", + "js-yaml": "^4.1.0", + "jsonc-parser": "~3.1.0", + "markdownlint": "~0.26.2", + "markdownlint-rule-helpers": "~0.17.2", + "minimatch": "~5.1.0", + "run-con": "~1.2.11" + }, + "bin": { + "markdownlint": "markdownlint.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/markdownlint-cli/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/markdownlint-cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/markdownlint-cli/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/markdownlint-cli/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/markdownlint-cli/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdownlint-rule-helpers": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.17.2.tgz", + "integrity": "sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/meow/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.37", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.37.tgz", + "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==", + "dev": true, + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/mysql2": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", + "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "dev": true, + "dependencies": { + "denque": "^2.0.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "dev": true, + "dependencies": { + "lru-cache": "^4.1.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/named-placeholders/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/new-github-release-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "dev": true, + "dependencies": { + "type-fest": "^2.5.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.16.0.tgz", + "integrity": "sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", + "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", + "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "dev": true, + "dependencies": { + "bl": "^5.0.0", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/os-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz", + "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==", + "dev": true, + "dependencies": { + "macos-release": "^3.0.1", + "windows-release": "^5.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dev": true, + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", + "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "dev": true, + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dev": true, + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dev": true, + "dependencies": { + "parse-path": "^7.0.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinst": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pinst/-/pinst-3.0.0.tgz", + "integrity": "sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "pinst": "bin.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", + "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prettyjson": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.5.tgz", + "integrity": "sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==", + "dev": true, + "dependencies": { + "colors": "1.4.0", + "minimist": "^1.2.0" + }, + "bin": { + "prettyjson": "bin/prettyjson" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/promise.allsettled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.5.tgz", + "integrity": "sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==", + "dev": true, + "dependencies": { + "array.prototype.map": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "iterate-value": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true + }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-agent/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dev": true, + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", + "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^1.0.4" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.5.0.tgz", + "integrity": "sha512-/pQo/PwEXAWRBgVGLE+3IQ3hUoeiDZMGAo/Egin1envCyLyjzrU7+0P2w4iZ1Xv5OxhC2AcaPaN5eY1ql47cBA==", + "dev": true, + "dependencies": { + "@iarna/toml": "2.2.5", + "@octokit/rest": "19.0.4", + "async-retry": "1.3.3", + "chalk": "5.0.1", + "cosmiconfig": "7.0.1", + "execa": "6.1.0", + "form-data": "4.0.0", + "git-url-parse": "13.1.0", + "globby": "13.1.2", + "got": "12.5.1", + "inquirer": "9.1.2", + "is-ci": "3.0.1", + "lodash": "4.17.21", + "mime-types": "2.1.35", + "new-github-release-url": "2.0.0", + "node-fetch": "3.2.10", + "open": "8.4.0", + "ora": "6.1.2", + "os-name": "5.0.1", + "promise.allsettled": "1.0.5", + "proxy-agent": "5.0.0", + "semver": "7.3.7", + "shelljs": "0.8.5", + "update-notifier": "6.0.2", + "url-join": "5.0.0", + "wildcard-match": "5.1.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "release-it": "bin/release-it.js" + }, + "engines": { + "node": ">=14.9" + } + }, + "node_modules/release-it/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/release-it/node_modules/data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/release-it/node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/release-it/node_modules/globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/release-it/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/node-fetch": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", + "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/release-it/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==", + "dev": true + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-con": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.11.tgz", + "integrity": "sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~3.0.0", + "minimist": "^1.2.6", + "strip-json-comments": "~3.1.1" + }, + "bin": { + "run-con": "cli.js" + } + }, + "node_modules/run-con/node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=", + "dev": true + }, + "node_modules/sequelize": { + "version": "6.29.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.29.0.tgz", + "integrity": "sha512-m8Wi90rs3NZP9coXE52c7PL4Q078nwYZXqt1IxPvgki7nOFn0p/F0eKsYDBXCPw9G8/BCEa6zZNk0DQUAT4ypA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "dependencies": { + "@types/debug": "^4.1.7", + "@types/validator": "^13.7.1", + "debug": "^4.3.3", + "dottie": "^2.0.2", + "inflection": "^1.13.2", + "lodash": "^4.17.21", + "moment": "^2.29.1", + "moment-timezone": "^0.5.35", + "pg-connection-string": "^2.5.0", + "retry-as-promised": "^7.0.3", + "semver": "^7.3.5", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.7.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sinon": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz", + "integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.0.0", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "dev": true, + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sqlite3": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.2.tgz", + "integrity": "sha512-D0Reg6pRWAFXFUnZKsszCI67tthFD8fGPewRddDCX6w4cYwz3MbvuwRICbL+YQjBAh9zbw+lJ/V9oC8nG5j6eg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^4.2.0", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/sqlstring": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", + "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dev": true, + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "dev": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/teeny-request": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz", + "integrity": "sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/teeny-request/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=", + "dev": true + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "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" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.1.tgz", + "integrity": "sha512-FAGKF12fWdkpvNJZENacOH0e/83eG6JyVQyanIJaBXCN1J11TUQv1T1/z8S+Z0CG0ZPk1nPcreF/c7lrTd0TEQ==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dev": true, + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/urlgrey": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", + "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==", + "dev": true, + "dependencies": { + "fast-url-parser": "^1.1.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/uuid-validate": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uuid-validate/-/uuid-validate-0.0.3.tgz", + "integrity": "sha512-Fykw5U4eZESbq739BeLvEBFRuJODfrlmjx5eJux7W817LjRaq4b7/i4t2zxQmhcX+fAj4nMfRdTzO4tmwLKn0w==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vm2": { + "version": "3.9.15", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.15.tgz", + "integrity": "sha512-XqNqknHGw2avJo13gbIwLNZUumvrSHc9mLqoadFZTpo3KaNEJoe1I0lqTFhRXmXD7WkLyG01aaraXdXT0pa4ag==", + "dev": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wildcard-match": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz", + "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", + "dev": true + }, + "node_modules/windows-release": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz", + "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==", + "dev": true, + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.1.tgz", + "integrity": "sha512-Aolwjd7HSC2PyY0fDj/wA/EimQT4HfEnFYNp5s9CQlrdhyvWTtvZ5YzrUPu6R6/1jKiUlxu8bUhkdSnKHNAHMA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", + "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "dev": true + }, + "@babel/core": { + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz", + "integrity": "sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.0.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz", + "integrity": "sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/helpers": { + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", + "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" + } + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz", + "integrity": "sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.0", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@commitlint/cli": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.2.0.tgz", + "integrity": "sha512-kd1zykcrjIKyDRftWW1E1TJqkgzeosEkv1BiYPCdzkb/g/3BrfgwZUHR1vg+HO3qKUb/0dN+jNXArhGGAHpmaQ==", + "dev": true, + "requires": { + "@commitlint/format": "^17.0.0", + "@commitlint/lint": "^17.2.0", + "@commitlint/load": "^17.2.0", + "@commitlint/read": "^17.2.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + } + }, + "@commitlint/config-conventional": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.2.0.tgz", + "integrity": "sha512-g5hQqRa80f++SYS233dbDSg16YdyounMTAhVcmqtInNeY/GF3aA4st9SVtJxpeGrGmueMrU4L+BBb+6Vs5wrcg==", + "dev": true, + "requires": { + "conventional-changelog-conventionalcommits": "^5.0.0" + }, + "dependencies": { + "conventional-changelog-conventionalcommits": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + } + } + }, + "@commitlint/config-validator": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.1.0.tgz", + "integrity": "sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "ajv": "^8.11.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "@commitlint/ensure": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz", + "integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "lodash": "^4.17.19" + } + }, + "@commitlint/execute-rule": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz", + "integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==", + "dev": true + }, + "@commitlint/format": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz", + "integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "chalk": "^4.1.0" + } + }, + "@commitlint/is-ignored": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.2.0.tgz", + "integrity": "sha512-rgUPUQraHxoMLxiE8GK430HA7/R2vXyLcOT4fQooNrZq9ERutNrP6dw3gdKLkq22Nede3+gEHQYUzL4Wu75ndg==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "semver": "7.3.7" + } + }, + "@commitlint/lint": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.2.0.tgz", + "integrity": "sha512-N2oLn4Dj672wKH5qJ4LGO+73UkYXGHO+NTVUusGw83SjEv7GjpqPGKU6KALW2kFQ/GsDefSvOjpSi3CzWHQBDg==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^17.2.0", + "@commitlint/parse": "^17.2.0", + "@commitlint/rules": "^17.2.0", + "@commitlint/types": "^17.0.0" + } + }, + "@commitlint/load": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.2.0.tgz", + "integrity": "sha512-HDD57qSqNrk399R4TIjw31AWBG8dBjNj1MrDKZKmC/wvimtnIFlqzcu1+sxfXIOHj/+M6tcMWDtvknGUd7SU+g==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^17.1.0", + "@commitlint/execute-rule": "^17.0.0", + "@commitlint/resolve-extends": "^17.1.0", + "@commitlint/types": "^17.0.0", + "@types/node": "^14.0.0", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4" + }, + "dependencies": { + "@types/node": { + "version": "14.18.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz", + "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==", + "dev": true + } + } + }, + "@commitlint/message": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.2.0.tgz", + "integrity": "sha512-/4l2KFKxBOuoEn1YAuuNNlAU05Zt7sNsC9H0mPdPm3chOrT4rcX0pOqrQcLtdMrMkJz0gC7b3SF80q2+LtdL9Q==", + "dev": true + }, + "@commitlint/parse": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.2.0.tgz", + "integrity": "sha512-vLzLznK9Y21zQ6F9hf8D6kcIJRb2haAK5T/Vt1uW2CbHYOIfNsR/hJs0XnF/J9ctM20Tfsqv4zBitbYvVw7F6Q==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + } + }, + "@commitlint/read": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.2.0.tgz", + "integrity": "sha512-bbblBhrHkjxra3ptJNm0abxu7yeAaxumQ8ZtD6GIVqzURCETCP7Dm0tlVvGRDyXBuqX6lIJxh3W7oyKqllDsHQ==", + "dev": true, + "requires": { + "@commitlint/top-level": "^17.0.0", + "@commitlint/types": "^17.0.0", + "fs-extra": "^10.0.0", + "git-raw-commits": "^2.0.0", + "minimist": "^1.2.6" + } + }, + "@commitlint/resolve-extends": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.1.0.tgz", + "integrity": "sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^17.1.0", + "@commitlint/types": "^17.0.0", + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + } + }, + "@commitlint/rules": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.2.0.tgz", + "integrity": "sha512-1YynwD4Eh7HXZNpqG8mtUlL2pSX2jBy61EejYJv4ooZPcg50Ak7LPOyD3a9UZnsE76AXWFBz+yo9Hv4MIpAa0Q==", + "dev": true, + "requires": { + "@commitlint/ensure": "^17.0.0", + "@commitlint/message": "^17.2.0", + "@commitlint/to-lines": "^17.0.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0" + } + }, + "@commitlint/to-lines": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz", + "integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==", + "dev": true + }, + "@commitlint/top-level": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz", + "integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "@commitlint/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz", + "integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true, + "optional": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true + }, + "@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "optional": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@octokit/auth-token": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.1.tgz", + "integrity": "sha512-/USkK4cioY209wXRpund6HZzHo9GmjakpV9ycOkpMcMxMk7QVcVFVyCMtzvXYiHsB2crgDgrtNYSELYFBXhhaA==", + "dev": true, + "requires": { + "@octokit/types": "^7.0.0" + } + }, + "@octokit/core": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.5.tgz", + "integrity": "sha512-4R3HeHTYVHCfzSAi0C6pbGXV8UDI5Rk+k3G7kLVNckswN9mvpOzW9oENfjfH3nEmzg8y3AmKmzs8Sg6pLCeOCA==", + "dev": true, + "requires": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^7.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.1.tgz", + "integrity": "sha512-/wTXAJwt0HzJ2IeE4kQXO+mBScfzyCkI0hMtkIaqyXd9zg76OpOfNQfHL9FlaxAV2RsNiOXZibVWloy8EexENg==", + "dev": true, + "requires": { + "@octokit/types": "^7.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.1.tgz", + "integrity": "sha512-sxmnewSwAixkP1TrLdE6yRG53eEhHhDTYUykUwdV9x8f91WcbhunIHk9x1PZLALdBZKRPUO2HRcm4kezZ79HoA==", + "dev": true, + "requires": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^7.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.6.0.tgz", + "integrity": "sha512-bxftLwoZ2J6zsU1rzRvk0O32j7lVB0NWWn+P5CDHn9zPzytasR3hdAeXlTngRDkqv1LyEeuy5psVnDkmOSwrcQ==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-4.2.0.tgz", + "integrity": "sha512-8otLCIK9esfmOCY14CBnG/xPqv0paf14rc+s9tHpbOpeFwrv5CnECKW1qdqMAT60ngAa9eB1bKQ+l2YCpi0HPQ==", + "dev": true, + "requires": { + "@octokit/types": "^7.2.0" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.4.0.tgz", + "integrity": "sha512-YP4eUqZ6vORy/eZOTdil1ZSrMt0kv7i/CVw+HhC2C0yJN+IqTc/rot957JQ7JfyeJD6HZOjLg6Jp1o9cPhI9KA==", + "dev": true, + "requires": { + "@octokit/types": "^7.2.0", + "deprecation": "^2.3.1" + } + }, + "@octokit/request": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.1.tgz", + "integrity": "sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==", + "dev": true, + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^7.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", + "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", + "dev": true, + "requires": { + "@octokit/types": "^7.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.4.tgz", + "integrity": "sha512-LwG668+6lE8zlSYOfwPj4FxWdv/qFXYBpv79TWIQEpBLKA9D/IMcWsF/U9RGpA3YqMVDiTxpgVpEW3zTFfPFTA==", + "dev": true, + "requires": { + "@octokit/core": "^4.0.0", + "@octokit/plugin-paginate-rest": "^4.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + } + }, + "@octokit/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.2.0.tgz", + "integrity": "sha512-pYQ/a1U6mHptwhGyp6SvsiM4bWP2s3V95olUeTxas85D/2kN78yN5C8cGN+P4LwJSWUqIEyvq0Qn2WUn6NQRjw==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^13.6.0" + } + }, + "@pnpm/network.ca-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.1.tgz", + "integrity": "sha512-gkINruT2KUhZLTaiHxwCOh1O4NVnFT0wLjWFBHmTz9vpKag/C/noIMJXBxFe4F0mYpUVX2puLwAieLYFg2NvoA==", + "dev": true, + "requires": { + "graceful-fs": "4.2.10" + } + }, + "@pnpm/npm-conf": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.4.tgz", + "integrity": "sha512-o5YFq/+ksEJMbSzzkaQDHlp00aonLDU5xNPVTRL12hTWBbVSSeWXxPukq75h+mvXnoOWT95vV2u1HSTw2C4XOw==", + "dev": true, + "requires": { + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + } + }, + "@release-it/conventional-changelog": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-5.1.1.tgz", + "integrity": "sha512-QtbDBe36dQfzexAfDYrbLPvd5Cb5bMWmLcjcGhCOWBss7fe1/gCjoxDULVz+7N7G5Nu2UMeBwHcUp/w8RDh5VQ==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog": "^3.1.25", + "conventional-recommended-bump": "^6.1.0", + "semver": "7.3.8" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.0.tgz", + "integrity": "sha512-M8vapsv9qQupMdzrVzkn5rb9jG7aUTEPAZdMtME2PuBaefksFZVE2C1g4LBRTkF/k3nRDNbDc5tp5NFC1PEYxA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.1" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/chai-datetime": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/chai-datetime/-/chai-datetime-0.0.37.tgz", + "integrity": "sha512-teAlKuUV2mxuN0hRxfSXnk7v5lDZUtQWMZ72pIvm5OJ8SuMmgjQgNiebha+MYr7EiSVCQxDY8yH1j7TIXy3nEQ==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.190", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz", + "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/mocha": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", + "dev": true + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prettyjson": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/prettyjson/-/prettyjson-0.0.30.tgz", + "integrity": "sha512-BQ15wnnSvzlvDAVvd4t+zXjd9o6QAcfBeEUlZcinDYeb0A1xTfRBc0s8nxHlctojnsxDrbiG7amTqLWbXsiK7Q==", + "dev": true + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/sinon": { + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz", + "integrity": "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==", + "dev": true, + "requires": { + "@types/sinonjs__fake-timers": "*" + } + }, + "@types/sinon-chai": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.9.tgz", + "integrity": "sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==", + "dev": true, + "requires": { + "@types/chai": "*", + "@types/sinon": "*" + } + }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "@types/validator": { + "version": "13.7.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.1.tgz", + "integrity": "sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz", + "integrity": "sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.44.0", + "@typescript-eslint/type-utils": "5.44.0", + "@typescript-eslint/utils": "5.44.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz", + "integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0" + } + }, + "@typescript-eslint/types": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", + "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", + "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.44.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.42.0.tgz", + "integrity": "sha512-Ixh9qrOTDRctFg3yIwrLkgf33AHyEIn6lhyf5cCfwwiGtkWhNpVKlEZApi3inGQR/barWnY7qY8FbGKBO7p3JA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.42.0", + "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/typescript-estree": "5.42.0", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.0.tgz", + "integrity": "sha512-l5/3IBHLH0Bv04y+H+zlcLiEMEMjWGaCX6WyHE5Uk2YkSGAMlgdUPsT/ywTSKgu9D1dmmKMYgYZijObfA39Wow==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/visitor-keys": "5.42.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz", + "integrity": "sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.44.0", + "@typescript-eslint/utils": "5.44.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", + "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz", + "integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", + "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.44.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/types": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.0.tgz", + "integrity": "sha512-t4lzO9ZOAUcHY6bXQYRuu+3SSYdD9TS8ooApZft4WARt4/f2Cj/YpvbTe8A4GuhT4bNW72goDMOy7SW71mZwGw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.0.tgz", + "integrity": "sha512-2O3vSq794x3kZGtV7i4SCWZWCwjEtkWfVqX4m5fbUBomOsEOyd6OAD1qU2lbvV5S8tgy/luJnOYluNyYVeOTTg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/visitor-keys": "5.42.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.44.0.tgz", + "integrity": "sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.44.0", + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/typescript-estree": "5.44.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz", + "integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0" + } + }, + "@typescript-eslint/types": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", + "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz", + "integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", + "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.44.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.0.tgz", + "integrity": "sha512-QHbu5Hf/2lOEOwy+IUw0GoSCuAzByTAWWrOTKzTzsotiUnWFpuKnXcAhC9YztAf2EElQ0VvIK+pHJUPkM0q7jg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.42.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "requires": { + "string-width": "^4.1.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "requires": { + "type-fest": "^1.0.2" + }, + "dependencies": { + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz", + "integrity": "sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, + "async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "requires": { + "retry": "0.13.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", + "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", + "dev": true, + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "dev": true, + "requires": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true + }, + "camelcase": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", + "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", + "dev": true + }, + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "type-fest": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.16.0.tgz", + "integrity": "sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==", + "dev": true + }, + "wrap-ansi": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "optional": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "optional": true, + "requires": { + "aggregate-error": "^3.0.0" + } + } + } + }, + "cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true + }, + "cacheable-request": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.1.tgz", + "integrity": "sha512-3tLJyBjGuXw1s5gpKFSG3iS4kaKT4id04dZi98wzHQp/8cqZNweBnrF9J+rrlvrf4M53OdtDGNctNHFias8BEA==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.0", + "keyv": "^4.5.0", + "mimic-response": "^4.0.0", + "normalize-url": "^7.1.0", + "responselike": "^3.0.0" + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001311", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001311.tgz", + "integrity": "sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==", + "dev": true + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chai-datetime": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/chai-datetime/-/chai-datetime-1.8.0.tgz", + "integrity": "sha512-qBG84K8oQNz8LWacuzmCBfdoeG2UBFfbGKTSQj6lS+sjuzGUdBvjJxfZfGA4zDAMiCSqApKcuqSLO0lQQ25cHw==", + "dev": true, + "requires": { + "chai": ">1.9.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true + }, + "cli-width": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", + "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, + "codecov": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", + "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", + "dev": true, + "requires": { + "argv": "0.0.2", + "ignore-walk": "3.0.4", + "js-yaml": "3.14.1", + "teeny-request": "7.1.1", + "urlgrey": "1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dev": true, + "requires": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "dependencies": { + "dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "conventional-changelog": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + } + }, + "conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "dev": true, + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + } + }, + "conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "requires": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "requires": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "requires": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cosmiconfig-typescript-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.2.0.tgz", + "integrity": "sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g==", + "dev": true, + "requires": {} + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "requires": { + "type-fest": "^1.0.1" + }, + "dependencies": { + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + } + } + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, + "deep-eql": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", + "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dev": true, + "requires": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "optional": true + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dottie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==", + "dev": true + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.68", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.68.tgz", + "integrity": "sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "optional": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "optional": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", + "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "js-yaml": { "version": "4.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "dev": true, + "requires": { + "punycode": "^1.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, + "figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "requires": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + }, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true + } + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "form-data-encoder": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.3.tgz", + "integrity": "sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==", + "dev": true + }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "requires": { + "fetch-blob": "^3.1.2" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dev": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "requires": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "requires": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dev": true, + "requires": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "dev": true, + "requires": { + "git-up": "^7.0.0" + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "got": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.1.tgz", + "integrity": "sha512-sD16AK8cCyUoPtKr/NMvLTFFa+T3i3S+zoiuvhq0HP2YiqBZA9AtlBjAdsQBsLBK7slPuvmfE0OxhGi7N5dD4w==", + "dev": true, + "requires": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", + "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "dev": true + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + } + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http2-wrapper": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", + "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "dependencies": { + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + } + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.0.0" + } + }, + "husky": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.2.tgz", + "integrity": "sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true, + "optional": true + }, + "inflection": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.2.tgz", + "integrity": "sha512-cmZlljCRTBFouT8UzMzrGcVEvkv6D/wBdcdKG7J1QH5cXjtU75Dm+P27v9EKu/Y43UYyCJd1WC4zLebRrC8NBw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "inquirer": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.2.tgz", + "integrity": "sha512-Hj2Ml1WpxKJU2npP2Rj0OURGkHV+GtNW2CwFdHDiXlqUBAUrWTcZHxCkFywX/XHzOS7wrG/kExgJFbUkVgyHzg==", + "dev": true, + "requires": { + "ansi-escapes": "^5.0.0", + "chalk": "^5.0.1", + "cli-cursor": "^4.0.0", + "cli-width": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^6.1.2", + "run-async": "^2.4.0", + "rxjs": "^7.5.6", + "string-width": "^5.1.2", + "strip-ansi": "^7.0.1", + "through": "^2.3.6", + "wrap-ansi": "^8.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "chalk": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "dependencies": { + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + } + } + }, + "is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "optional": true + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dev": true, + "requires": { + "protocols": "^2.0.1" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.0.tgz", + "integrity": "sha512-HneQBCrXGBy15QnaDfcn6OLoU8AQPAa0Qn0IeJR/QCo4E8dNZaGGwxpCwWyEBQC5QvFonP8d6t60iGpAHVAfNA==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "keyv": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, + "requires": { + "package-json": "^8.1.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "commander": { - "version": "2.17.1", - "bundled": true, - "dev": true, - "optional": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "macos-release": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz", + "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "optional": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + } + } + }, + "markdownlint": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.26.2.tgz", + "integrity": "sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==", + "dev": true, + "requires": { + "markdown-it": "13.0.1" + } + }, + "markdownlint-cli": { + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.32.2.tgz", + "integrity": "sha512-xmJT1rGueUgT4yGNwk6D0oqQr90UJ7nMyakXtqjgswAkEhYYqjHew9RY8wDbOmh2R270IWjuKSeZzHDEGPAUkQ==", + "dev": true, + "requires": { + "commander": "~9.4.0", + "get-stdin": "~9.0.0", + "glob": "~8.0.3", + "ignore": "~5.2.0", + "js-yaml": "^4.1.0", + "jsonc-parser": "~3.1.0", + "markdownlint": "~0.26.2", + "markdownlint-rule-helpers": "~0.17.2", + "minimatch": "~5.1.0", + "run-con": "~1.2.11" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "convert-source-map": { - "version": "1.6.0", - "bundled": true, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "balanced-match": "^1.0.0" } }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" } }, - "debug": { - "version": "4.1.1", - "bundled": true, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "ms": "^2.1.1" + "argparse": "^2.0.1" } }, - "decamelize": { - "version": "1.2.0", - "bundled": true, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "markdownlint-rule-helpers": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.17.2.tgz", + "integrity": "sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "bundled": true, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "strip-bom": "^3.0.0" + "p-locate": "^4.1.0" } }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "once": "^1.4.0" + "p-try": "^2.0.0" } }, - "error-ex": { - "version": "1.3.2", - "bundled": true, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "p-limit": "^2.2.0" } }, - "es6-error": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "execa": { - "version": "1.0.0", - "bundled": true, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "bundled": true, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true } } }, - "find-cache-dir": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "bundled": true, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "optional": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "get-caller-file": { - "version": "1.0.3", - "bundled": true, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "get-stream": { + "js-yaml": { "version": "4.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "pump": "^3.0.0" + "argparse": "^2.0.1" } }, - "glob": { - "version": "7.1.3", - "bundled": true, + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "brace-expansion": "^1.1.7" } }, - "graceful-fs": { - "version": "4.1.15", - "bundled": true, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "handlebars": { - "version": "4.1.0", - "bundled": true, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } + "has-flag": "^4.0.0" } }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "hasha": { - "version": "3.0.0", - "bundled": true, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "is-stream": "^1.0.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true + }, + "moment-timezone": { + "version": "0.5.37", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.37.tgz", + "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==", + "dev": true, + "requires": { + "moment": ">= 2.9.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mysql2": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", + "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "dev": true, + "requires": { + "denque": "^2.0.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + } + }, + "named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "dev": true, + "requires": { + "lru-cache": "^4.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "bundled": true, + } + } + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "optional": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true + }, + "new-github-release-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "dev": true, + "requires": { + "type-fest": "^2.5.1" + }, + "dependencies": { + "type-fest": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.16.0.tgz", + "integrity": "sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==", "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.4", - "bundled": true, + } + } + }, + "nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true + }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "optional": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", "dev": true, + "optional": true, "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" } }, - "istanbul-lib-source-maps": { - "version": "3.0.2", - "bundled": true, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, + "optional": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" } }, - "istanbul-reports": { - "version": "2.1.1", - "bundled": true, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "optional": true, "requires": { - "handlebars": "^4.1.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "lcid": { - "version": "2.0.0", - "bundled": true, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "optional": true, "requires": { - "invert-kv": "^2.0.0" + "brace-expansion": "^1.1.7" } }, - "load-json-file": { - "version": "4.0.0", - "bundled": true, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, + "optional": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, + } + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "lodash": { - "version": "4.17.11", - "bundled": true, - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "bundled": true, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", + "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "map-age-cleaner": { - "version": "0.1.3", - "bundled": true, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "p-defer": "^1.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "mem": { - "version": "4.1.0", - "bundled": true, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } + "p-locate": "^4.1.0" } }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, "minimatch": { - "version": "3.0.4", - "bundled": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "0.0.10", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - } + "p-try": "^2.0.0" } }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "bundled": true, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "p-limit": "^2.2.0" } }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "path-key": "^2.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "bundled": true, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } - }, - "p-defer": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", + "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "dev": true, + "requires": { + "bl": "^5.0.0", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, - "p-is-promise": { - "version": "2.0.0", - "bundled": true, + "chalk": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", "dev": true }, - "p-limit": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "bundled": true, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true }, - "package-hash": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "bundled": true, + "log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" } }, - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "3.0.0", - "bundled": true, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { - "pify": "^3.0.0" + "ansi-regex": "^6.0.1" } - }, - "pify": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "bundled": true, + } + } + }, + "os-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz", + "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==", + "dev": true, + "requires": { + "macos-release": "^3.0.1", + "windows-release": "^5.0.1" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "dependencies": { + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, "requires": { - "find-up": "^3.0.0" + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" } - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, + } + } + }, + "pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dev": true, + "requires": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + } + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "package-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", + "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "dev": true, + "requires": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dev": true, + "requires": { + "protocols": "^2.0.0" + } + }, + "parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dev": true, + "requires": { + "parse-path": "^7.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinst": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pinst/-/pinst-3.0.0.tgz", + "integrity": "sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "read-pkg": { - "version": "3.0.0", - "bundled": true, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "p-locate": "^4.1.0" } }, - "read-pkg-up": { - "version": "4.0.0", - "bundled": true, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "p-try": "^2.0.0" } }, - "release-zalgo": { - "version": "1.0.0", - "bundled": true, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "es6-error": "^4.0.1" + "p-limit": "^2.2.0" } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve": { - "version": "1.10.0", - "bundled": true, + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", + "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "prettyjson": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.5.tgz", + "integrity": "sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==", + "dev": true, + "requires": { + "colors": "1.4.0", + "minimist": "^1.2.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "optional": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "optional": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, + "optional": true + } + } + }, + "promise.allsettled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.5.tgz", + "integrity": "sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "iterate-value": "^1.0.2" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true + }, + "proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dev": true, + "requires": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "glob": "^7.1.3" + "yallist": "^3.0.2" } }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" } }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "bundled": true, + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dev": true, + "requires": { + "escape-goat": "^4.0.0" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "safer-buffer": ">= 2.1.2 < 3" } - }, - "spdx-exceptions": { - "version": "2.2.0", - "bundled": true, + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "bundled": true, + } + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "strip-bom": { + "path-type": { "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, - "uglify-js": { - "version": "3.4.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "uuid": { - "version": "3.3.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "pify": "^3.0.0" } }, - "which-module": { - "version": "2.0.0", - "bundled": true, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - }, - "wrap-ansi": { + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "locate-path": "^2.0.0" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.4.2", - "bundled": true, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "y18n": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "12.0.5", - "bundled": true, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "p-try": "^1.0.0" } }, - "yargs-parser": { - "version": "11.1.1", - "bundled": true, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "p-limit": "^1.1.0" } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true } } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "requires": { - "wrappy": "1" + "picomatch": "^2.2.1" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "registry-auth-token": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", + "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", "dev": true, "requires": { - "p-try": "^1.0.0" + "@pnpm/npm-conf": "^1.0.4" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "rc": "1.2.8" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "prettyjson": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.1.tgz", - "integrity": "sha1-/P+rQdGcq0365eV15kJGYZsS0ok=", + "release-it": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.5.0.tgz", + "integrity": "sha512-/pQo/PwEXAWRBgVGLE+3IQ3hUoeiDZMGAo/Egin1envCyLyjzrU7+0P2w4iZ1Xv5OxhC2AcaPaN5eY1ql47cBA==", "dev": true, "requires": { - "colors": "^1.1.2", - "minimist": "^1.2.0" + "@iarna/toml": "2.2.5", + "@octokit/rest": "19.0.4", + "async-retry": "1.3.3", + "chalk": "5.0.1", + "cosmiconfig": "7.0.1", + "execa": "6.1.0", + "form-data": "4.0.0", + "git-url-parse": "13.1.0", + "globby": "13.1.2", + "got": "12.5.1", + "inquirer": "9.1.2", + "is-ci": "3.0.1", + "lodash": "4.17.21", + "mime-types": "2.1.35", + "new-github-release-url": "2.0.0", + "node-fetch": "3.2.10", + "open": "8.4.0", + "ora": "6.1.2", + "os-name": "5.0.1", + "promise.allsettled": "1.0.5", + "proxy-agent": "5.0.0", + "semver": "7.3.7", + "shelljs": "0.8.5", + "update-notifier": "6.0.2", + "url-join": "5.0.0", + "wildcard-match": "5.1.2", + "yargs-parser": "21.1.1" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true + }, + "data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "dev": true + }, + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "node-fetch": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", + "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", + "dev": true, + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "global-dirs": "^0.1.1" } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "lowercase-keys": "^3.0.0" } }, - "redeyed": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", - "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "esprima": "~3.0.0" - } - }, - "reflect-metadata": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.9.tgz", - "integrity": "sha1-mHI43IelFolf5FfxMENf+9djpNQ=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "glob": "^7.1.3" }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } } } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "run-con": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.11.tgz", + "integrity": "sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "deep-extend": "^0.6.0", + "ini": "~3.0.0", + "minimist": "^1.2.6", + "strip-json-comments": "~3.1.1" + }, + "dependencies": { + "ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true + } } }, - "retry-as-promised": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", - "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { - "any-promise": "^1.3.0" + "queue-microtask": "^1.2.2" } }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "dev": true, "requires": { - "glob": "^7.0.5" + "tslib": "^2.1.0" } }, "safe-buffer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", - "integrity": "sha512-aSLEDudu6OoRr/2rU609gRmnYboRLxgDG1z9o2Q0os7236FwvcqIOO8r8U5JUEwivZOhDaKlFO4SbPTJYyBEyQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safer-buffer": { @@ -2951,23 +18688,23 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } }, "seq-queue": { "version": "0.0.5", @@ -2976,121 +18713,265 @@ "dev": true }, "sequelize": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.13.1.tgz", - "integrity": "sha512-IE3xosPfLbUA1Ltp2lHzz76YwDnZZeqdUhNq0YXNQo/74uAOvSN6MvLJzSrqqgZ0tP5F0//0ittBvBrkOIBmsQ==", + "version": "6.29.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.29.0.tgz", + "integrity": "sha512-m8Wi90rs3NZP9coXE52c7PL4Q078nwYZXqt1IxPvgki7nOFn0p/F0eKsYDBXCPw9G8/BCEa6zZNk0DQUAT4ypA==", "dev": true, "requires": { - "bluebird": "^3.5.0", - "cls-bluebird": "^2.1.0", - "debug": "^4.1.1", - "dottie": "^2.0.0", - "inflection": "1.12.0", - "lodash": "^4.17.11", - "moment": "^2.24.0", - "moment-timezone": "^0.5.21", - "retry-as-promised": "^3.1.0", - "semver": "^6.1.1", - "sequelize-pool": "^2.3.0", + "@types/debug": "^4.1.7", + "@types/validator": "^13.7.1", + "debug": "^4.3.3", + "dottie": "^2.0.2", + "inflection": "^1.13.2", + "lodash": "^4.17.21", + "moment": "^2.29.1", + "moment-timezone": "^0.5.35", + "pg-connection-string": "^2.5.0", + "retry-as-promised": "^7.0.3", + "semver": "^7.3.5", + "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", - "uuid": "^3.2.1", - "validator": "^10.11.0", - "wkx": "^0.4.6" + "uuid": "^8.3.2", + "validator": "^13.7.0", + "wkx": "^0.5.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true } } }, "sequelize-pool": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", - "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", "dev": true }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "shebang-command": { + "setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", - "dev": true + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz", + "integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==", "dev": true, "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.0.0", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" } }, "sinon-chai": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.8.0.tgz", - "integrity": "sha1-Qyqbv9Uab8AHmPTSUmqCnAYGh6w=", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "dev": true, + "requires": {} + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.14.tgz", - "integrity": "sha1-nURjdyWYuGJxtPUj9sH04Cp9au8=", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "requires": { - "source-map": "^0.5.6" + "readable-stream": "^3.0.0" } }, "sprintf-js": { @@ -3100,123 +18981,268 @@ "dev": true }, "sqlite3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.4.tgz", - "integrity": "sha512-CO8vZMyUXBPC+E3iXOCc7Tz2pAdq5BWfLcQmOokCOZW5S5sZ/paijiPOCdvzpdP83RroWHYa5xYlVqCxSqpnQg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.2.tgz", + "integrity": "sha512-D0Reg6pRWAFXFUnZKsszCI67tthFD8fGPewRddDCX6w4cYwz3MbvuwRICbL+YQjBAh9zbw+lJ/V9oC8nG5j6eg==", "dev": true, "requires": { - "nan": "~2.10.0", - "node-pre-gyp": "^0.10.3", - "request": "^2.87.0" + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^4.2.0", + "node-gyp": "8.x", + "tar": "^6.1.11" } }, "sqlstring": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.2.0.tgz", - "integrity": "sha1-wxNcTqirzX5+50GklmqJHYak8ZE=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", + "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", "dev": true }, - "sshpk": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", - "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "dev": true, + "optional": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "minipass": "^3.1.1" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "stubs": "^3.0.0" } }, "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "teeny-request": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz", + "integrity": "sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==", + "dev": true, + "requires": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } + "readable-stream": "3" } }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "os-tmpdir": "~1.0.2" } }, "to-fast-properties": { @@ -3225,175 +19251,263 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, "toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=", "dev": true }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true } } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" + "tslib": "^1.8.1" }, "dependencies": { - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } } } }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "tslint": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz", - "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==", + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" + "is-typedarray": "^1.0.0" } }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uglify-js": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.1.tgz", + "integrity": "sha512-FAGKF12fWdkpvNJZENacOH0e/83eG6JyVQyanIJaBXCN1J11TUQv1T1/z8S+Z0CG0ZPk1nPcreF/c7lrTd0TEQ==", + "dev": true, + "optional": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "tslib": "^1.8.1" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "optional": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "optional": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "crypto-random-string": "^4.0.0" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, - "type-detect": { + "unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, - "typescript": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz", - "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==", + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true }, + "update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dev": true, + "requires": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "dependencies": { + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true + } + } + }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" } }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", + "url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "urlgrey": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", + "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==", "dev": true, "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } + "fast-url-parser": "^1.1.3" } }, "util-deprecate": { @@ -3403,43 +19517,102 @@ "dev": true }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "uuid-validate": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/uuid-validate/-/uuid-validate-0.0.2.tgz", - "integrity": "sha1-7Yg9Js8NGBl2Or+jFelibdtnyOg=", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uuid-validate/-/uuid-validate-0.0.3.tgz", + "integrity": "sha512-Fykw5U4eZESbq739BeLvEBFRuJODfrlmjx5eJux7W817LjRaq4b7/i4t2zxQmhcX+fAj4nMfRdTzO4tmwLKn0w==", "dev": true }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "vm2": { + "version": "3.9.15", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.15.tgz", + "integrity": "sha512-XqNqknHGw2avJo13gbIwLNZUumvrSHc9mLqoadFZTpo3KaNEJoe1I0lqTFhRXmXD7WkLyG01aaraXdXT0pa4ag==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -3447,31 +19620,108 @@ "dev": true }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "requires": { + "string-width": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "wildcard-match": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz", + "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", + "dev": true + }, + "windows-release": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz", + "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "execa": "^5.1.1" } }, "wkx": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", - "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", "dev": true, "requires": { "@types/node": "*" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { @@ -3479,98 +19729,125 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "dev": true + }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { - "version": "11.1.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } } } }, "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "dependencies": { "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true } } }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true } } diff --git a/package.json b/package.json index 8e76966b..79ac79dd 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,18 @@ { "name": "sequelize-typescript", - "version": "1.0.0-beta.4", + "version": "2.1.6", "description": "Decorators and some other features for sequelize", "scripts": { "build": "tsc", - "test": "mocha", - "cover": "nyc mocha", - "lint": "tslint -c tslint.json --project tsconfig.json", - "prepublishOnly": "npm run build" + "test": "mocha test/**/*.spec.ts", + "cover": "nyc mocha test/**/*.spec.ts", + "lint": "eslint --ext .ts src/ test/", + "lint:fix": "npm run lint -- --fix", + "markdownlint": "markdownlint '**/*.md' --ignore node_modules --ignore CHANGELOG.md", + "release": "release-it", + "postinstall": "husky install", + "prepublishOnly": "pinst --disable && npm run build", + "postpublish": "pinst --enable" }, "repository": { "type": "git", @@ -33,52 +38,36 @@ "homepage": "https://github.com/RobinBuschmann/sequelize-typescript#readme", "main": "dist/index.js", "types": "dist/index.d.ts", - "dependencies": { - "glob": "7.1.2" - }, - "devDependencies": { - "@types/bluebird": "3.5.25", - "@types/chai": "3.4.35", - "@types/chai-as-promised": "0.0.29", - "@types/chai-datetime": "0.0.30", - "@types/lodash": "4.14.109", - "@types/mocha": "2.2.39", - "@types/node": "11.13.4", - "@types/prettyjson": "0.0.28", - "@types/sinon": "1.16.35", - "@types/sinon-chai": "2.7.27", - "chai": "3.5.0", - "chai-as-promised": "6.0.0", - "chai-datetime": "1.4.1", - "codecov": "3.1.0", - "copyfiles": "2.1.0", - "has-flag": "2.0.0", - "lodash": "4.17.11", - "mocha": "5.2.0", - "moment": "2.21.0", - "mysql2": "1.3.5", - "nyc": "13.3.0", - "prettyjson": "1.2.1", - "reflect-metadata": "0.1.9", - "sequelize": "5.13.1", - "sinon": "1.17.7", - "sinon-chai": "2.8.0", - "source-map-support": "0.4.14", - "sqlite3": "4.0.4", - "ts-node": "7.0.1", - "tslint": "5.14.0", - "typescript": "3.3.3", - "uuid-validate": "0.0.2" - }, - "peerDependencies": { - "@types/bluebird": "*", - "@types/node": "*", - "@types/validator": "*", - "reflect-metadata": "*", - "sequelize": "^5.1.0" - }, + "browser": "dist/browser/index.js", "engines": { - "node": ">=0.8.15" + "node": ">=10.0.0" + }, + "release-it": { + "git": { + "commit": false, + "push": false, + "tag": false + }, + "github": { + "release": false + }, + "npm": { + "publish": false + }, + "hooks": { + "before:init": [ + "npm run lint", + "npm run markdownlint", + "npm run build", + "npm run test" + ] + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": "angular", + "infile": "CHANGELOG.md" + } + } }, "nyc": { "lines": 85, @@ -102,5 +91,59 @@ "all": true, "check-coverage": true, "report-dir": "./coverage" + }, + "dependencies": { + "glob": "7.2.0" + }, + "devDependencies": { + "@commitlint/cli": "17.2.0", + "@commitlint/config-conventional": "17.2.0", + "@release-it/conventional-changelog": "5.1.1", + "@types/chai": "4.3.4", + "@types/chai-as-promised": "7.1.5", + "@types/chai-datetime": "0.0.37", + "@types/lodash": "4.14.190", + "@types/mocha": "9.1.0", + "@types/node": "18.11.9", + "@types/prettyjson": "0.0.30", + "@types/sinon": "10.0.11", + "@types/sinon-chai": "3.2.9", + "@typescript-eslint/eslint-plugin": "5.44.0", + "@typescript-eslint/parser": "5.42.0", + "chai": "4.3.7", + "chai-as-promised": "7.1.1", + "chai-datetime": "1.8.0", + "codecov": "3.8.3", + "copyfiles": "2.4.1", + "eslint": "8.27.0", + "eslint-config-prettier": "8.5.0", + "eslint-plugin-prettier": "4.2.1", + "has-flag": "5.0.1", + "husky": "8.0.2", + "lodash": "4.17.21", + "markdownlint-cli": "0.32.2", + "mocha": "9.2.2", + "moment": "2.29.4", + "mysql2": "2.3.3", + "nyc": "15.1.0", + "pinst": "3.0.0", + "prettier": "2.8.0", + "prettyjson": "1.2.5", + "reflect-metadata": "0.1.13", + "release-it": "15.5.0", + "sequelize": "6.29.0", + "sinon": "13.0.1", + "sinon-chai": "3.7.0", + "source-map-support": "0.5.21", + "sqlite3": "5.1.2", + "ts-node": "10.9.1", + "typescript": "4.8.4", + "uuid-validate": "0.0.3" + }, + "peerDependencies": { + "@types/node": "*", + "@types/validator": "*", + "reflect-metadata": "*", + "sequelize": ">=6.20.1" } } diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..51634af5 --- /dev/null +++ b/renovate.json @@ -0,0 +1,21 @@ +{ + "extends": [ + "config:base", + ":maintainLockFilesWeekly", + ":semanticCommitTypeAll(meta)", + ":semanticCommitScopeDisabled" + ], + "automergeStrategy": "squash", + "semanticCommitType": "meta", + "packageRules": [ + { + "matchUpdateTypes": ["minor", "patch", "pin", "digest"], + "automerge": true + }, + { + "matchPackageNames": ["mocha", "@types/mocha", "sinon", "@types/sinon"], + "matchUpdateTypes": ["major"], + "enabled": false + } + ] +} diff --git a/src/associations/alias-inference/alias-inference-service.ts b/src/associations/alias-inference/alias-inference-service.ts index ba5f8f08..c6a7c9a8 100644 --- a/src/associations/alias-inference/alias-inference-service.ts +++ b/src/associations/alias-inference/alias-inference-service.ts @@ -1,11 +1,10 @@ -import {getAssociationsByRelation} from "../shared/association-service"; +import { getAssociationsByRelation } from '../shared/association-service'; /** * Pre conform includes, so that "as" value can be inferred from source */ export function inferAlias(options: any, source: any): any { - - options = {...options}; + options = { ...options }; if (!options.include) { return options; @@ -37,9 +36,8 @@ function inferAliasForInclude(include: any, source: any): any { const isConstructorFn = include instanceof Function; if (isConstructorFn || hasModelOptionWithoutAsOption) { - if (isConstructorFn) { - include = {model: include}; + include = { model: include }; } const targetPrototype = source.prototype || source; @@ -48,8 +46,10 @@ function inferAliasForInclude(include: any, source: any): any { if (associations.length > 0) { if (associations.length > 1) { - throw new Error(`Alias cannot be inferred: "${source.name}" has multiple ` + - `relations with "${include.model.name}"`); + throw new Error( + `Alias cannot be inferred: "${source.name}" has multiple ` + + `relations with "${include.model.name}"` + ); } include.as = associations[0].getAs(); } diff --git a/src/associations/belongs-to-many/belongs-to-many-association.ts b/src/associations/belongs-to-many/belongs-to-many-association.ts index 695a6842..d04c2f42 100644 --- a/src/associations/belongs-to-many/belongs-to-many-association.ts +++ b/src/associations/belongs-to-many/belongs-to-many-association.ts @@ -1,18 +1,24 @@ -import {BelongsToManyOptions as OriginBelongsToManyOptions, Model, ThroughOptions} from "sequelize"; +import { BaseAssociation } from '../shared/base-association'; +import { BelongsToManyOptions } from './belongs-to-many-options'; +import { ModelNotInitializedError } from '../../model/shared/model-not-initialized-error'; +import { getForeignKeyOptions } from '../foreign-key/foreign-key-service'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { Association } from '../shared/association'; +import { Sequelize } from '../../sequelize/sequelize/sequelize'; +import { UnionAssociationOptions } from '../shared/union-association-options'; +import { ModelType } from '../../model/model/model'; +import { ThroughOptions } from '../through/through-options'; -import {BaseAssociation} from '../shared/base-association'; -import {BelongsToManyOptions} from './belongs-to-many-options'; -import {ModelNotInitializedError} from '../../model/shared/model-not-initialized-error'; -import {getForeignKeyOptions} from "../foreign-key/foreign-key-service"; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; -import {Association} from "../shared/association"; -import {Sequelize} from "../../sequelize/sequelize/sequelize"; -import {UnionAssociationOptions} from "../shared/union-association-options"; - -export class BelongsToManyAssociation extends BaseAssociation { - - constructor(associatedClassGetter: ModelClassGetter, - protected options: BelongsToManyOptions) { +export class BelongsToManyAssociation< + TCreationAttributes extends {}, + TModelAttributes extends {}, + TCreationAttributesThrough extends {}, + TModelAttributesThrough extends {} +> extends BaseAssociation { + constructor( + associatedClassGetter: ModelClassGetter, + protected options: BelongsToManyOptions + ) { super(associatedClassGetter, options); } @@ -20,32 +26,45 @@ export class BelongsToManyAssociation extends BaseAssociation { return Association.BelongsToMany; } - getSequelizeOptions(model: typeof Model, - sequelize: Sequelize): UnionAssociationOptions { - const options: OriginBelongsToManyOptions = {...this.options as any}; + getSequelizeOptions( + model: ModelType, + sequelize: Sequelize + ): UnionAssociationOptions { + const options: BelongsToManyOptions = { + ...this.options, + }; const associatedClass = this.getAssociatedClass(); const throughOptions = this.getThroughOptions(sequelize); - const throughModel = typeof throughOptions === 'object' ? throughOptions.model : undefined; + const throughModel = + typeof throughOptions === 'object' && typeof throughOptions.model !== 'string' + ? throughOptions.model + : undefined; options.through = throughOptions; - options.foreignKey = getForeignKeyOptions(model, throughModel, this.options.foreignKey); - options.otherKey = getForeignKeyOptions(associatedClass, throughModel, this.options.otherKey); + options.foreignKey = getForeignKeyOptions(model, throughModel as any, this.options.foreignKey); + options.otherKey = getForeignKeyOptions( + associatedClass, + throughModel as any, + this.options.otherKey + ); return options; } - private getThroughOptions(sequelize: Sequelize): ThroughOptions | string { + private getThroughOptions( + sequelize: Sequelize + ): ThroughOptions | string { const through = this.options.through; const throughModel = typeof through === 'object' ? through.model : through; - const throughOptions: ThroughOptions = - typeof through === 'object' ? {...through} : {} as any; + const throughOptions: ThroughOptions = + typeof through === 'object' ? { ...through } : ({} as any); if (typeof throughModel === 'function') { const throughModelClass = sequelize.model(throughModel()); if (!throughModelClass.isInitialized) { throw new ModelNotInitializedError(throughModelClass, 'Association cannot be resolved.'); } - throughOptions.model = throughModelClass; + throughOptions.model = throughModelClass as any; } else { return throughModel; } diff --git a/src/associations/belongs-to-many/belongs-to-many-options.ts b/src/associations/belongs-to-many/belongs-to-many-options.ts index 248e4930..0da4044b 100644 --- a/src/associations/belongs-to-many/belongs-to-many-options.ts +++ b/src/associations/belongs-to-many/belongs-to-many-options.ts @@ -1,10 +1,15 @@ -import {BelongsToManyOptions as OriginBelongsToManyOptions} from 'sequelize'; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; -import {ThroughOptions} from "../through/through-options"; +import { BelongsToManyOptions as OriginBelongsToManyOptions } from 'sequelize'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { ThroughOptions } from '../through/through-options'; - -export type BelongsToManyOptions = { +export type BelongsToManyOptions< + TCreationAttributesThrough extends {}, + TModelAttributesThrough extends {} +> = { [K in keyof OriginBelongsToManyOptions]: K extends 'through' - ? ModelClassGetter | string | ThroughOptions - : OriginBelongsToManyOptions[K] + ? + | ModelClassGetter + | string + | ThroughOptions + : OriginBelongsToManyOptions[K]; }; diff --git a/src/associations/belongs-to-many/belongs-to-many.ts b/src/associations/belongs-to-many/belongs-to-many.ts index 0323cf33..87991ade 100644 --- a/src/associations/belongs-to-many/belongs-to-many.ts +++ b/src/associations/belongs-to-many/belongs-to-many.ts @@ -1,34 +1,60 @@ -import {BelongsToManyOptions} from "./belongs-to-many-options"; -import {BelongsToManyAssociation} from './belongs-to-many-association'; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; -import {addAssociation} from "../shared/association-service"; - -export function BelongsToMany(associatedClassGetter: ModelClassGetter, - through: ModelClassGetter | string, - foreignKey?: string, - otherKey?: string): Function; -export function BelongsToMany(associatedClassGetter: ModelClassGetter, - options: BelongsToManyOptions): Function; -export function BelongsToMany(associatedClassGetter: ModelClassGetter, - throughOrOptions: ModelClassGetter | string | BelongsToManyOptions, - foreignKey?: string, - otherKey?: string): Function { +import { BelongsToManyOptions } from './belongs-to-many-options'; +import { BelongsToManyAssociation } from './belongs-to-many-association'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { addAssociation } from '../shared/association-service'; +export function BelongsToMany< + TCreationAttributes extends {}, + TModelAttributes extends {}, + TCreationAttributesThrough extends {}, + TModelAttributesThrough extends {} +>( + associatedClassGetter: ModelClassGetter, + through: ModelClassGetter | string, + foreignKey?: string, + otherKey?: string +): Function; +export function BelongsToMany< + TCreationAttributes extends {}, + TModelAttributes extends {}, + TCreationAttributesThrough extends {}, + TModelAttributesThrough extends {} +>( + associatedClassGetter: ModelClassGetter, + options: BelongsToManyOptions +): Function; +export function BelongsToMany< + TCreationAttributes extends {}, + TModelAttributes extends {}, + TCreationAttributesThrough extends {}, + TModelAttributesThrough extends {} +>( + associatedClassGetter: ModelClassGetter, + throughOrOptions: + | ModelClassGetter + | string + | BelongsToManyOptions, + foreignKey?: string, + otherKey?: string +): Function { return (target: any, propertyName: string) => { - let options: Partial = {foreignKey, otherKey}; + let options: Partial< + BelongsToManyOptions + > = { foreignKey, otherKey }; - if (typeof throughOrOptions === 'string' || - typeof throughOrOptions === 'function') { + if (typeof throughOrOptions === 'string' || typeof throughOrOptions === 'function') { options.through = throughOrOptions; } else { - options = {...throughOrOptions}; + options = { ...throughOrOptions }; } if (!options.as) options.as = propertyName; - addAssociation(target, new BelongsToManyAssociation( - associatedClassGetter, - options as BelongsToManyOptions, + addAssociation( + target, + new BelongsToManyAssociation( + associatedClassGetter, + options as BelongsToManyOptions ) ); }; diff --git a/src/associations/belongs-to/belongs-to-association.ts b/src/associations/belongs-to/belongs-to-association.ts index 73212441..b9627060 100644 --- a/src/associations/belongs-to/belongs-to-association.ts +++ b/src/associations/belongs-to/belongs-to-association.ts @@ -1,16 +1,20 @@ -import {BelongsToOptions} from 'sequelize'; +import { BelongsToOptions } from 'sequelize'; -import {BaseAssociation} from '../shared/base-association'; -import {getForeignKeyOptions} from "../foreign-key/foreign-key-service"; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; -import {Association} from "../shared/association"; -import {Model} from "../../model/model/model"; -import {UnionAssociationOptions} from "../shared/union-association-options"; +import { BaseAssociation } from '../shared/base-association'; +import { getForeignKeyOptions } from '../foreign-key/foreign-key-service'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { Association } from '../shared/association'; +import { ModelType } from '../../model/model/model'; +import { UnionAssociationOptions } from '../shared/union-association-options'; -export class BelongsToAssociation extends BaseAssociation { - - constructor(associatedClassGetter: ModelClassGetter, - protected options: BelongsToOptions) { +export class BelongsToAssociation< + TCreationAttributes extends {}, + TModelAttributes extends {} +> extends BaseAssociation { + constructor( + associatedClassGetter: ModelClassGetter, + protected options: BelongsToOptions + ) { super(associatedClassGetter, options); } @@ -18,7 +22,9 @@ export class BelongsToAssociation extends BaseAssociation { return Association.BelongsTo; } - getSequelizeOptions(model: typeof Model): UnionAssociationOptions { + getSequelizeOptions( + model: ModelType + ): UnionAssociationOptions { const associatedClass = this.getAssociatedClass(); const foreignKey = getForeignKeyOptions(associatedClass, model, this.options.foreignKey); diff --git a/src/associations/belongs-to/belongs-to.ts b/src/associations/belongs-to/belongs-to.ts index a09a391a..6c7567ac 100644 --- a/src/associations/belongs-to/belongs-to.ts +++ b/src/associations/belongs-to/belongs-to.ts @@ -1,22 +1,26 @@ -import {BelongsToOptions} from 'sequelize'; +import { BelongsToOptions } from 'sequelize'; -import {BelongsToAssociation} from './belongs-to-association'; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; -import {addAssociation, getPreparedAssociationOptions} from "../shared/association-service"; +import { BelongsToAssociation } from './belongs-to-association'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { addAssociation, getPreparedAssociationOptions } from '../shared/association-service'; -export function BelongsTo(associatedClassGetter: ModelClassGetter, foreignKey?: string): Function; +export function BelongsTo( + associatedClassGetter: ModelClassGetter, + foreignKey?: string +): Function; -export function BelongsTo(associatedClassGetter: ModelClassGetter, options?: BelongsToOptions): Function; - -export function BelongsTo(associatedClassGetter: ModelClassGetter, optionsOrForeignKey?: string | BelongsToOptions): Function { +export function BelongsTo( + associatedClassGetter: ModelClassGetter, + options?: BelongsToOptions +): Function; +export function BelongsTo( + associatedClassGetter: ModelClassGetter, + optionsOrForeignKey?: string | BelongsToOptions +): Function { return (target: any, propertyName: string) => { const options: BelongsToOptions = getPreparedAssociationOptions(optionsOrForeignKey); if (!options.as) options.as = propertyName; - addAssociation(target, new BelongsToAssociation( - associatedClassGetter, - options, - ) - ); + addAssociation(target, new BelongsToAssociation(associatedClassGetter, options)); }; } diff --git a/src/associations/foreign-key/foreign-key-meta.ts b/src/associations/foreign-key/foreign-key-meta.ts index 768ce922..56ebe1e6 100644 --- a/src/associations/foreign-key/foreign-key-meta.ts +++ b/src/associations/foreign-key/foreign-key-meta.ts @@ -1,7 +1,6 @@ -import {ModelClassGetter} from "../../model/shared/model-class-getter"; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; -export interface ForeignKeyMeta { - - relatedClassGetter: ModelClassGetter; +export interface ForeignKeyMeta { + relatedClassGetter: ModelClassGetter; foreignKey: string; } diff --git a/src/associations/foreign-key/foreign-key-service.ts b/src/associations/foreign-key/foreign-key-service.ts index aeccf881..17f7a2f9 100644 --- a/src/associations/foreign-key/foreign-key-service.ts +++ b/src/associations/foreign-key/foreign-key-service.ts @@ -1,33 +1,45 @@ -import {ForeignKeyOptions, Model} from "sequelize"; +import { ForeignKeyOptions } from 'sequelize'; -import {ForeignKeyMeta} from './foreign-key-meta'; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; +import { ForeignKeyMeta } from './foreign-key-meta'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { ModelType } from '../../model/model/model'; const FOREIGN_KEYS_KEY = 'sequelize:foreignKeys'; -export function getForeignKeyOptions(relatedClass: typeof Model, - classWithForeignKey?: typeof Model, - foreignKey?: string | ForeignKeyOptions): ForeignKeyOptions { +export function getForeignKeyOptions< + TCreationAttributes extends {}, + TModelAttributes extends {}, + TCreationAttributesThrough extends {}, + TModelAttributesThrough extends {} +>( + relatedClass: ModelType, + classWithForeignKey?: ModelType, + foreignKey?: string | ForeignKeyOptions +): ForeignKeyOptions { let foreignKeyOptions: ForeignKeyOptions = {}; if (typeof foreignKey === 'string') { foreignKeyOptions.name = foreignKey; } else if (foreignKey && typeof foreignKey === 'object') { - foreignKeyOptions = {...foreignKey}; + foreignKeyOptions = { ...foreignKey }; } if (!foreignKeyOptions.name && classWithForeignKey) { const foreignKeys = getForeignKeys(classWithForeignKey.prototype) || []; for (const key of foreignKeys) { - if (key.relatedClassGetter() === relatedClass || - relatedClass.prototype instanceof key.relatedClassGetter()) { + if ( + key.relatedClassGetter() === relatedClass || + relatedClass.prototype instanceof key.relatedClassGetter() + ) { foreignKeyOptions.name = key.foreignKey; break; } } } if (!foreignKeyOptions.name) { - throw new Error(`Foreign key for "${(relatedClass as any).name}" is missing ` + - `on "${(classWithForeignKey as any).name}".`); + throw new Error( + `Foreign key for "${(relatedClass as any).name}" is missing ` + + `on "${(classWithForeignKey as any).name}".` + ); } return foreignKeyOptions; @@ -36,9 +48,11 @@ export function getForeignKeyOptions(relatedClass: typeof Model, /** * Adds foreign key meta data for specified class */ -export function addForeignKey(target: any, - relatedClassGetter: ModelClassGetter, - foreignKey: string): void { +export function addForeignKey( + target: any, + relatedClassGetter: ModelClassGetter, + foreignKey: string +): void { let foreignKeys = getForeignKeys(target); if (!foreignKeys) { foreignKeys = []; @@ -53,7 +67,9 @@ export function addForeignKey(target: any, /** * Returns foreign key meta data from specified class */ -export function getForeignKeys(target: any): ForeignKeyMeta[] | undefined { +export function getForeignKeys( + target: any +): ForeignKeyMeta[] | undefined { const foreignKeys = Reflect.getMetadata(FOREIGN_KEYS_KEY, target); if (foreignKeys) { return [...foreignKeys]; diff --git a/src/associations/foreign-key/foreign-key.ts b/src/associations/foreign-key/foreign-key.ts index f7f00057..0e971e10 100644 --- a/src/associations/foreign-key/foreign-key.ts +++ b/src/associations/foreign-key/foreign-key.ts @@ -1,7 +1,9 @@ -import {addForeignKey} from "./foreign-key-service"; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; +import { addForeignKey } from './foreign-key-service'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; -export function ForeignKey(relatedClassGetter: ModelClassGetter): Function { +export function ForeignKey( + relatedClassGetter: ModelClassGetter +): Function { return (target: any, propertyName: string) => { addForeignKey(target, relatedClassGetter, propertyName); }; diff --git a/src/associations/has/has-association.ts b/src/associations/has/has-association.ts index 4a3379c3..343c89b6 100644 --- a/src/associations/has/has-association.ts +++ b/src/associations/has/has-association.ts @@ -1,16 +1,21 @@ -import {HasManyOptions, HasOneOptions, Model} from 'sequelize'; +import { HasManyOptions, HasOneOptions } from 'sequelize'; -import {BaseAssociation} from '../shared/base-association'; -import {getForeignKeyOptions} from "../foreign-key/foreign-key-service"; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; -import {Association} from "../shared/association"; -import {UnionAssociationOptions} from "../shared/union-association-options"; +import { BaseAssociation } from '../shared/base-association'; +import { getForeignKeyOptions } from '../foreign-key/foreign-key-service'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { Association } from '../shared/association'; +import { UnionAssociationOptions } from '../shared/union-association-options'; +import { ModelType } from '../../model/model/model'; -export class HasAssociation extends BaseAssociation { - - constructor(associatedClassGetter: ModelClassGetter, - protected options: HasManyOptions | HasOneOptions, - private association: Association) { +export class HasAssociation< + TCreationAttributes extends {}, + TModelAttributes extends {} +> extends BaseAssociation { + constructor( + associatedClassGetter: ModelClassGetter, + protected options: HasManyOptions | HasOneOptions, + private association: Association + ) { super(associatedClassGetter, options); } @@ -18,8 +23,10 @@ export class HasAssociation extends BaseAssociation { return this.association; } - getSequelizeOptions(model: typeof Model): UnionAssociationOptions { - const options = {...this.options}; + getSequelizeOptions( + model: ModelType + ): UnionAssociationOptions { + const options = { ...this.options }; const associatedClass = this.getAssociatedClass(); options.foreignKey = getForeignKeyOptions(model, associatedClass, options.foreignKey); diff --git a/src/associations/has/has-many.ts b/src/associations/has/has-many.ts index 53f6d1e2..c047c565 100644 --- a/src/associations/has/has-many.ts +++ b/src/associations/has/has-many.ts @@ -1,24 +1,27 @@ -import {HasManyOptions} from "sequelize"; +import { HasManyOptions } from 'sequelize'; -import {HasAssociation} from './has-association'; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; -import {addAssociation, getPreparedAssociationOptions} from "../shared/association-service"; -import {Association} from "../shared/association"; +import { HasAssociation } from './has-association'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { addAssociation, getPreparedAssociationOptions } from '../shared/association-service'; +import { Association } from '../shared/association'; -export function HasMany(associatedClassGetter: ModelClassGetter, foreignKey?: string): Function; +export function HasMany( + associatedClassGetter: ModelClassGetter, + foreignKey?: string +): Function; -export function HasMany(associatedClassGetter: ModelClassGetter, options?: HasManyOptions): Function; - -export function HasMany(associatedClassGetter: ModelClassGetter, optionsOrForeignKey?: string | HasManyOptions): Function { +export function HasMany( + associatedClassGetter: ModelClassGetter, + options?: HasManyOptions +): Function; +export function HasMany( + associatedClassGetter: ModelClassGetter, + optionsOrForeignKey?: string | HasManyOptions +): Function { return (target: any, propertyName: string) => { const options: HasManyOptions = getPreparedAssociationOptions(optionsOrForeignKey); if (!options.as) options.as = propertyName; - addAssociation(target, new HasAssociation( - associatedClassGetter, - options, - Association.HasMany, - ) - ); + addAssociation(target, new HasAssociation(associatedClassGetter, options, Association.HasMany)); }; } diff --git a/src/associations/has/has-one.ts b/src/associations/has/has-one.ts index c25f0b8f..f92ebb94 100644 --- a/src/associations/has/has-one.ts +++ b/src/associations/has/has-one.ts @@ -1,24 +1,27 @@ -import {HasOneOptions} from "sequelize"; +import { HasOneOptions } from 'sequelize'; -import {HasAssociation} from './has-association'; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; -import {addAssociation, getPreparedAssociationOptions} from "../shared/association-service"; -import {Association} from "../shared/association"; +import { HasAssociation } from './has-association'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { addAssociation, getPreparedAssociationOptions } from '../shared/association-service'; +import { Association } from '../shared/association'; -export function HasOne(associatedClassGetter: ModelClassGetter, foreignKey?: string): Function; +export function HasOne( + associatedClassGetter: ModelClassGetter, + foreignKey?: string +): Function; -export function HasOne(associatedClassGetter: ModelClassGetter, options?: HasOneOptions): Function; - -export function HasOne(associatedClassGetter: ModelClassGetter, optionsOrForeignKey?: string | HasOneOptions): Function { +export function HasOne( + associatedClassGetter: ModelClassGetter, + options?: HasOneOptions +): Function; +export function HasOne( + associatedClassGetter: ModelClassGetter, + optionsOrForeignKey?: string | HasOneOptions +): Function { return (target: any, propertyName: string) => { const options: HasOneOptions = getPreparedAssociationOptions(optionsOrForeignKey); if (!options.as) options.as = propertyName; - addAssociation(target, new HasAssociation( - associatedClassGetter, - options, - Association.HasOne, - ) - ); + addAssociation(target, new HasAssociation(associatedClassGetter, options, Association.HasOne)); }; } diff --git a/src/associations/shared/association-service.ts b/src/associations/shared/association-service.ts index 361124e9..f3f23b51 100644 --- a/src/associations/shared/association-service.ts +++ b/src/associations/shared/association-service.ts @@ -1,24 +1,25 @@ import 'reflect-metadata'; -import {BelongsToOptions, HasOneOptions, HasManyOptions, ManyToManyOptions} from 'sequelize'; -import {BaseAssociation} from './base-association'; +import { BelongsToOptions, HasOneOptions, HasManyOptions, ManyToManyOptions } from 'sequelize'; +import { BaseAssociation } from './base-association'; const ASSOCIATIONS_KEY = 'sequelize:associations'; export type NonBelongsToManyAssociationOptions = - BelongsToOptions | - HasManyOptions | - HasOneOptions | - ManyToManyOptions; + | BelongsToOptions + | HasManyOptions + | HasOneOptions + | ManyToManyOptions; -// tslint:disable:max-line-length -export function getPreparedAssociationOptions(optionsOrForeignKey?: string | NonBelongsToManyAssociationOptions) { +export function getPreparedAssociationOptions( + optionsOrForeignKey?: string | NonBelongsToManyAssociationOptions +): NonBelongsToManyAssociationOptions { let options: NonBelongsToManyAssociationOptions = {}; if (optionsOrForeignKey) { if (typeof optionsOrForeignKey === 'string') { options.foreignKey = optionsOrForeignKey; } else { - options = {...optionsOrForeignKey}; + options = { ...optionsOrForeignKey }; } } return options; @@ -27,9 +28,10 @@ export function getPreparedAssociationOptions(optionsOrForeignKey?: string | Non /** * Stores association meta data for specified class */ -export function addAssociation(target: any, - association: BaseAssociation) { - +export function addAssociation( + target: any, + association: BaseAssociation +): void { let associations = getAssociations(target); if (!associations) { @@ -42,21 +44,28 @@ export function addAssociation(target: any, /** * Returns association meta data from specified class */ -export function getAssociations(target: any): BaseAssociation[] | undefined { +export function getAssociations( + target: any +): BaseAssociation[] | undefined { const associations = Reflect.getMetadata(ASSOCIATIONS_KEY, target); if (associations) { return [...associations]; } } -export function setAssociations(target: any, associations: BaseAssociation[]) { +export function setAssociations( + target: any, + associations: BaseAssociation[] +): void { Reflect.defineMetadata(ASSOCIATIONS_KEY, associations, target); } -export function getAssociationsByRelation(target: any, - relatedClass: any): BaseAssociation[] { - const associations = getAssociations(target); - return (associations || []).filter(association => { +export function getAssociationsByRelation< + TCreationAttributes extends {}, + TModelAttributes extends {} +>(target: any, relatedClass: any): BaseAssociation[] { + const associations = getAssociations(target); + return (associations || []).filter((association) => { const _relatedClass = association.getAssociatedClass(); return ( _relatedClass.prototype === relatedClass.prototype || @@ -64,4 +73,3 @@ export function getAssociationsByRelation(target: any, ); }); } - diff --git a/src/associations/shared/base-association.ts b/src/associations/shared/base-association.ts index 1f6143fe..b6ce121b 100644 --- a/src/associations/shared/base-association.ts +++ b/src/associations/shared/base-association.ts @@ -1,24 +1,26 @@ -import {UnionAssociationOptions} from './union-association-options'; -import {Association} from './association'; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; -import {Model} from "../../model/model/model"; -import {Sequelize} from "../../sequelize/sequelize/sequelize"; +import { UnionAssociationOptions } from './union-association-options'; +import { Association } from './association'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; +import { ModelType } from '../../model/model/model'; +import { Sequelize } from '../../sequelize/sequelize/sequelize'; -export abstract class BaseAssociation { - - constructor(private associatedClassGetter: ModelClassGetter, - protected options: UnionAssociationOptions) { - } +export abstract class BaseAssociation { + constructor( + private associatedClassGetter: ModelClassGetter, + protected options: UnionAssociationOptions + ) {} abstract getAssociation(): Association; - abstract getSequelizeOptions(model: typeof Model, - sequelize: Sequelize): UnionAssociationOptions; + abstract getSequelizeOptions( + model: ModelType, + sequelize: Sequelize + ): UnionAssociationOptions; - getAssociatedClass(): typeof Model { + getAssociatedClass(): ModelType { return this.associatedClassGetter(); } - getAs() { + getAs(): string | { singular: string; plural: string } | undefined { return this.options.as; } } diff --git a/src/associations/shared/union-association-options.ts b/src/associations/shared/union-association-options.ts index ae6e915f..bf375e8f 100644 --- a/src/associations/shared/union-association-options.ts +++ b/src/associations/shared/union-association-options.ts @@ -1,7 +1,7 @@ -import {BelongsToOptions, HasManyOptions, HasOneOptions, ManyToManyOptions} from 'sequelize'; +import { BelongsToOptions, HasManyOptions, HasOneOptions, ManyToManyOptions } from 'sequelize'; export type UnionAssociationOptions = - BelongsToOptions | - HasManyOptions | - HasOneOptions | - ManyToManyOptions; + | BelongsToOptions + | HasManyOptions + | HasOneOptions + | ManyToManyOptions; diff --git a/src/associations/through/through-options.ts b/src/associations/through/through-options.ts index 6e1c2075..94f896e5 100644 --- a/src/associations/through/through-options.ts +++ b/src/associations/through/through-options.ts @@ -1,8 +1,8 @@ -import {ThroughOptions as OriginThroughOptions} from 'sequelize'; -import {ModelClassGetter} from "../../model/shared/model-class-getter"; +import { ThroughOptions as OriginThroughOptions } from 'sequelize'; +import { ModelClassGetter } from '../../model/shared/model-class-getter'; -export type ThroughOptions = { +export type ThroughOptions = { [K in keyof OriginThroughOptions]: K extends 'model' - ? ModelClassGetter | string - : OriginThroughOptions[K] + ? ModelClassGetter | string + : OriginThroughOptions[K]; }; diff --git a/src/browser/index.ts b/src/browser/index.ts new file mode 100644 index 00000000..5951e54d --- /dev/null +++ b/src/browser/index.ts @@ -0,0 +1,104 @@ +function noop() { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + return (target: Object, propertyName: string): void => { + // noop + }; +} + +export class Model {} +export const DataType = {}; + +export const AllowNull = noop; +export const AutoIncrement = noop; +export const Column = noop; +export const Comment = noop; +export const CreatedAt = noop; +export const Default = noop; +export const DefaultScope = noop; +export const DeletedAt = noop; +export const ForeignKey = noop; +export const PrimaryKey = noop; +export const Scopes = noop; +export const Table = noop; +export const Unique = noop; +export const UpdatedAt = noop; +export const BelongsTo = noop; +export const BelongsToMany = noop; +export const HasMany = noop; +export const HasOne = noop; +export const AfterBulkCreate = noop; +export const AfterBulkDelete = noop; +export const AfterBulkDestroy = noop; +export const AfterBulkRestore = noop; +export const AfterBulkSync = noop; +export const AfterBulkUpdate = noop; +export const AfterConnect = noop; +export const AfterCreate = noop; +export const AfterDefine = noop; +export const AfterDelete = noop; +export const AfterDestroy = noop; +export const AfterFind = noop; +export const AfterInit = noop; +export const AfterRestore = noop; +export const AfterSave = noop; +export const AfterSync = noop; +export const AfterUpdate = noop; +export const AfterUpsert = noop; +export const AfterValidate = noop; +export const BeforeBulkCreate = noop; +export const BeforeBulkDelete = noop; +export const BeforeBulkDestroy = noop; +export const BeforeBulkRestore = noop; +export const BeforeBulkSync = noop; +export const BeforeBulkUpdate = noop; +export const BeforeConnect = noop; +export const BeforeCount = noop; +export const BeforeCreate = noop; +export const BeforeDefine = noop; +export const BeforeDelete = noop; +export const BeforeDestroy = noop; +export const BeforeFind = noop; +export const BeforeFindAfterExpandIncludeAll = noop; +export const BeforeFindAfterOptions = noop; +export const BeforeInit = noop; +export const BeforeRestore = noop; +export const BeforeSave = noop; +export const BeforeSync = noop; +export const BeforeUpdate = noop; +export const BeforeUpsert = noop; +export const BeforeValidate = noop; +export const ValidationFailed = noop; +export const Contains = noop; +export const Equals = noop; +export const Is = noop; +export const IsAfter = noop; +export const IsAlpha = noop; +export const IsAlphanumeric = noop; +export const IsArray = noop; +export const IsBefore = noop; +export const IsCreditCard = noop; +export const IsDate = noop; +export const IsDecimal = noop; +export const IsEmail = noop; +export const IsFloat = noop; +export const IsIn = noop; +export const IsInt = noop; +export const IsIP = noop; +export const IsIPv4 = noop; +export const IsIPv6 = noop; +export const IsLowercase = noop; +export const IsNull = noop; +export const IsNumeric = noop; +export const IsUppercase = noop; +export const IsUrl = noop; +export const IsUUID = noop; +export const Length = noop; +export const Max = noop; +export const Min = noop; +export const Not = noop; +export const NotContains = noop; +export const NotEmpty = noop; +export const NotIn = noop; +export const NotNull = noop; +export const Validate = noop; +export const Validator = noop; diff --git a/src/hooks/bulk/after/after-bulk-create.ts b/src/hooks/bulk/after/after-bulk-create.ts index 742f6d5d..ea6ed073 100644 --- a/src/hooks/bulk/after/after-bulk-create.ts +++ b/src/hooks/bulk/after/after-bulk-create.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterBulkCreate(target: any, propertyName: string): void; export function AfterBulkCreate(options: HookOptions): Function; diff --git a/src/hooks/bulk/after/after-bulk-destroy.ts b/src/hooks/bulk/after/after-bulk-destroy.ts index e09e6cf2..1e9c9684 100644 --- a/src/hooks/bulk/after/after-bulk-destroy.ts +++ b/src/hooks/bulk/after/after-bulk-destroy.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterBulkDestroy(target: any, propertyName: string): void; export function AfterBulkDestroy(options: HookOptions): Function; diff --git a/src/hooks/bulk/after/after-bulk-restore.ts b/src/hooks/bulk/after/after-bulk-restore.ts index 0f322142..1f99d8a1 100644 --- a/src/hooks/bulk/after/after-bulk-restore.ts +++ b/src/hooks/bulk/after/after-bulk-restore.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterBulkRestore(target: any, propertyName: string): void; export function AfterBulkRestore(options: HookOptions): Function; diff --git a/src/hooks/bulk/after/after-bulk-sync.ts b/src/hooks/bulk/after/after-bulk-sync.ts index 06b39b5c..6aeba183 100644 --- a/src/hooks/bulk/after/after-bulk-sync.ts +++ b/src/hooks/bulk/after/after-bulk-sync.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterBulkSync(target: any, propertyName: string): void; export function AfterBulkSync(options: HookOptions): Function; diff --git a/src/hooks/bulk/after/after-bulk-update.ts b/src/hooks/bulk/after/after-bulk-update.ts index 932b86c1..ef86d40f 100644 --- a/src/hooks/bulk/after/after-bulk-update.ts +++ b/src/hooks/bulk/after/after-bulk-update.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterBulkUpdate(target: any, propertyName: string): void; export function AfterBulkUpdate(options: HookOptions): Function; diff --git a/src/hooks/bulk/before/before-bulk-create.ts b/src/hooks/bulk/before/before-bulk-create.ts index 2379827e..85353871 100644 --- a/src/hooks/bulk/before/before-bulk-create.ts +++ b/src/hooks/bulk/before/before-bulk-create.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeBulkCreate(target: any, propertyName: string): void; export function BeforeBulkCreate(options: HookOptions): Function; diff --git a/src/hooks/bulk/before/before-bulk-destroy.ts b/src/hooks/bulk/before/before-bulk-destroy.ts index 89cbdf0f..ce7a3bf5 100644 --- a/src/hooks/bulk/before/before-bulk-destroy.ts +++ b/src/hooks/bulk/before/before-bulk-destroy.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeBulkDestroy(target: any, propertyName: string): void; export function BeforeBulkDestroy(options: HookOptions): Function; diff --git a/src/hooks/bulk/before/before-bulk-restore.ts b/src/hooks/bulk/before/before-bulk-restore.ts index ac016cd1..4b9985dc 100644 --- a/src/hooks/bulk/before/before-bulk-restore.ts +++ b/src/hooks/bulk/before/before-bulk-restore.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeBulkRestore(target: any, propertyName: string): void; export function BeforeBulkRestore(options: HookOptions): Function; diff --git a/src/hooks/bulk/before/before-bulk-sync.ts b/src/hooks/bulk/before/before-bulk-sync.ts index 3fce16fa..0794d907 100644 --- a/src/hooks/bulk/before/before-bulk-sync.ts +++ b/src/hooks/bulk/before/before-bulk-sync.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeBulkSync(target: any, propertyName: string): void; export function BeforeBulkSync(options: HookOptions): Function; diff --git a/src/hooks/bulk/before/before-bulk-update.ts b/src/hooks/bulk/before/before-bulk-update.ts index 817b923c..e0ebd2ea 100644 --- a/src/hooks/bulk/before/before-bulk-update.ts +++ b/src/hooks/bulk/before/before-bulk-update.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeBulkUpdate(target: any, propertyName: string): void; export function BeforeBulkUpdate(options: HookOptions): Function; diff --git a/src/hooks/shared/hook-meta.ts b/src/hooks/shared/hook-meta.ts index 262199f2..ceb39641 100644 --- a/src/hooks/shared/hook-meta.ts +++ b/src/hooks/shared/hook-meta.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "./hook-options"; -import {SequelizeHooks} from "sequelize/types/lib/hooks"; +import { HookOptions } from './hook-options'; +import { SequelizeHooks } from 'sequelize/types/hooks'; export interface HookMeta { hookType: keyof SequelizeHooks; diff --git a/src/hooks/shared/hook-options.ts b/src/hooks/shared/hook-options.ts index 6072808a..770ea191 100644 --- a/src/hooks/shared/hook-options.ts +++ b/src/hooks/shared/hook-options.ts @@ -1,4 +1,3 @@ export interface HookOptions { - name?: string; } diff --git a/src/hooks/shared/hooks-service.ts b/src/hooks/shared/hooks-service.ts index 885d347d..8e817515 100644 --- a/src/hooks/shared/hooks-service.ts +++ b/src/hooks/shared/hooks-service.ts @@ -1,20 +1,20 @@ import 'reflect-metadata'; -import {HookMeta} from "./hook-meta"; -import {HookOptions} from "./hook-options"; -import {SequelizeHooks} from "sequelize/types/lib/hooks"; -import {Model} from "../../model/model/model"; +import { HookMeta } from './hook-meta'; +import { HookOptions } from './hook-options'; +import { SequelizeHooks } from 'sequelize/types/hooks'; +import { ModelCtor } from '../../model/model/model'; const HOOKS_KEY = 'sequelize:hooks'; /** * Installs hooks on the specified models */ -export function installHooks(models: Array): void { - models.forEach(model => { +export function installHooks(models: ModelCtor[]): void { + models.forEach((model) => { const hooks = getHooks(model); if (hooks) { - hooks.forEach(hook => { + hooks.forEach((hook) => { installHook(model, hook); }); } @@ -27,20 +27,20 @@ export function installHooks(models: Array): void { * factory function. When called with multiple arguments, they add the hook * to the model’s metadata. */ -export function implementHookDecorator(hookType: keyof SequelizeHooks, args: any[]): Function | void { +export function implementHookDecorator( + hookType: keyof SequelizeHooks, + args: any[] +): Function | void { if (args.length === 1) { + const options: HookOptions = args[0]; - const options: HookOptions = args[0]; + return (target: any, propertyName: string) => addHook(target, hookType, propertyName, options); + } else { + const target = args[0]; + const propertyName = args[1]; - return (target: any, propertyName: string) => - addHook(target, hookType, propertyName, options); - } else { - - const target = args[0]; - const propertyName = args[1]; - - addHook(target, hookType, propertyName); - } + addHook(target, hookType, propertyName); + } } /** @@ -48,16 +48,24 @@ export function implementHookDecorator(hookType: keyof SequelizeHooks, args: any * @throws if applied to a non-static method * @throws if the hook method name is reserved */ -export function addHook(target: any, hookType: keyof SequelizeHooks, methodName: string, options: HookOptions = {}): void { +export function addHook( + target: any, + hookType: keyof SequelizeHooks, + methodName: string, + options: HookOptions = {} +): void { if (typeof target !== 'function') { - throw new Error(`Hook method '${methodName}' is not a static method. ` + - `Only static methods can be used for hooks`); + throw new Error( + `Hook method '${methodName}' is not a static method. ` + + `Only static methods can be used for hooks` + ); } // make sure the hook name doesn’t conflict with Sequelize’s existing methods if (methodName === hookType) { - throw new Error(`Hook method cannot be named '${methodName}'. That name is ` + - `reserved by Sequelize`); + throw new Error( + `Hook method cannot be named '${methodName}'. That name is ` + `reserved by Sequelize` + ); } const hooks = getHooks(target) || []; @@ -65,7 +73,7 @@ export function addHook(target: any, hookType: keyof SequelizeHooks, methodName: hooks.push({ hookType, methodName, - options + options, }); setHooks(target, hooks); @@ -74,7 +82,7 @@ export function addHook(target: any, hookType: keyof SequelizeHooks, methodName: /** * Install a hook */ -function installHook(model: typeof Model, hook: HookMeta): void { +function installHook(model: ModelCtor, hook: HookMeta): void { if (hook.options && hook.options.name) { model.addHook(hook.hookType, hook.options.name, model[hook.methodName]); return; @@ -91,6 +99,8 @@ export function getHooks(target: any): HookMeta[] | undefined { if (hooks) { return [...hooks]; } + + return; } /** diff --git a/src/hooks/shared/validation-failed.ts b/src/hooks/shared/validation-failed.ts index 8bb1d7e6..ea782bf4 100644 --- a/src/hooks/shared/validation-failed.ts +++ b/src/hooks/shared/validation-failed.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "./hook-options"; -import {implementHookDecorator} from "./hooks-service"; +import { HookOptions } from './hook-options'; +import { implementHookDecorator } from './hooks-service'; export function ValidationFailed(target: any, propertyName: string): void; export function ValidationFailed(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-connect.ts b/src/hooks/single/after/after-connect.ts index 0e5c9879..88173439 100644 --- a/src/hooks/single/after/after-connect.ts +++ b/src/hooks/single/after/after-connect.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterConnect(target: any, propertyName: string): void; export function AfterConnect(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-create.ts b/src/hooks/single/after/after-create.ts index 777454ab..48757706 100644 --- a/src/hooks/single/after/after-create.ts +++ b/src/hooks/single/after/after-create.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterCreate(target: any, propertyName: string): void; export function AfterCreate(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-define.ts b/src/hooks/single/after/after-define.ts index 14cdb9f2..4ca20d40 100644 --- a/src/hooks/single/after/after-define.ts +++ b/src/hooks/single/after/after-define.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterDefine(target: any, propertyName: string): void; export function AfterDefine(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-destroy.ts b/src/hooks/single/after/after-destroy.ts index 11fe7ed5..c09c745a 100644 --- a/src/hooks/single/after/after-destroy.ts +++ b/src/hooks/single/after/after-destroy.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterDestroy(target: any, propertyName: string): void; export function AfterDestroy(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-find.ts b/src/hooks/single/after/after-find.ts index c18cd0d5..8fc29cd7 100644 --- a/src/hooks/single/after/after-find.ts +++ b/src/hooks/single/after/after-find.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterFind(target: any, propertyName: string): void; export function AfterFind(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-init.ts b/src/hooks/single/after/after-init.ts index bc9381c3..5e1f0864 100644 --- a/src/hooks/single/after/after-init.ts +++ b/src/hooks/single/after/after-init.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterInit(target: any, propertyName: string): void; export function AfterInit(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-restore.ts b/src/hooks/single/after/after-restore.ts index ae0b7dcd..e5ae197d 100644 --- a/src/hooks/single/after/after-restore.ts +++ b/src/hooks/single/after/after-restore.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterRestore(target: any, propertyName: string): void; export function AfterRestore(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-save.ts b/src/hooks/single/after/after-save.ts index 68e81094..8ccaacd3 100644 --- a/src/hooks/single/after/after-save.ts +++ b/src/hooks/single/after/after-save.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterSave(target: any, propertyName: string): void; export function AfterSave(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-sync.ts b/src/hooks/single/after/after-sync.ts index faeafa50..978baee8 100644 --- a/src/hooks/single/after/after-sync.ts +++ b/src/hooks/single/after/after-sync.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterSync(target: any, propertyName: string): void; export function AfterSync(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-update.ts b/src/hooks/single/after/after-update.ts index 69cac462..bed1a57e 100644 --- a/src/hooks/single/after/after-update.ts +++ b/src/hooks/single/after/after-update.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterUpdate(target: any, propertyName: string): void; export function AfterUpdate(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-upsert.ts b/src/hooks/single/after/after-upsert.ts index 2e2559a9..bc60ee4c 100644 --- a/src/hooks/single/after/after-upsert.ts +++ b/src/hooks/single/after/after-upsert.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterUpsert(target: any, propertyName: string): void; export function AfterUpsert(options: HookOptions): Function; diff --git a/src/hooks/single/after/after-validate.ts b/src/hooks/single/after/after-validate.ts index 01ac6fc2..7fa3bc3c 100644 --- a/src/hooks/single/after/after-validate.ts +++ b/src/hooks/single/after/after-validate.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function AfterValidate(target: any, propertyName: string): void; export function AfterValidate(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-connect.ts b/src/hooks/single/before/before-connect.ts index 462a00e4..9d29bffe 100644 --- a/src/hooks/single/before/before-connect.ts +++ b/src/hooks/single/before/before-connect.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeConnect(target: any, propertyName: string): void; export function BeforeConnect(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-count.ts b/src/hooks/single/before/before-count.ts index 5bca537f..16f28937 100644 --- a/src/hooks/single/before/before-count.ts +++ b/src/hooks/single/before/before-count.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeCount(target: any, propertyName: string): void; export function BeforeCount(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-create.ts b/src/hooks/single/before/before-create.ts index 66ae7f03..941a50fd 100644 --- a/src/hooks/single/before/before-create.ts +++ b/src/hooks/single/before/before-create.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeCreate(target: any, propertyName: string): void; export function BeforeCreate(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-define.ts b/src/hooks/single/before/before-define.ts index da04299f..4ed22873 100644 --- a/src/hooks/single/before/before-define.ts +++ b/src/hooks/single/before/before-define.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeDefine(target: any, propertyName: string): void; export function BeforeDefine(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-destroy.ts b/src/hooks/single/before/before-destroy.ts index a7ea653a..f49c1a2b 100644 --- a/src/hooks/single/before/before-destroy.ts +++ b/src/hooks/single/before/before-destroy.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeDestroy(target: any, propertyName: string): void; export function BeforeDestroy(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-find-after-expand-include-all.ts b/src/hooks/single/before/before-find-after-expand-include-all.ts index 714a959e..9906a403 100644 --- a/src/hooks/single/before/before-find-after-expand-include-all.ts +++ b/src/hooks/single/before/before-find-after-expand-include-all.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeFindAfterExpandIncludeAll(target: any, propertyName: string): void; export function BeforeFindAfterExpandIncludeAll(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-find-after-options.ts b/src/hooks/single/before/before-find-after-options.ts index cb3f8b29..4a87b8eb 100644 --- a/src/hooks/single/before/before-find-after-options.ts +++ b/src/hooks/single/before/before-find-after-options.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeFindAfterOptions(target: any, propertyName: string): void; export function BeforeFindAfterOptions(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-find.ts b/src/hooks/single/before/before-find.ts index 269c13d8..28202245 100644 --- a/src/hooks/single/before/before-find.ts +++ b/src/hooks/single/before/before-find.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeFind(target: any, propertyName: string): void; export function BeforeFind(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-init.ts b/src/hooks/single/before/before-init.ts index ff5d76e1..676254f0 100644 --- a/src/hooks/single/before/before-init.ts +++ b/src/hooks/single/before/before-init.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeInit(target: any, propertyName: string): void; export function BeforeInit(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-restore.ts b/src/hooks/single/before/before-restore.ts index d718c62d..e4aecb41 100644 --- a/src/hooks/single/before/before-restore.ts +++ b/src/hooks/single/before/before-restore.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeRestore(target: any, propertyName: string): void; export function BeforeRestore(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-save.ts b/src/hooks/single/before/before-save.ts index aed13f6b..c70f6f0f 100644 --- a/src/hooks/single/before/before-save.ts +++ b/src/hooks/single/before/before-save.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeSave(target: any, propertyName: string): void; export function BeforeSave(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-sync.ts b/src/hooks/single/before/before-sync.ts index 8832a874..e7b211f1 100644 --- a/src/hooks/single/before/before-sync.ts +++ b/src/hooks/single/before/before-sync.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeSync(target: any, propertyName: string): void; export function BeforeSync(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-update.ts b/src/hooks/single/before/before-update.ts index 34bc93df..fa9212c0 100644 --- a/src/hooks/single/before/before-update.ts +++ b/src/hooks/single/before/before-update.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeUpdate(target: any, propertyName: string): void; export function BeforeUpdate(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-upsert.ts b/src/hooks/single/before/before-upsert.ts index 0678a445..bb902844 100644 --- a/src/hooks/single/before/before-upsert.ts +++ b/src/hooks/single/before/before-upsert.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeUpsert(target: any, propertyName: string): void; export function BeforeUpsert(options: HookOptions): Function; diff --git a/src/hooks/single/before/before-validate.ts b/src/hooks/single/before/before-validate.ts index d2edc6cf..2004899c 100644 --- a/src/hooks/single/before/before-validate.ts +++ b/src/hooks/single/before/before-validate.ts @@ -1,5 +1,5 @@ -import {HookOptions} from "../../shared/hook-options"; -import {implementHookDecorator} from "../../shared/hooks-service"; +import { HookOptions } from '../../shared/hook-options'; +import { implementHookDecorator } from '../../shared/hooks-service'; export function BeforeValidate(target: any, propertyName: string): void; export function BeforeValidate(options: HookOptions): Function; diff --git a/src/index.ts b/src/index.ts index 0db7aca9..1cdbbc8c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -73,6 +73,9 @@ export * from './model/shared/model-class-getter'; export * from './model/shared/model-service'; export * from './model/table/table'; export * from './model/table/table-options'; +export * from './model/index/create-index-decorator'; +export * from './model/index/index-decorator'; +export * from './model/index/index-service'; export * from './scopes/default-scope'; export * from './scopes/scope-options'; diff --git a/src/model/column/attribute-service.ts b/src/model/column/attribute-service.ts index f4c2e2f4..d65ed39f 100644 --- a/src/model/column/attribute-service.ts +++ b/src/model/column/attribute-service.ts @@ -1,5 +1,5 @@ -import {deepAssign} from '../../shared/object'; -import {ModelAttributeColumnOptions} from "sequelize"; +import { deepAssign } from '../../shared/object'; +import { ModelAttributeColumnOptions } from 'sequelize'; const ATTRIBUTES_KEY = 'sequelize:attributes'; @@ -11,14 +11,11 @@ export function getAttributes(target: any): any | undefined { const attributes = Reflect.getMetadata(ATTRIBUTES_KEY, target); if (attributes) { + return Object.keys(attributes).reduce((copy, key) => { + copy[key] = { ...attributes[key] }; - return Object - .keys(attributes) - .reduce((copy, key) => { - copy[key] = {...attributes[key]}; - - return copy; - }, {}); + return copy; + }, {}); } } @@ -26,7 +23,7 @@ export function getAttributes(target: any): any | undefined { * Sets attributes */ export function setAttributes(target: any, attributes: any): void { - Reflect.defineMetadata(ATTRIBUTES_KEY, {...attributes}, target); + Reflect.defineMetadata(ATTRIBUTES_KEY, { ...attributes }, target); } /** @@ -34,15 +31,13 @@ export function setAttributes(target: any, attributes: any): void { * sequelize attribute options and stores this information * through reflect metadata */ -export function addAttribute(target: any, - name: string, - options: any): void { +export function addAttribute(target: any, name: string, options: any): void { let attributes = getAttributes(target); if (!attributes) { attributes = {}; } - attributes[name] = {...options}; + attributes[name] = { ...options }; setAttributes(target, attributes); } @@ -50,14 +45,18 @@ export function addAttribute(target: any, /** * Adds attribute options for specific attribute */ -export function addAttributeOptions(target: any, - propertyName: string, - options: Partial): void { +export function addAttributeOptions( + target: any, + propertyName: string, + options: Partial +): void { const attributes = getAttributes(target); if (!attributes || !attributes[propertyName]) { - throw new Error(`@Column annotation is missing for "${propertyName}" of class "${target.constructor.name}"` + - ` or annotation order is wrong.`); + throw new Error( + `@Column annotation is missing for "${propertyName}" of class "${target.constructor.name}"` + + ` or annotation order is wrong.` + ); } attributes[propertyName] = deepAssign(attributes[propertyName], options); diff --git a/src/model/column/column-options/allow-null.ts b/src/model/column/column-options/allow-null.ts index d694fe7f..f159ff71 100644 --- a/src/model/column/column-options/allow-null.ts +++ b/src/model/column/column-options/allow-null.ts @@ -1,4 +1,4 @@ -import {addAttributeOptions} from '../attribute-service'; +import { addAttributeOptions } from '../attribute-service'; /** * Sets allowNull true for annotated property column. @@ -6,20 +6,17 @@ import {addAttributeOptions} from '../attribute-service'; export function AllowNull(target: any, propertyName: string): void; export function AllowNull(allowNull: boolean): Function; export function AllowNull(...args: any[]): void | Function { - if (args.length === 1) { - const allowNull = args[0]; return (target: any, propertyName: string) => - addAttributeOptions(target, propertyName, {allowNull}); + addAttributeOptions(target, propertyName, { allowNull }); } else { - const target = args[0]; const propertyName = args[1]; addAttributeOptions(target, propertyName, { - allowNull: true + allowNull: true, }); } } diff --git a/src/model/column/column-options/comment.ts b/src/model/column/column-options/comment.ts index e49b6cc6..c94e01a0 100644 --- a/src/model/column/column-options/comment.ts +++ b/src/model/column/column-options/comment.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../attribute-service"; +import { addAttributeOptions } from '../attribute-service'; /** * Sets the specified comment value for the annotated field */ export function Comment(value: string): PropertyDecorator { - return (target: any, propertyName: string) => { addAttributeOptions(target, propertyName, { - comment: value + comment: value, }); }; } diff --git a/src/model/column/column-options/default.ts b/src/model/column/column-options/default.ts index 9acc0d5e..39747d91 100644 --- a/src/model/column/column-options/default.ts +++ b/src/model/column/column-options/default.ts @@ -1,14 +1,12 @@ -import {addAttributeOptions} from "../attribute-service"; +import { addAttributeOptions } from '../attribute-service'; /** * Sets the specified default value for the annotated field */ export function Default(value: any): Function { - return (target: any, propertyName: string) => { - addAttributeOptions(target, propertyName, { - defaultValue: value + defaultValue: value, }); }; } diff --git a/src/model/column/column-options/unique.ts b/src/model/column/column-options/unique.ts index b9c6705d..c593f155 100644 --- a/src/model/column/column-options/unique.ts +++ b/src/model/column/column-options/unique.ts @@ -1,4 +1,4 @@ -import {addAttributeOptions} from "../attribute-service"; +import { addAttributeOptions } from '../attribute-service'; type UniqueOptions = boolean | string | { name: string; msg: string }; diff --git a/src/model/column/column.ts b/src/model/column/column.ts index 3beb86c7..fc73638e 100644 --- a/src/model/column/column.ts +++ b/src/model/column/column.ts @@ -1,18 +1,20 @@ -import {ModelAttributeColumnOptions, DataType} from 'sequelize'; +import { ModelAttributeColumnOptions, DataType } from 'sequelize'; -import {addAttribute} from './attribute-service'; -import {isDataType} from "../../sequelize/data-type/data-type-service"; -import {getSequelizeTypeByDesignType} from "../shared/model-service"; +import { addAttribute } from './attribute-service'; +import { isDataType } from '../../sequelize/data-type/data-type-service'; +import { getSequelizeTypeByDesignType } from '../shared/model-service'; export function Column(dataType: DataType): Function; export function Column(options: Partial): Function; -export function Column(target: any, propertyName: string, propertyDescriptor?: PropertyDescriptor): void; +export function Column( + target: any, + propertyName: string, + propertyDescriptor?: PropertyDescriptor +): void; export function Column(...args: any[]): Function | void { - // In case of no specified options, we infer the // sequelize data type by the type of the property if (args.length >= 2) { - const target = args[0]; const propertyName = args[1]; const propertyDescriptor = args[2]; @@ -22,25 +24,29 @@ export function Column(...args: any[]): Function | void { } return (target: any, propertyName: string, propertyDescriptor?: PropertyDescriptor) => { - annotate(target, propertyName, propertyDescriptor, args[0]); + annotate( + target, + propertyName, + propertyDescriptor ?? Object.getOwnPropertyDescriptor(target, propertyName), + args[0] + ); }; } -function annotate(target: any, - propertyName: string, - propertyDescriptor?: PropertyDescriptor, - optionsOrDataType: Partial | DataType = {}): void { - +function annotate( + target: any, + propertyName: string, + propertyDescriptor?: PropertyDescriptor, + optionsOrDataType: Partial | DataType = {} +): void { let options: Partial; if (isDataType(optionsOrDataType)) { - options = { - type: optionsOrDataType + type: optionsOrDataType, }; } else { - - options = {...(optionsOrDataType as ModelAttributeColumnOptions)}; + options = { ...(optionsOrDataType as ModelAttributeColumnOptions) }; if (!options.type) { options.type = getSequelizeTypeByDesignType(target, propertyName); diff --git a/src/model/column/primary-key/auto-increment.ts b/src/model/column/primary-key/auto-increment.ts index 2d0f5984..2fd61f74 100644 --- a/src/model/column/primary-key/auto-increment.ts +++ b/src/model/column/primary-key/auto-increment.ts @@ -1,11 +1,10 @@ -import {addAttributeOptions} from '../attribute-service'; +import { addAttributeOptions } from '../attribute-service'; /** * Sets auto increment true for annotated field */ export function AutoIncrement(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { - autoIncrement: true + autoIncrement: true, }); } diff --git a/src/model/column/primary-key/primary-key.ts b/src/model/column/primary-key/primary-key.ts index b066f536..be4d80a6 100644 --- a/src/model/column/primary-key/primary-key.ts +++ b/src/model/column/primary-key/primary-key.ts @@ -1,11 +1,10 @@ -import {addAttributeOptions} from '../attribute-service'; +import { addAttributeOptions } from '../attribute-service'; /** * Sets primary key option true for annotated property. */ export function PrimaryKey(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { - primaryKey: true + primaryKey: true, }); } diff --git a/src/model/column/timestamps/created-at.ts b/src/model/column/timestamps/created-at.ts index 9709c0f2..3ec42f62 100644 --- a/src/model/column/timestamps/created-at.ts +++ b/src/model/column/timestamps/created-at.ts @@ -1,9 +1,8 @@ -import {addOptions} from '../../shared/model-service'; +import { addOptions } from '../../shared/model-service'; export function CreatedAt(target: any, propertyName: string): void { - addOptions(target, { createdAt: propertyName, - timestamps: true + timestamps: true, }); } diff --git a/src/model/column/timestamps/deleted-at.ts b/src/model/column/timestamps/deleted-at.ts index c2ca83d4..6fc47dbf 100644 --- a/src/model/column/timestamps/deleted-at.ts +++ b/src/model/column/timestamps/deleted-at.ts @@ -1,10 +1,9 @@ -import {addOptions} from '../../shared/model-service'; +import { addOptions } from '../../shared/model-service'; export function DeletedAt(target: any, propertyName: string): void { - addOptions(target, { deletedAt: propertyName, timestamps: true, - paranoid: true + paranoid: true, }); } diff --git a/src/model/column/timestamps/updated-at.ts b/src/model/column/timestamps/updated-at.ts index 43d2bc63..9d17820c 100644 --- a/src/model/column/timestamps/updated-at.ts +++ b/src/model/column/timestamps/updated-at.ts @@ -1,9 +1,8 @@ -import {addOptions} from '../../shared/model-service'; +import { addOptions } from '../../shared/model-service'; export function UpdatedAt(target: any, propertyName: string): void { - addOptions(target, { updatedAt: propertyName, - timestamps: true + timestamps: true, }); } diff --git a/src/model/index/create-index-decorator.ts b/src/model/index/create-index-decorator.ts new file mode 100644 index 00000000..cff1a337 --- /dev/null +++ b/src/model/index/create-index-decorator.ts @@ -0,0 +1,24 @@ +import { addFieldToIndex, IndexOptions, IndexFieldOptions } from './index-service'; + +interface IndexDecorator { + (fieldOptions: Pick>): Function; + (target: any, propertyName: string, propertyDescriptor?: PropertyDescriptor): void; +} + +export function createIndexDecorator(options: IndexOptions = {}): IndexDecorator { + let indexId: string | number; + return ((...args: any[]) => { + if (args.length >= 2) { + const [target, propertyName] = args; + + const fieldOptions = { name: propertyName }; + indexId = addFieldToIndex(target, fieldOptions, options, indexId); + return; + } + + return (target: any, propertyName: string) => { + const fieldOptions = { name: propertyName, ...args[0] }; + indexId = addFieldToIndex(target, fieldOptions, options, indexId); + }; + }) as IndexDecorator; +} diff --git a/src/model/index/index-decorator.ts b/src/model/index/index-decorator.ts new file mode 100644 index 00000000..1709b363 --- /dev/null +++ b/src/model/index/index-decorator.ts @@ -0,0 +1,49 @@ +import { addFieldToIndex, IndexOptions, IndexFieldOptions } from './index-service'; + +type IndexDecoratorOptions = IndexOptions & + Pick>; + +export function Index(name: string): Function; +export function Index(options: IndexDecoratorOptions): Function; +export function Index( + target: any, + propertyName: string, + propertyDescriptor?: PropertyDescriptor +): void; +export function Index(...args: any[]): Function | void { + if (args.length >= 2) { + const [target, propertyName] = args; + + annotateModelWithIndex(target, propertyName); + return; + } + + return (target: any, propertyName: string) => { + annotateModelWithIndex(target, propertyName, args[0]); + }; +} + +export function annotateModelWithIndex( + target: any, + propertyName: string, + optionsOrName: IndexDecoratorOptions | string = {}, + indexId?: string | number +): string | number { + let indexOptions: IndexOptions; + let fieldOptions: IndexFieldOptions; + if (typeof optionsOrName === 'string') { + indexOptions = { name: optionsOrName }; + fieldOptions = { name: propertyName }; + } else { + const { length, order, collate, ...rest } = optionsOrName; + indexOptions = rest; + fieldOptions = { + name: propertyName, + length, + order, + collate, + }; + } + + return addFieldToIndex(target, fieldOptions, indexOptions, indexId); +} diff --git a/src/model/index/index-service.ts b/src/model/index/index-service.ts new file mode 100644 index 00000000..ea09a282 --- /dev/null +++ b/src/model/index/index-service.ts @@ -0,0 +1,65 @@ +import 'reflect-metadata'; +import { IndexesOptions as SequelizeIndexOptions } from 'sequelize'; + +const INDEXES_KEY = 'sequelize:indexes'; + +// https://github.com/sequelize/sequelize/blob/beeff96f/types/lib/query-interface.d.ts#L169 +export interface IndexFieldOptions { + name: string; + length?: number; + order?: 'ASC' | 'DESC'; + collate?: string; +} + +export interface IndexesMeta { + named: { [name: string]: IndexOptions }; + unnamed: IndexOptions[]; +} + +export type IndexOptions = Pick< + SequelizeIndexOptions, + Exclude +>; + +/** + * Returns model indexes from class by restoring this + * information from reflect metadata + */ +export function getIndexes(target: any): IndexesMeta { + const { named = {}, unnamed = [] }: IndexesMeta = Reflect.getMetadata(INDEXES_KEY, target) || {}; + + return { named: { ...named }, unnamed: [...unnamed] }; +} + +/** + * Sets indexes + */ +export function setIndexes(target: any, indexes: IndexesMeta): void { + Reflect.defineMetadata(INDEXES_KEY, indexes, target); +} + +/** + * Adds field to index by sequelize index and index field options, + * and stores this information through reflect metadata. Returns index ID. + */ +export function addFieldToIndex( + target: any, + fieldOptions: IndexFieldOptions, + indexOptions: IndexOptions, + indexId?: string | number +): string | number { + const indexes = getIndexes(target); + + const chosenId = + typeof indexId !== 'undefined' ? indexId : indexOptions.name || indexes.unnamed.length; + const indexStore = typeof chosenId === 'string' ? indexes.named : indexes.unnamed; + if (!indexStore[chosenId]) indexStore[chosenId] = { ...indexOptions }; + + const index = indexStore[chosenId]; + if (!index.fields) index.fields = []; + index.fields.push(fieldOptions); + + setIndexes(target, indexes); + + return chosenId; +} diff --git a/src/model/model/association/association-action-options.ts b/src/model/model/association/association-action-options.ts index 2639d9c4..d899fca7 100644 --- a/src/model/model/association/association-action-options.ts +++ b/src/model/model/association/association-action-options.ts @@ -1,4 +1,3 @@ - export interface AssociationActionOptions { through?: any; transaction?: any; diff --git a/src/model/model/association/association-count-options.ts b/src/model/model/association/association-count-options.ts index 8a633875..46336b83 100644 --- a/src/model/model/association/association-count-options.ts +++ b/src/model/model/association/association-count-options.ts @@ -1,4 +1,4 @@ -import {FindOptions} from "sequelize"; +import { FindOptions } from 'sequelize'; export type AssociationCountOptions = { scope?: string | boolean; diff --git a/src/model/model/association/association-create-options.ts b/src/model/model/association/association-create-options.ts index ef51b4a8..e175bb42 100644 --- a/src/model/model/association/association-create-options.ts +++ b/src/model/model/association/association-create-options.ts @@ -1,4 +1,4 @@ -import {CreateOptions} from "sequelize"; +import { CreateOptions } from 'sequelize'; export type AssociationCreateOptions = { through?: any; diff --git a/src/model/model/association/association-get-options.ts b/src/model/model/association/association-get-options.ts index 83911d1c..e924c3bb 100644 --- a/src/model/model/association/association-get-options.ts +++ b/src/model/model/association/association-get-options.ts @@ -1,4 +1,4 @@ -import {FindOptions} from "sequelize"; +import { FindOptions } from 'sequelize'; export type AssociationGetOptions = { scope?: string | boolean; diff --git a/src/model/model/model.ts b/src/model/model/model.ts index bcf23695..561d6ed0 100644 --- a/src/model/model/model.ts +++ b/src/model/model/model.ts @@ -1,18 +1,34 @@ -import {InitOptions, Model as OriginModel, ModelAttributes, FindOptions, BuildOptions, Promise} from 'sequelize'; -import {capitalize} from '../../shared/string'; -import {inferAlias} from '../../associations/alias-inference/alias-inference-service'; -import {ModelNotInitializedError} from '../shared/model-not-initialized-error'; -import {getAllPropertyNames} from '../../shared/object'; -import {AssociationGetOptions} from "./association/association-get-options"; -import {AssociationCountOptions} from "./association/association-count-options"; -import {AssociationActionOptions} from "./association/association-action-options"; -import {AssociationCreateOptions} from "./association/association-create-options"; - -export type ModelType = typeof Model; -export type ModelCtor = (new () => M) & ModelType; - -export abstract class Model extends OriginModel { - +import { + InitOptions, + Model as OriginModel, + ModelAttributes, + FindOptions, + BuildOptions, + Utils, +} from 'sequelize'; +import { capitalize } from '../../shared/string'; +import { inferAlias } from '../../associations/alias-inference/alias-inference-service'; +import { ModelNotInitializedError } from '../shared/model-not-initialized-error'; +import { getAllPropertyNames } from '../../shared/object'; +import { AssociationGetOptions } from './association/association-get-options'; +import { AssociationCountOptions } from './association/association-count-options'; +import { AssociationActionOptions } from './association/association-action-options'; +import { AssociationCreateOptions } from './association/association-create-options'; +import { Repository } from '../../sequelize/repository/repository'; + +export type ModelType = new ( + values?: TCreationAttributes, + options?: any +) => Model; +export type ModelCtor = Repository; +export type ModelStatic = { new (): M }; + +export type $GetType = NonNullable extends any[] ? NonNullable : NonNullable | null; + +export abstract class Model< + TModelAttributes extends {} = any, + TCreationAttributes extends {} = TModelAttributes +> extends OriginModel { // TODO Consider moving the following props to OriginModel id?: number | any; createdAt?: Date | any; @@ -22,18 +38,20 @@ export abstract class Model extends OriginModel { static isInitialized = false; - static init(attributes: ModelAttributes, options: InitOptions): void { + public static initialize, M extends InstanceType>( + attributes: ModelAttributes, + options: InitOptions + ): MS { this.isInitialized = true; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - return super.init(attributes, options); + return super.init(attributes, options); } - constructor(values?: object, options?: BuildOptions) { + constructor(values?: Utils.MakeNullishOptional, options?: BuildOptions) { if (!new.target.isInitialized) { - throw new ModelNotInitializedError( - new.target, - `${new.target.name} cannot be instantiated.` - ); + throw new ModelNotInitializedError(new.target, `${new.target.name} cannot be instantiated.`); } super(values, inferAlias(options, new.target)); } @@ -41,7 +59,11 @@ export abstract class Model extends OriginModel { /** * Adds relation between specified instances and source instance */ - $add>(propertyKey: string, instances: R | R[] | string[] | string | number[] | number, options?: AssociationActionOptions): Promise { + $add( + propertyKey: string, + instances: R | R[] | string[] | string | number[] | number, + options?: AssociationActionOptions + ): Promise { return this['add' + capitalize(propertyKey)](instances, options); } @@ -49,49 +71,67 @@ export abstract class Model extends OriginModel { * Sets relation between specified instances and source instance * (replaces old relations) */ - $set>(propertyKey: keyof this, instances: R | R[] | string[] | string | number[] | number, options?: AssociationActionOptions): Promise { + $set( + propertyKey: keyof this, + instances: R | R[] | string[] | string | number[] | number | null, + options?: AssociationActionOptions + ): Promise { return this['set' + capitalize(propertyKey as string)](instances, options); } /** * Returns related instance (specified by propertyKey) of source instance */ - $get>(propertyKey: keyof this, options?: AssociationGetOptions): Promise { + $get( + propertyKey: K, + options?: AssociationGetOptions + ): Promise<$GetType> { return this['get' + capitalize(propertyKey as string)](options); } /** * Counts related instances (specified by propertyKey) of source instance */ - $count>(propertyKey: string, options?: AssociationCountOptions): Promise { + $count(propertyKey: string, options?: AssociationCountOptions): Promise { return this['count' + capitalize(propertyKey)](options); } /** * Creates instances and relate them to source instance */ - $create>(propertyKey: string, values: any, options?: AssociationCreateOptions): Promise { + $create( + propertyKey: string, + values: any, + options?: AssociationCreateOptions + ): Promise { return this['create' + capitalize(propertyKey)](values, options); } /** * Checks if specified instances is related to source instance */ - $has>(propertyKey: string, instances: R | R[] | string[] | string | number[] | number, options?: AssociationGetOptions): Promise { + $has( + propertyKey: string, + instances: R | R[] | string[] | string | number[] | number, + options?: AssociationGetOptions + ): Promise { return this['has' + capitalize(propertyKey)](instances, options); } /** * Removes specified instances from source instance */ - $remove>(propertyKey: string, instances: R | R[] | string[] | string | number[] | number, options?: any): Promise { + $remove( + propertyKey: string, + instances: R | R[] | string[] | string | number[] | number, + options?: any + ): Promise { return this['remove' + capitalize(propertyKey)](instances, options); } reload(options?: FindOptions): Promise { return super.reload(inferAlias(options, this)); } - } /** @@ -120,32 +160,41 @@ export const INFER_ALIAS_MAP = { reload: 0, }; -const staticModelFunctionProperties = getAllPropertyNames(OriginModel) - .filter(key => - !isForbiddenMember(key) && - isFunctionMember(key, OriginModel) && - !isPrivateMember(key) - ); +const staticModelFunctionProperties = getAllPropertyNames(OriginModel).filter( + (key) => !isForbiddenMember(key) && isFunctionMember(key, OriginModel) && !isPrivateMember(key) +); function isFunctionMember(propertyKey: string, target: any): boolean { return typeof target[propertyKey] === 'function'; } function isForbiddenMember(propertyKey: string): boolean { - const FORBIDDEN_KEYS = ['name', 'constructor', 'length', 'prototype', 'caller', 'arguments', 'apply', - 'QueryInterface', 'QueryGenerator', 'init', 'replaceHookAliases', 'refreshAttributes', 'inspect']; + const FORBIDDEN_KEYS = [ + 'name', + 'constructor', + 'length', + 'prototype', + 'caller', + 'arguments', + 'apply', + 'queryInterface', + 'queryGenerator', + 'init', + 'replaceHookAliases', + 'refreshAttributes', + 'inspect', + ]; return FORBIDDEN_KEYS.indexOf(propertyKey) !== -1; } function isPrivateMember(propertyKey: string): boolean { - return (propertyKey.charAt(0) === '_'); + return propertyKey.charAt(0) === '_'; } function addThrowNotInitializedProxy(): void { - staticModelFunctionProperties - .forEach(key => { + staticModelFunctionProperties.forEach((key) => { const superFn = Model[key]; - Model[key] = function(this: typeof Model, ...args: any[]): any { + Model[key] = function (this: typeof Model, ...args: any[]): any { if (!this.isInitialized) { throw new ModelNotInitializedError(this, `Member "${key}" cannot be called.`); } @@ -155,16 +204,14 @@ function addThrowNotInitializedProxy(): void { } function addInferAliasOverrides(): void { - Object - .keys(INFER_ALIAS_MAP) - .forEach(key => { - const optionIndex = INFER_ALIAS_MAP[key]; - const superFn = Model[key]; - Model[key] = function(this: typeof Model, ...args: any[]): any { - args[optionIndex] = inferAlias(args[optionIndex], this); - return superFn.call(this, ...args); - }; - }); + Object.keys(INFER_ALIAS_MAP).forEach((key) => { + const optionIndex = INFER_ALIAS_MAP[key]; + const superFn = Model[key]; + Model[key] = function (this: typeof Model, ...args: any[]): any { + args[optionIndex] = inferAlias(args[optionIndex], this); + return superFn.call(this, ...args); + }; + }); } addThrowNotInitializedProxy(); diff --git a/src/model/shared/model-class-getter.ts b/src/model/shared/model-class-getter.ts index 29200d8b..2147a058 100644 --- a/src/model/shared/model-class-getter.ts +++ b/src/model/shared/model-class-getter.ts @@ -1,3 +1,5 @@ -import {Model} from "../model/model"; +import { ModelType } from '../model/model'; -export type ModelClassGetter = (returns?: void) => typeof Model; +export type ModelClassGetter = ( + returns?: void +) => ModelType; diff --git a/src/model/shared/model-not-initialized-error.ts b/src/model/shared/model-not-initialized-error.ts index cdafb201..1254f66a 100644 --- a/src/model/shared/model-not-initialized-error.ts +++ b/src/model/shared/model-not-initialized-error.ts @@ -1,12 +1,12 @@ -import {Model} from "../model/model"; +import { Model } from '../model/model'; export class ModelNotInitializedError extends Error { - message: string; constructor(modelClass: typeof Model, additionalMessage: string) { super(); - this.message = `Model not initialized: ${additionalMessage} "${modelClass.name}" ` + + this.message = + `Model not initialized: ${additionalMessage} "${modelClass.name}" ` + `needs to be added to a Sequelize instance.`; } } diff --git a/src/model/shared/model-service.ts b/src/model/shared/model-service.ts index 2e32b9d4..a7f383b2 100644 --- a/src/model/shared/model-service.ts +++ b/src/model/shared/model-service.ts @@ -1,7 +1,7 @@ -import {DataTypeAbstract, ModelOptions} from 'sequelize'; +import { DataTypeAbstract, ModelOptions } from 'sequelize'; -import {Model} from '../model/model'; -import {inferDataType} from "../../sequelize/data-type/data-type-service"; +import { Model } from '../model/model'; +import { inferDataType } from '../../sequelize/data-type/data-type-service'; const MODEL_NAME_KEY = 'sequelize:modelName'; const OPTIONS_KEY = 'sequelize:options'; @@ -30,7 +30,7 @@ export function getOptions(target: any): ModelOptions | undefined { const options = Reflect.getMetadata(OPTIONS_KEY, target); if (options) { - return {...options}; + return { ...options }; } } @@ -38,7 +38,7 @@ export function getOptions(target: any): ModelOptions | undefined { * Sets seuqlize define options to class prototype */ export function setOptions(target: any, options: ModelOptions): void { - Reflect.defineMetadata(OPTIONS_KEY, {...options}, target); + Reflect.defineMetadata(OPTIONS_KEY, { ...options }, target); } /** @@ -50,10 +50,14 @@ export function addOptions(target: any, options: ModelOptions): void { if (!_options) { _options = {}; } - setOptions(target, {..._options, ...options, validate: { - ...(_options.validate || {}), - ...(options.validate || {}), - }}); + setOptions(target, { + ..._options, + ...options, + validate: { + ...(_options.validate || {}), + ...(options.validate || {}), + }, + }); } /** @@ -80,14 +84,13 @@ export function getSequelizeTypeByDesignType(target: any, propertyName: string): * So that {model: () => Person} will be converted to * {model: Person} */ -export function resolveModelGetter(options: any) { - const maybeModelGetter = value => typeof value === 'function' && value.length === 0; - const isModel = value => value && value.prototype && value.prototype instanceof Model; - const isOptionObjectOrArray = value => value && typeof value === 'object'; - - return Object - .keys(options) - .reduce((acc, key) => { +export function resolveModelGetter(options: any): any { + const maybeModelGetter = (value) => typeof value === 'function' && value.length === 0; + const isModel = (value) => value && value.prototype && value.prototype instanceof Model; + const isOptionObjectOrArray = (value) => value && typeof value === 'object'; + + return Object.keys(options).reduce( + (acc, key) => { const value = options[key]; if (maybeModelGetter(value)) { @@ -101,6 +104,7 @@ export function resolveModelGetter(options: any) { } return acc; - }, Array.isArray(options) ? [...options] : {...options}); + }, + Array.isArray(options) ? [...options] : { ...options } + ); } - diff --git a/src/model/table/table-options.ts b/src/model/table/table-options.ts index e1023ed1..431febde 100644 --- a/src/model/table/table-options.ts +++ b/src/model/table/table-options.ts @@ -1,6 +1,6 @@ -import {ModelOptions} from "sequelize"; +import { Model, ModelOptions } from 'sequelize'; -export interface TableOptions extends ModelOptions { +export interface TableOptions extends ModelOptions { modelName?: string; /** diff --git a/src/model/table/table.ts b/src/model/table/table.ts index a5ca0c07..98e37986 100644 --- a/src/model/table/table.ts +++ b/src/model/table/table.ts @@ -1,15 +1,14 @@ -import {TableOptions} from "./table-options"; -import {Model} from "../model/model"; -import {setModelName, addOptions} from "../shared/model-service"; +import { TableOptions } from './table-options'; +import { Model } from '../model/model'; +import { setModelName, addOptions } from '../shared/model-service'; -export function Table(options: TableOptions): Function; +export function Table(options: TableOptions): Function; export function Table(target: Function): void; export function Table(arg: any): void | Function { - if (typeof arg === 'function') { annotate(arg); } else { - const options: TableOptions = {...arg}; + const options: TableOptions = { ...arg }; return (target: any) => annotate(target, options); } } diff --git a/src/scopes/default-scope.ts b/src/scopes/default-scope.ts index 19186570..fb29287d 100644 --- a/src/scopes/default-scope.ts +++ b/src/scopes/default-scope.ts @@ -1,6 +1,6 @@ -import {addScopeOptions, addScopeOptionsGetter} from "./scope-service"; -import {ScopeFindOptions} from "./scope-find-options"; -import {DefaultScopeGetter} from "./scope-options"; +import { addScopeOptions, addScopeOptionsGetter } from './scope-service'; +import { ScopeFindOptions } from './scope-find-options'; +import { DefaultScopeGetter } from './scope-options'; /** * Decorator for defining default Model scope @@ -11,17 +11,21 @@ export function DefaultScope(scopeGetter: DefaultScopeGetter): Function; * Decorator for defining default Model scope * @deprecated */ -export function DefaultScope(scope: ScopeFindOptions): Function; +export function DefaultScope( + scope: ScopeFindOptions +): Function; /** * Decorator for defining default Model scope */ -export function DefaultScope(scopeOrSsopeGetter: ScopeFindOptions | DefaultScopeGetter): Function { +export function DefaultScope( + scopeOrSsopeGetter: ScopeFindOptions | DefaultScopeGetter +): Function { return (target: any) => { if (typeof scopeOrSsopeGetter === 'function') { - addScopeOptionsGetter(target.prototype, {getDefaultScope: scopeOrSsopeGetter}); + addScopeOptionsGetter(target.prototype, { getDefaultScope: scopeOrSsopeGetter }); } else { - addScopeOptions(target.prototype, {defaultScope: scopeOrSsopeGetter}); + addScopeOptions(target.prototype, { defaultScope: scopeOrSsopeGetter }); } }; } diff --git a/src/scopes/scope-find-options.ts b/src/scopes/scope-find-options.ts index 4902a9d0..5ee9799c 100644 --- a/src/scopes/scope-find-options.ts +++ b/src/scopes/scope-find-options.ts @@ -1,16 +1,20 @@ -import {Association, FindOptions, IncludeOptions} from "sequelize"; -import {ModelClassGetter} from "../model/shared/model-class-getter"; +import { Association, FindOptions, IncludeOptions } from 'sequelize'; +import { ModelClassGetter } from '../model/shared/model-class-getter'; -export type ScopeIncludeOptions = { +export type ScopeIncludeOptions = { [K in keyof IncludeOptions]: K extends 'model' - ? ModelClassGetter - : (K extends 'include' - ? ScopeIncludeOptions - : IncludeOptions[K]) + ? ModelClassGetter + : K extends 'include' + ? ScopeIncludeOptions + : IncludeOptions[K]; }; -export type ScopeFindOptions = { +export type ScopeFindOptions = { [K in keyof FindOptions]: K extends 'include' - ? ModelClassGetter[] | Association[] | ScopeIncludeOptions[] | { all: true } - : FindOptions[K] + ? + | ModelClassGetter[] + | Association[] + | ScopeIncludeOptions[] + | { all: true } + : FindOptions[K]; }; diff --git a/src/scopes/scope-options.ts b/src/scopes/scope-options.ts index 962cdee4..5f77a461 100644 --- a/src/scopes/scope-options.ts +++ b/src/scopes/scope-options.ts @@ -1,9 +1,10 @@ -import {ScopeTableOptions} from './scope-table-options'; -import {ScopeFindOptions} from "./scope-find-options"; -import {FindOptions} from "sequelize"; +import { ScopeTableOptions } from './scope-table-options'; +import { ScopeFindOptions } from './scope-find-options'; +import { FindOptions } from 'sequelize'; -export interface ScopeOptions extends ScopeTableOptions { - defaultScope?: ScopeFindOptions; +export interface ScopeOptions + extends ScopeTableOptions { + defaultScope?: ScopeFindOptions; } export interface ScopeOptionsGetters { @@ -12,5 +13,5 @@ export interface ScopeOptionsGetters { } export type DefaultScopeGetter = () => FindOptions; -export type ScopesOptionsGetter = () => ({[sopeName: string]: ScopesOptions}); +export type ScopesOptionsGetter = () => { [sopeName: string]: ScopesOptions }; export type ScopesOptions = FindOptions | ((...args: any[]) => FindOptions); diff --git a/src/scopes/scope-service.ts b/src/scopes/scope-service.ts index 1ba87a47..16d76b05 100644 --- a/src/scopes/scope-service.ts +++ b/src/scopes/scope-service.ts @@ -1,11 +1,11 @@ -import {FindOptions} from "sequelize"; +import { FindOptions } from 'sequelize'; -import {Model} from "../model/model/model"; -import {deepAssign} from "../shared/object"; -import {ScopeOptions, ScopeOptionsGetters, ScopesOptions} from "./scope-options"; -import {resolveModelGetter} from '../model/shared/model-service'; -import {inferAlias} from '../associations/alias-inference/alias-inference-service'; -import {ScopeFindOptions} from "./scope-find-options"; +import { ModelCtor } from '../model/model/model'; +import { deepAssign } from '../shared/object'; +import { ScopeOptions, ScopeOptionsGetters, ScopesOptions } from './scope-options'; +import { resolveModelGetter } from '../model/shared/model-service'; +import { inferAlias } from '../associations/alias-inference/alias-inference-service'; +import { ScopeFindOptions } from './scope-find-options'; const SCOPES_KEY = 'sequelize:scopes'; const SCOPES_OPTIONS_KEY = 'sequelize:scopes-options'; @@ -13,64 +13,63 @@ const SCOPES_OPTIONS_KEY = 'sequelize:scopes-options'; /** * Resolves scopes and adds them to the specified models */ -export function resolveScopes(models: Array): void { - models.forEach(model => { +export function resolveScopes(models: ModelCtor[]): void { + models.forEach((model) => { resolvesDeprecatedScopes(model); - const {getDefaultScope, getScopes} = getScopeOptionsGetters(model.prototype); + const { getDefaultScope, getScopes } = getScopeOptionsGetters(model.prototype); let options = {}; if (getDefaultScope) { - options = {...options, defaultScope: getDefaultScope()}; + options = { ...options, defaultScope: getDefaultScope() }; } if (getScopes) { - options = {...options, ...getScopes()}; + options = { ...options, ...getScopes() }; } - Object - .keys(options) - .forEach(key => resolveScope(key, model, options[key])); + Object.keys(options).forEach((key) => resolveScope(key, model, options[key])); }); } -export const resolveScope = (scopeName: string, model: typeof Model, options: ScopesOptions) => { +export const resolveScope = (scopeName: string, model: ModelCtor, options: ScopesOptions): void => { if (typeof options === 'function') { const fn = options; options = (...args: any[]) => inferAlias(fn(...args), model); } else { options = inferAlias(options, model); } - model.addScope(scopeName, options as FindOptions, {override: true}); + model.addScope(scopeName, options as FindOptions, { override: true }); }; -export const addScopeOptionsGetter = (target: any, options: ScopeOptionsGetters) => { +export const addScopeOptionsGetter = (target: any, options: ScopeOptionsGetters): void => { const currentOptions = getScopeOptionsGetters(target) || {}; - setScopeOptionsGetters(target, {...currentOptions, ...options}); + setScopeOptionsGetters(target, { ...currentOptions, ...options }); }; export const getScopeOptionsGetters = (target: any): ScopeOptionsGetters => { const options = Reflect.getMetadata(SCOPES_OPTIONS_KEY, target); if (options) { - return {...options}; + return { ...options }; } return {}; }; -export const setScopeOptionsGetters = (target: any, options: ScopeOptionsGetters) => { +export const setScopeOptionsGetters = (target: any, options: ScopeOptionsGetters): void => { Reflect.defineMetadata(SCOPES_OPTIONS_KEY, options, target); }; /** * @deprecated */ -export const resolvesDeprecatedScopes = (model: typeof Model) => { +export const resolvesDeprecatedScopes = (model: ModelCtor): void => { const options = getScopeOptions(model.prototype) || {}; - Object - .keys(options) - .forEach(key => resolveDeprecatedScope(key, model, options[key])); + Object.keys(options).forEach((key) => resolveDeprecatedScope(key, model, options[key])); }; /** * Adds scope option meta data for specified prototype * @deprecated */ -export function addScopeOptions(target: any, options: ScopeOptions): void { +export function addScopeOptions( + target: any, + options: ScopeOptions +): void { const _options = getScopeOptions(target) || {}; setScopeOptions(target, deepAssign({}, _options, options)); } @@ -79,7 +78,9 @@ export function addScopeOptions(target: any, options: ScopeOptions): void { * Returns scope option meta data from specified target * @deprecated */ -export function getScopeOptions(target: any): ScopeOptions | undefined { +export function getScopeOptions( + target: any +): ScopeOptions | undefined { const options = Reflect.getMetadata(SCOPES_KEY, target); if (options) { return deepAssign({}, options); @@ -89,20 +90,27 @@ export function getScopeOptions(target: any): ScopeOptions | undefined { /** * @deprecated */ -function resolveDeprecatedScope(scopeName: string, model: typeof Model, options: ScopeFindOptions | Function | undefined): void { +function resolveDeprecatedScope( + scopeName: string, + model: ModelCtor, + options: ScopeFindOptions | Function | undefined +): void { if (typeof options === 'function') { const fn: Function = options; options = (...args: any[]) => inferAlias(fn(...args), model); } else { options = inferAlias(resolveModelGetter(options), model); } - model.addScope(scopeName, options as FindOptions, {override: true}); + model.addScope(scopeName, options as FindOptions, { override: true }); } /** * Set scope option meta data for specified prototype * @deprecated */ -function setScopeOptions(target: any, options: ScopeOptions): void { +function setScopeOptions( + target: any, + options: ScopeOptions +): void { Reflect.defineMetadata(SCOPES_KEY, options, target); } diff --git a/src/scopes/scope-table-options.ts b/src/scopes/scope-table-options.ts index 052a220b..116b9028 100644 --- a/src/scopes/scope-table-options.ts +++ b/src/scopes/scope-table-options.ts @@ -1,5 +1,8 @@ -import {ScopeFindOptions} from "./scope-find-options"; +import { ScopeFindOptions } from './scope-find-options'; -export interface ScopeTableOptions { - [scopeName: string]: ScopeFindOptions | Function | undefined; +export interface ScopeTableOptions { + [scopeName: string]: + | ScopeFindOptions + | Function + | undefined; } diff --git a/src/scopes/scopes.ts b/src/scopes/scopes.ts index 6cff170b..c853093d 100644 --- a/src/scopes/scopes.ts +++ b/src/scopes/scopes.ts @@ -1,6 +1,6 @@ -import {addScopeOptions, addScopeOptionsGetter} from "./scope-service"; -import {ScopeTableOptions} from "./scope-table-options"; -import {ScopesOptionsGetter} from "./scope-options"; +import { addScopeOptions, addScopeOptionsGetter } from './scope-service'; +import { ScopeTableOptions } from './scope-table-options'; +import { ScopesOptionsGetter } from './scope-options'; /** * Decorator for defining Model scopes @@ -11,12 +11,18 @@ export function Scopes(scopesGetter: ScopesOptionsGetter): Function; * Decorator for defining Model scopes * @deprecated */ -export function Scopes(scopes: ScopeTableOptions): Function; +export function Scopes( + scopes: ScopeTableOptions +): Function; /** * Decorator for defining Model scopes */ -export function Scopes(scopesOrScopesGetter: ScopeTableOptions | ScopesOptionsGetter): Function { +export function Scopes( + scopesOrScopesGetter: + | ScopeTableOptions + | ScopesOptionsGetter +): Function { return (target: any) => { if (typeof scopesOrScopesGetter === 'function') { addScopeOptionsGetter(target.prototype, { diff --git a/src/sequelize/data-type/data-type-service.ts b/src/sequelize/data-type/data-type-service.ts index 00a2190c..e0cc998b 100644 --- a/src/sequelize/data-type/data-type-service.ts +++ b/src/sequelize/data-type/data-type-service.ts @@ -1,23 +1,25 @@ -import {DataType, DataTypeAbstract, DataTypes} from 'sequelize'; +import { DataType, DataTypeAbstract, DataTypes } from 'sequelize'; /* * Checks if specified value is a sequelize data type (ABSTRACT, STRING...) */ export function isDataType(value: any): value is DataType { - - return typeof value === 'string' || + return ( + typeof value === 'string' || (typeof value === 'function' && value({}) instanceof (DataTypes.ABSTRACT as any)) || - value instanceof (DataTypes.ABSTRACT as any); + value instanceof (DataTypes.ABSTRACT as any) + ); } /** * Infers sequelize data type by design type */ export function inferDataType(designType: any): DataTypeAbstract | undefined { - switch (designType) { case String: return DataTypes.STRING; + case BigInt: + return DataTypes.BIGINT; case Number: return DataTypes.INTEGER; case Boolean: diff --git a/src/sequelize/repository/repository.ts b/src/sequelize/repository/repository.ts index 08ff7fdb..398232c5 100644 --- a/src/sequelize/repository/repository.ts +++ b/src/sequelize/repository/repository.ts @@ -1,4 +1,4 @@ -import {NonAbstract} from "../../shared/types"; -import {Model} from "../.."; +import { NonAbstract } from '../../shared/types'; +import { Model } from '../..'; export type Repository = (new () => M) & NonAbstract; diff --git a/src/sequelize/sequelize/sequelize-options.ts b/src/sequelize/sequelize/sequelize-options.ts index 8e90e017..9bd6b98c 100644 --- a/src/sequelize/sequelize/sequelize-options.ts +++ b/src/sequelize/sequelize/sequelize-options.ts @@ -1,10 +1,9 @@ -import {Options} from "sequelize"; -import {ModelCtor} from "../../model/model/model"; +import { Options } from 'sequelize'; +import { ModelCtor } from '../../model/model/model'; export type ModelMatch = (filename: string, member: string) => boolean; export interface SequelizeOptions extends Options { - /** * Path to models or actual models, * which should be loaded for sequelize instance @@ -28,7 +27,6 @@ export interface SequelizeOptions extends Options { */ repositoryMode?: boolean; - /** * If true enables validate only mode */ diff --git a/src/sequelize/sequelize/sequelize-service.ts b/src/sequelize/sequelize/sequelize-service.ts index ee25bc65..8f01f5f0 100644 --- a/src/sequelize/sequelize/sequelize-service.ts +++ b/src/sequelize/sequelize/sequelize-service.ts @@ -1,8 +1,8 @@ -import {basename, extname, join, parse} from "path"; -import * as glob from "glob"; -import {uniqueFilter} from "../../shared/array"; -import {ModelMatch, SequelizeOptions} from "./sequelize-options"; -import {ModelCtor} from "../../model/model/model"; +import { basename, extname, join, parse } from 'path'; +import * as glob from 'glob'; +import { uniqueFilter } from '../../shared/array'; +import { ModelMatch, SequelizeOptions } from './sequelize-options'; +import { ModelCtor } from '../../model/model/model'; /** * Prepares sequelize config passed to original sequelize constructor @@ -11,58 +11,54 @@ export function prepareOptions(options: SequelizeOptions): SequelizeOptions { if (options.validateOnly) { return getValidationOnlyOptions(options); } - return {...options as SequelizeOptions}; + return { ...(options as SequelizeOptions) }; } -export function prepareArgs(...args: any[]) { +export function prepareArgs(...args: any[]): { preparedArgs: any[]; options?: SequelizeOptions } { const lastArg = args[args.length - 1]; - const options = lastArg && typeof lastArg === 'object' - ? prepareOptions(lastArg) : undefined; + const options = lastArg && typeof lastArg === 'object' ? prepareOptions(lastArg) : undefined; if (options) { args[args.length - 1] = options; } - return {preparedArgs: args, options}; + return { preparedArgs: args, options }; } function getValidationOnlyOptions(options: SequelizeOptions): SequelizeOptions { return { ...options, dialect: 'sqlite', - dialectModulePath: __dirname + '/../validation-only/db-dialect-dummy' + dialectModulePath: __dirname + '/../validation-only/db-dialect-dummy', }; } /** * Determines models from value */ -export function getModels( - arg: Array, - modelMatch: ModelMatch, -): ModelCtor[] { - const hasSupportedExtension = path => ['.ts', '.js'].indexOf(extname(path)) !== -1; +export function getModels(arg: (ModelCtor | string)[], modelMatch: ModelMatch): ModelCtor[] { + const hasSupportedExtension = (path) => ['.ts', '.js'].indexOf(extname(path)) !== -1; if (arg && typeof arg[0] === 'string') { - return arg.reduce((models: any[], dir) => { - if (!glob.hasMagic(dir) && !hasSupportedExtension(dir)) dir = join(dir as string, '/*'); const _models = glob .sync(dir as string) .filter(isImportable) .map(getFullfilepathWithoutExtension) .filter(uniqueFilter) - .map(fullPath => { - + .map((fullPath) => { + // eslint-disable-next-line @typescript-eslint/no-var-requires const module = require(fullPath); const fileName = basename(fullPath); - const matchedMemberKey = Object.keys(module).find(m => modelMatch(fileName, m)); + const matchedMemberKey = Object.keys(module).find((m) => modelMatch(fileName, m)); const matchedMember = matchedMemberKey ? module[matchedMemberKey] : undefined; if (!matchedMember && !module.default) { - throw new Error(`No default export defined for file "${fileName}" or ` + - `export does not satisfy filename.`); + throw new Error( + `No default export defined for file "${fileName}" or ` + + `export does not satisfy filename.` + ); } return matchedMember || module.default; }); @@ -70,8 +66,7 @@ export function getModels( models.push(..._models); return models; - }, []) - ; + }, []); } return arg as ModelCtor[]; diff --git a/src/sequelize/sequelize/sequelize.ts b/src/sequelize/sequelize/sequelize.ts index 8d474148..3dbadb5d 100644 --- a/src/sequelize/sequelize/sequelize.ts +++ b/src/sequelize/sequelize/sequelize.ts @@ -1,17 +1,17 @@ -import {InitOptions, Sequelize as OriginSequelize} from 'sequelize'; -import {ModelNotInitializedError} from "../../model/shared/model-not-initialized-error"; -import {ModelMatch, SequelizeOptions} from "./sequelize-options"; -import {getModels, prepareArgs} from "./sequelize-service"; -import {Model, ModelCtor} from "../../model/model/model"; -import {getModelName, getOptions} from "../../model/shared/model-service"; -import {resolveScopes} from "../../scopes/scope-service"; -import {installHooks} from "../../hooks/shared/hooks-service"; -import {getAssociations} from "../../associations/shared/association-service"; -import {getAttributes} from "../../model/column/attribute-service"; -import {Repository} from "../.."; +import { InitOptions, Sequelize as OriginSequelize } from 'sequelize'; +import { ModelNotInitializedError } from '../../model/shared/model-not-initialized-error'; +import { ModelMatch, SequelizeOptions } from './sequelize-options'; +import { getModels, prepareArgs } from './sequelize-service'; +import { Model, ModelCtor, ModelType } from '../../model/model/model'; +import { getModelName, getOptions } from '../../model/shared/model-service'; +import { resolveScopes } from '../../scopes/scope-service'; +import { installHooks } from '../../hooks/shared/hooks-service'; +import { getAssociations } from '../../associations/shared/association-service'; +import { getAttributes } from '../../model/column/attribute-service'; +import { getIndexes } from '../../model/index/index-service'; +import { Repository } from '../..'; export class Sequelize extends OriginSequelize { - options: SequelizeOptions; repositoryMode: boolean; @@ -20,7 +20,7 @@ export class Sequelize extends OriginSequelize { constructor(options?: SequelizeOptions); constructor(uri: string, options?: SequelizeOptions); constructor(...args: any[]) { - const {preparedArgs, options} = prepareArgs(...args); + const { preparedArgs, options } = prepareArgs(...args); super(...preparedArgs); if (options) { @@ -32,18 +32,20 @@ export class Sequelize extends OriginSequelize { } } - model(model: string | typeof Model): ModelCtor { + model( + model: string | ModelType + ): ModelCtor { if (typeof model !== 'string') { return super.model(getModelName(model.prototype)) as ModelCtor; } return super.model(model) as ModelCtor; } - addModels(models: ModelCtor[]); - addModels(modelPaths: string[]); - addModels(modelPaths: string[], modelMatch?: ModelMatch); - addModels(arg: Array); - addModels(arg: Array, modelMatch?: ModelMatch) { + addModels(models: ModelCtor[]): void; + addModels(modelPaths: string[]): void; + addModels(modelPaths: string[], modelMatch?: ModelMatch): void; + addModels(arg: (ModelCtor | string)[]): void; + addModels(arg: (ModelCtor | string)[], modelMatch?: ModelMatch): void { const defaultModelMatch = (filename, member) => filename === member; const models = getModels(arg, modelMatch || this.options.modelMatch || defaultModelMatch); @@ -53,18 +55,17 @@ export class Sequelize extends OriginSequelize { installHooks(definedModels); } - getRepository(modelClass: (new() => M)): Repository { + getRepository(modelClass: new () => M): Repository { return this.model(modelClass as any) as Repository; } private associateModels(models: ModelCtor[]): void { - - models.forEach(model => { + models.forEach((model) => { const associations = getAssociations(model.prototype); if (!associations) return; - associations.forEach(association => { + associations.forEach((association) => { const options = association.getSequelizeOptions(model, this); const associatedClass = this.model(association.getAssociatedClass()); @@ -80,32 +81,33 @@ export class Sequelize extends OriginSequelize { } private defineModels(models: ModelCtor[]): ModelCtor[] { - - return models.map(model => { + return models.map((model) => { const modelName = getModelName(model.prototype); const attributes = getAttributes(model.prototype); + const indexes = getIndexes(model.prototype); const modelOptions = getOptions(model.prototype); - if (!modelOptions) throw new Error(`@Table annotation is missing on class "${model['name']}"`); + if (!modelOptions) + throw new Error(`@Table annotation is missing on class "${model['name']}"`); + const indexArray = Object.keys(indexes.named) + .map((key) => indexes.named[key]) + .concat(indexes.unnamed); const initOptions: InitOptions & { modelName } = { + ...(indexArray.length > 0 && { indexes: indexArray }), ...modelOptions, modelName, sequelize: this, }; - const definedModel = this.repositoryMode - ? this.createRepositoryModel(model) - : model; + const definedModel = this.repositoryMode ? this.createRepositoryModel(model) : model; - definedModel.init(attributes, initOptions); + definedModel.initialize(attributes, initOptions); return definedModel; }); } private createRepositoryModel(modelClass: ModelCtor): ModelCtor { - return class extends modelClass { - }; + return class extends modelClass {}; } - } diff --git a/src/sequelize/validation-only/db-dialect-dummy.ts b/src/sequelize/validation-only/db-dialect-dummy.ts index ce5f1128..7b9a65b1 100644 --- a/src/sequelize/validation-only/db-dialect-dummy.ts +++ b/src/sequelize/validation-only/db-dialect-dummy.ts @@ -5,6 +5,5 @@ */ export function verbose(): any { - return {}; } diff --git a/src/shared/array.ts b/src/shared/array.ts index 16d9b187..82e676ea 100644 --- a/src/shared/array.ts +++ b/src/shared/array.ts @@ -2,11 +2,11 @@ * Removes duplicates from specified array */ export function unique(arr: T[]): T[] { - return arr.filter(uniqueFilter); } /** * Returns true for items, that only exists once on an array */ -export const uniqueFilter = (item, index, arr) => arr.indexOf(item) === index; +export const uniqueFilter = (item: T, index: number, arr: T[]): boolean => + arr.indexOf(item) === index; diff --git a/src/shared/object.ts b/src/shared/object.ts index 1acf223e..768fd8b5 100644 --- a/src/shared/object.ts +++ b/src/shared/object.ts @@ -3,24 +3,24 @@ * The last source overrides all properties of the previous * ones, if they have the same names */ -export function deepAssign(target: T, source1: S1, source2: S2, source3: S3): T & S1 & S2 & S3; +export function deepAssign( + target: T, + source1: S1, + source2: S2, + source3: S3 +): T & S1 & S2 & S3; export function deepAssign(target: T, source1: S1, source2: S2): T & S1 & S2; export function deepAssign(target: T, source: S): T & S; export function deepAssign(target: {}, source: S): S; export function deepAssign(target: any, ...sources: any[]): any { - - sources.forEach(source => { - - Object - .getOwnPropertyNames(source) - .forEach(key => assign(key, target, source)) - ; + sources.forEach((source) => { + Object.getOwnPropertyNames(source).forEach( + (key) => + !['__proto__', 'constructor', 'prototype'].includes(key) && assign(key, target, source) + ); /* istanbul ignore next */ if (Object.getOwnPropertySymbols) { - Object - .getOwnPropertySymbols(source) - .forEach(key => assign(key, target, source)) - ; + Object.getOwnPropertySymbols(source).forEach((key) => assign(key, target, source)); } }); return target; @@ -70,35 +70,36 @@ export function deepAssign(target: any, ...sources: any[]): any { */ export function cloneRegExp(input: RegExp, injectFlags?: string): RegExp { const pattern = input.source; - let flags = ""; + let flags = ''; // Make sure the parameter is a defined string - it will make the conditional // logic easier to read. - injectFlags = (injectFlags || ""); + injectFlags = injectFlags || ''; // Test for global. - if (input.global || (/g/i).test(injectFlags)) { - flags += "g"; + if (input.global || /g/i.test(injectFlags)) { + flags += 'g'; } // Test for ignoreCase. - if (input.ignoreCase || (/i/i).test(injectFlags)) { - flags += "i"; + if (input.ignoreCase || /i/i.test(injectFlags)) { + flags += 'i'; } // Test for multiline. - if (input.multiline || (/m/i).test(injectFlags)) { - flags += "m"; + if (input.multiline || /m/i.test(injectFlags)) { + flags += 'm'; } // Return a clone with the additive flags. - return (new RegExp(pattern, flags)); + return new RegExp(pattern, flags); } export function getAllPropertyNames(obj: any): string[] { const names: string[] = []; const exists: { [name: string]: boolean | undefined } = {}; do { + // eslint-disable-next-line prefer-spread names.push.apply(names, Object.getOwnPropertyNames(obj)); obj = Object.getPrototypeOf(obj); } while (obj !== Object.prototype); - return names.filter(name => { + return names.filter((name) => { const isValid = !exists[name] && name !== 'constructor'; exists[name] = true; return isValid; diff --git a/src/shared/string.ts b/src/shared/string.ts index 240c8602..08d57908 100644 --- a/src/shared/string.ts +++ b/src/shared/string.ts @@ -2,6 +2,5 @@ * Capitalize specified string value */ export function capitalize(value: string): string { - return value.charAt(0).toUpperCase() + value.substr(1, value.length); } diff --git a/src/shared/types.ts b/src/shared/types.ts index d084266f..996fdc2d 100644 --- a/src/shared/types.ts +++ b/src/shared/types.ts @@ -1,10 +1,11 @@ -export type Diff = - ({[P in T]: P} & {[P in U]: never} & { [x: string]: never })[T]; +export type Diff = ({ + [P in T]: P; +} & { [P in U]: never } & { [x: string]: never })[T]; -export type Omit = {[P in Diff]: T[P]}; +export type Omit = { [P in Diff]: T[P] }; -export type RecursivePartial = {[P in keyof T]?: RecursivePartial}; +export type RecursivePartial = { [P in keyof T]?: RecursivePartial }; -export type NonAbstract = {[P in keyof T]: T[P]}; +export type NonAbstract = { [P in keyof T]: T[P] }; -export type Constructor = (new (...args: any[]) => T); +export type Constructor = new (...args: any[]) => T; diff --git a/src/validation/contains.ts b/src/validation/contains.ts index d62a9b36..5432e550 100644 --- a/src/validation/contains.ts +++ b/src/validation/contains.ts @@ -1,15 +1,13 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Force specific substrings */ -export function Contains(value: string | {msg: string, args: string}): Function { - +export function Contains(value: string | { msg: string; args: string }): Function { return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - contains: value - } + contains: value, + }, }); } - diff --git a/src/validation/equals.ts b/src/validation/equals.ts index 5c4f0172..7c956bbe 100644 --- a/src/validation/equals.ts +++ b/src/validation/equals.ts @@ -1,14 +1,13 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Only allow a specific value */ -export function Equals(value: string | {msg: string, args: string}): Function { - +export function Equals(value: string | { msg: string; args: string }): Function { return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - equals: value - } + equals: value, + }, }); } diff --git a/src/validation/is-after.ts b/src/validation/is-after.ts index 07542d49..57718635 100644 --- a/src/validation/is-after.ts +++ b/src/validation/is-after.ts @@ -1,14 +1,13 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Only allow date strings after a specific date */ export function IsAfter(date: string): Function { - return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - isAfter: date - } + isAfter: date, + }, }); } diff --git a/src/validation/is-alpha.ts b/src/validation/is-alpha.ts index 82283b10..9f26d8dd 100644 --- a/src/validation/is-alpha.ts +++ b/src/validation/is-alpha.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Will only allow letters */ export function IsAlpha(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isAlpha: true - } + isAlpha: true, + }, }); } diff --git a/src/validation/is-alphanumeric.ts b/src/validation/is-alphanumeric.ts index daa2368f..d0996220 100644 --- a/src/validation/is-alphanumeric.ts +++ b/src/validation/is-alphanumeric.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Will only allow alphanumeric characters, so "_abc" will fail */ export function IsAlphanumeric(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isAlphanumeric: true - } + isAlphanumeric: true, + }, }); } diff --git a/src/validation/is-array.ts b/src/validation/is-array.ts index a71ebf5a..80945e06 100644 --- a/src/validation/is-array.ts +++ b/src/validation/is-array.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Will only allow arrays */ export function IsArray(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isArray: true - } + isArray: true, + }, }); } diff --git a/src/validation/is-before.ts b/src/validation/is-before.ts index 4e05e4e1..6e432366 100644 --- a/src/validation/is-before.ts +++ b/src/validation/is-before.ts @@ -1,14 +1,13 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Only allow date strings before a specific date */ export function IsBefore(date: string): Function { - return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - isBefore: date - } + isBefore: date, + }, }); } diff --git a/src/validation/is-credit-card.ts b/src/validation/is-credit-card.ts index e19f637a..16b893c1 100644 --- a/src/validation/is-credit-card.ts +++ b/src/validation/is-credit-card.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Check for valid credit card numbers */ export function IsCreditCard(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isCreditCard: true - } + isCreditCard: true, + }, }); } diff --git a/src/validation/is-date.ts b/src/validation/is-date.ts index 0fd489ed..e3a3b1bb 100644 --- a/src/validation/is-date.ts +++ b/src/validation/is-date.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Only allow date strings */ export function IsDate(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isDate: true - } + isDate: true, + }, }); } diff --git a/src/validation/is-decimal.ts b/src/validation/is-decimal.ts index 018775c4..fb8cebb2 100644 --- a/src/validation/is-decimal.ts +++ b/src/validation/is-decimal.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for any numbers */ export function IsDecimal(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isDecimal: true - } + isDecimal: true, + }, }); } diff --git a/src/validation/is-email.ts b/src/validation/is-email.ts index 7c73b2ba..04363d7c 100644 --- a/src/validation/is-email.ts +++ b/src/validation/is-email.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for email format (foo@bar.com) */ export function IsEmail(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isEmail: true - } + isEmail: true, + }, }); } diff --git a/src/validation/is-float.ts b/src/validation/is-float.ts index 2556f49a..10cee1a7 100644 --- a/src/validation/is-float.ts +++ b/src/validation/is-float.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for valid floating point numbers */ export function IsFloat(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isFloat: true - } + isFloat: true, + }, }); } diff --git a/src/validation/is-in.ts b/src/validation/is-in.ts index 4031fab8..218cb06e 100644 --- a/src/validation/is-in.ts +++ b/src/validation/is-in.ts @@ -1,14 +1,13 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Check the value is one of these */ -export function IsIn(arg: string[][] | { msg: string, args: string[][] }): Function { - +export function IsIn(arg: any[][] | { msg: string; args: any[][] }): Function { return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - isIn: arg - } + isIn: arg, + }, }); } diff --git a/src/validation/is-int.ts b/src/validation/is-int.ts index 0052fb1b..3b291a6c 100644 --- a/src/validation/is-int.ts +++ b/src/validation/is-int.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for valid integers */ export function IsInt(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isInt: true - } + isInt: true, + }, }); } diff --git a/src/validation/is-ip-v4.ts b/src/validation/is-ip-v4.ts index aae1edb3..ad14f129 100644 --- a/src/validation/is-ip-v4.ts +++ b/src/validation/is-ip-v4.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for IPv4 (129.89.23.1) */ export function IsIPv4(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isIPv4: true - } + isIPv4: true, + }, }); } diff --git a/src/validation/is-ip-v6.ts b/src/validation/is-ip-v6.ts index 8d2a2a80..6695504b 100644 --- a/src/validation/is-ip-v6.ts +++ b/src/validation/is-ip-v6.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for IPv6 format */ export function IsIPv6(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isIPv6: true - } + isIPv6: true, + }, }); } diff --git a/src/validation/is-ip.ts b/src/validation/is-ip.ts index 0dea7f33..18f015f5 100644 --- a/src/validation/is-ip.ts +++ b/src/validation/is-ip.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for IPv4 (129.89.23.1) or IPv6 format */ export function IsIP(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isIP: true - } + isIP: true, + }, }); } diff --git a/src/validation/is-lowercase.ts b/src/validation/is-lowercase.ts index 61a90b9a..d7c0a0aa 100644 --- a/src/validation/is-lowercase.ts +++ b/src/validation/is-lowercase.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for lowercase */ export function IsLowercase(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isLowercase: true - } + isLowercase: true, + }, }); } diff --git a/src/validation/is-null.ts b/src/validation/is-null.ts index b637bb79..12bfe584 100644 --- a/src/validation/is-null.ts +++ b/src/validation/is-null.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Only allows null */ export function IsNull(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isNull: true - } + isNull: true, + }, }); } diff --git a/src/validation/is-numeric.ts b/src/validation/is-numeric.ts index 3eddfc3f..c73b40e5 100644 --- a/src/validation/is-numeric.ts +++ b/src/validation/is-numeric.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Will only allow numbers */ export function IsNumeric(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isNumeric: true - } + isNumeric: true, + }, }); } diff --git a/src/validation/is-uppercase.ts b/src/validation/is-uppercase.ts index 97ad1f3f..e5d4a870 100644 --- a/src/validation/is-uppercase.ts +++ b/src/validation/is-uppercase.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for uppercase */ export function IsUppercase(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isUppercase: true - } + isUppercase: true, + }, }); } diff --git a/src/validation/is-url.ts b/src/validation/is-url.ts index 9c0ff547..8e47f7f7 100644 --- a/src/validation/is-url.ts +++ b/src/validation/is-url.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Checks for url format (http://foo.com) */ export function IsUrl(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - isUrl: true - } + isUrl: true, + }, }); } diff --git a/src/validation/is-uuid.ts b/src/validation/is-uuid.ts index 42bf7730..a4ff76ef 100644 --- a/src/validation/is-uuid.ts +++ b/src/validation/is-uuid.ts @@ -1,16 +1,15 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /* * Only allow uuids. * Version's regular expressions: * https://github.com/chriso/validator.js/blob/b59133b1727b6af355b403a9a97a19226cceb34b/lib/isUUID.js#L14-L19. */ -export function IsUUID(version: 3 | 4 | 5 | "3" | "4" | "5" | "all"): Function { - +export function IsUUID(version: 3 | 4 | 5 | '3' | '4' | '5' | 'all'): Function { return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - isUUID: version as any - } + isUUID: version as any, + }, }); } diff --git a/src/validation/is.ts b/src/validation/is.ts index 620ca0d0..15f1c39c 100644 --- a/src/validation/is.ts +++ b/src/validation/is.ts @@ -1,6 +1,6 @@ -import {ModelValidateOptions} from 'sequelize'; +import { ModelValidateOptions } from 'sequelize'; -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Adds custom validator @@ -16,9 +16,14 @@ export function Is(validator: (value: any) => any): Function; /** * Will only allow values, that match the string regex or real regex */ -export function Is(arg: string | Array | RegExp | {msg: string, args: string | Array | RegExp}): Function; +export function Is( + arg: + | string + | (string | RegExp)[] + | RegExp + | { msg: string; args: string | (string | RegExp)[] | RegExp } +): Function; export function Is(...args: any[]): Function { - const options: ModelValidateOptions = {}; const argIsFunction = typeof args[0] === 'function'; @@ -27,13 +32,11 @@ export function Is(...args: any[]): Function { let name: string; if (argIsFunction) { - - validator = (args[0] as (value: any) => any); + validator = args[0] as (value: any) => any; name = validator.name; if (!name) throw new Error(`Passed validator function must have a name`); } else { - name = args[0]; validator = args[1]; } @@ -45,6 +48,6 @@ export function Is(...args: any[]): Function { return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { - validate: options + validate: options, }); } diff --git a/src/validation/length.ts b/src/validation/length.ts index 0d380ae4..63f31385 100644 --- a/src/validation/length.ts +++ b/src/validation/length.ts @@ -1,18 +1,18 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Only allow values with length between min and max */ -export function Length({msg, min, max}: {msg?: string; min?: number; max?: number}): Function { - - let options: [number, number] | {msg: string, args: [number, number]}; +export function Length({ msg, min, max }: { msg?: string; min?: number; max?: number }): Function { const length = [min || 0, max] as [number, number]; - options = msg ? {args: length, msg: msg as string} : length; + const options: [number, number] | { msg: string; args: [number, number] } = msg + ? { args: length, msg: msg as string } + : length; return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - len: options - } + len: options, + }, }); } diff --git a/src/validation/max.ts b/src/validation/max.ts index 74116598..fcda10dc 100644 --- a/src/validation/max.ts +++ b/src/validation/max.ts @@ -1,14 +1,13 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Only allow values <= limit */ export function Max(limit: number): Function { - return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - max: limit - } + max: limit, + }, }); } diff --git a/src/validation/min.ts b/src/validation/min.ts index af2bba25..ec98a1ac 100644 --- a/src/validation/min.ts +++ b/src/validation/min.ts @@ -1,14 +1,13 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Only allow values >= limit */ export function Min(limit: number): Function { - return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - min: limit - } + min: limit, + }, }); } diff --git a/src/validation/not-contains.ts b/src/validation/not-contains.ts index e974119b..383b5b24 100644 --- a/src/validation/not-contains.ts +++ b/src/validation/not-contains.ts @@ -1,14 +1,13 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Don't allow specific substrings */ -export function NotContains(value: string | {msg: string, args: string}): Function { - +export function NotContains(value: string | { msg: string; args: string }): Function { return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - notContains: value - } + notContains: value, + }, }); } diff --git a/src/validation/not-empty.ts b/src/validation/not-empty.ts index 6af2cf32..60a71c59 100644 --- a/src/validation/not-empty.ts +++ b/src/validation/not-empty.ts @@ -1,4 +1,4 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Don't allow empty strings @@ -6,26 +6,23 @@ import {addAttributeOptions} from "../model/column/attribute-service"; export function NotEmpty(target: any, propertyName: string): void; export function NotEmpty(options: { msg: string }): Function; export function NotEmpty(...args: any[]): void | Function { - if (args.length === 1) { - const options = args[0]; return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { notEmpty: options, - } + }, }); } else { - const target = args[0]; const propertyName = args[1]; addAttributeOptions(target, propertyName, { validate: { - notEmpty: true - } + notEmpty: true, + }, }); } } diff --git a/src/validation/not-in.ts b/src/validation/not-in.ts index 556b1ca9..b8c20fed 100644 --- a/src/validation/not-in.ts +++ b/src/validation/not-in.ts @@ -1,14 +1,13 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Check the value is not one of these */ -export function NotIn(arg: string[][] | { msg: string, args: string[][] }): Function { - +export function NotIn(arg: any[][] | { msg: string; args: any[][] }): Function { return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - notIn: arg - } + notIn: arg, + }, }); } diff --git a/src/validation/not-null.ts b/src/validation/not-null.ts index 1718cc38..0ee02beb 100644 --- a/src/validation/not-null.ts +++ b/src/validation/not-null.ts @@ -1,13 +1,12 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Won't allow null */ export function NotNull(target: any, propertyName: string): void { - addAttributeOptions(target, propertyName, { validate: { - notNull: true - } + notNull: true, + }, }); } diff --git a/src/validation/not.ts b/src/validation/not.ts index af51a41b..4bbe4741 100644 --- a/src/validation/not.ts +++ b/src/validation/not.ts @@ -1,15 +1,19 @@ -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Will not allow values, that match the string regex or real regex */ -export function Not(arg: string | Array | RegExp | - {msg: string, args: string | Array | RegExp}): Function { - +export function Not( + arg: + | string + | (string | RegExp)[] + | RegExp + | { msg: string; args: string | (string | RegExp)[] | RegExp } +): Function { return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { validate: { - not: arg - } + not: arg, + }, }); } diff --git a/src/validation/validate.ts b/src/validation/validate.ts index 93143087..76122ee9 100644 --- a/src/validation/validate.ts +++ b/src/validation/validate.ts @@ -1,16 +1,15 @@ -import {ModelValidateOptions} from 'sequelize'; +import { ModelValidateOptions } from 'sequelize'; -import {addAttributeOptions} from "../model/column/attribute-service"; +import { addAttributeOptions } from '../model/column/attribute-service'; /** * Sets validation options for annotated field */ export function Validate(options: ModelValidateOptions): Function { - - options = {...options}; + options = { ...options }; return (target: any, propertyName: string) => addAttributeOptions(target, propertyName, { - validate: options + validate: options, }); } diff --git a/src/validation/validator.ts b/src/validation/validator.ts index 2d7932f1..9c57c1c3 100644 --- a/src/validation/validator.ts +++ b/src/validation/validator.ts @@ -1,11 +1,13 @@ -import {addOptions} from "../model/shared/model-service"; +import { addOptions } from '../model/shared/model-service'; -export const Validator: MethodDecorator = (target: Object, - propertyName: string, - descriptor: TypedPropertyDescriptor) => { +export const Validator: MethodDecorator = ( + target: Object, + propertyName: string, + descriptor: TypedPropertyDescriptor +) => { addOptions(target, { validate: { - [propertyName]: descriptor.value - } + [propertyName]: descriptor.value, + }, }); }; diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index de7dfb53..00000000 --- a/test/mocha.opts +++ /dev/null @@ -1,5 +0,0 @@ ---require test/tsconfig.mocha.js ---require source-map-support/register ---recursive - -test/**/*.spec.ts diff --git a/test/models/Book.ts b/test/models/Book.ts index 99da0bb0..6b17b49d 100644 --- a/test/models/Book.ts +++ b/test/models/Book.ts @@ -1,9 +1,8 @@ -import {Table, Model, Column, HasMany} from "../../src"; -import {Page} from "./Page"; +import { Table, Model, Column, HasMany } from '../../src'; +import { Page } from './Page'; @Table -export class Book extends Model { - +export class Book extends Model { @Column title: string; diff --git a/test/models/Box.ts b/test/models/Box.ts index 229f0a0e..e96ac20f 100644 --- a/test/models/Box.ts +++ b/test/models/Box.ts @@ -1,8 +1,7 @@ -import {Table, Model, Column} from "../../src"; +import { Table, Model, Column } from '../../src'; @Table -export class Box extends Model { - +export class Box extends Model { @Column length: number; diff --git a/test/models/Hook.ts b/test/models/Hook.ts index bcb428ce..03c3a82d 100644 --- a/test/models/Hook.ts +++ b/test/models/Hook.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ +/* eslint-disable @typescript-eslint/no-unused-vars */ import { AfterBulkSync, AfterBulkCreate, @@ -37,283 +39,218 @@ import { Column, Model, Table, - ValidationFailed -} from "../../src"; + ValidationFailed, +} from '../../src'; /** * Model used to test hook decorators. Defined hooks are mocked out for testing. */ @Table -export class Hook extends Model { - +export class Hook extends Model { @Column name: string; @BeforeValidate - static beforeValidateHook(instance: Hook, options: any): void { - } + static beforeValidateHook(instance: Hook, options: any): void {} @AfterValidate - static afterValidateHook(instance: Hook, options: any): void { - } + static afterValidateHook(instance: Hook, options: any): void {} @ValidationFailed - static validationFailedHook(instance: Hook, options: any, err: any): void { - } + static validationFailedHook(instance: Hook, options: any, err: any): void {} @BeforeCreate - static beforeCreateHook(instance: Hook, options: any): void { - } + static beforeCreateHook(instance: Hook, options: any): void {} @AfterCreate - static afterCreateHook(instance: Hook, options: any): void { - } + static afterCreateHook(instance: Hook, options: any): void {} @BeforeDestroy - static beforeDestroyHook(instance: Hook, options: any): void { - } + static beforeDestroyHook(instance: Hook, options: any): void {} @AfterDestroy - static afterDestroyHook(instance: Hook, options: any): void { - } + static afterDestroyHook(instance: Hook, options: any): void {} @BeforeRestore - static beforeRestoreHook(instance: Hook, options: any): void { - } + static beforeRestoreHook(instance: Hook, options: any): void {} @AfterRestore - static afterRestoreHook(instance: Hook, options: any): void { - } + static afterRestoreHook(instance: Hook, options: any): void {} @BeforeUpdate - static beforeUpdateHook(instance: Hook, options: any): void { - } + static beforeUpdateHook(instance: Hook, options: any): void {} @AfterUpdate - static afterUpdateHook(instance: Hook, options: any): void { - } + static afterUpdateHook(instance: Hook, options: any): void {} // NOTE: this hook only available in Sequelize v4 @BeforeSave - static beforeSaveHook(instance: Hook, options: any): void { - } + static beforeSaveHook(instance: Hook, options: any): void {} // NOTE: this hook only available in Sequelize v4 @AfterSave - static afterSaveHook(instance: Hook, options: any): void { - } + static afterSaveHook(instance: Hook, options: any): void {} // NOTE: this hook only available in Sequelize v4 @BeforeUpsert - static beforeUpsertHook(instance: Hook, options: any): void { - } + static beforeUpsertHook(instance: Hook, options: any): void {} // NOTE: this hook only available in Sequelize v4 @AfterUpsert - static afterUpsertHook(instance: Hook, options: any): void { - } + static afterUpsertHook(instance: Hook, options: any): void {} @BeforeBulkCreate - static beforeBulkCreateHook(instances: Hook[], options: any): void { - } + static beforeBulkCreateHook(instances: Hook[], options: any): void {} @AfterBulkCreate - static afterBulkCreateHook(instances: Hook[], options: any): void { - } + static afterBulkCreateHook(instances: Hook[], options: any): void {} @BeforeBulkSync - static beforeBulkSyncHook(instances: Hook[], options: any): void { - } + static beforeBulkSyncHook(instances: Hook[], options: any): void {} @AfterBulkSync - static afterBulkSyncHook(instances: Hook[], options: any): void { - } + static afterBulkSyncHook(instances: Hook[], options: any): void {} @BeforeConnect - static beforeConnectHook(instances: Hook[], options: any): void { - } + static beforeConnectHook(instances: Hook[], options: any): void {} @AfterConnect - static afterConnectHook(instances: Hook[], options: any): void { - } + static afterConnectHook(instances: Hook[], options: any): void {} @BeforeDefine - static beforeDefineHook(instances: Hook[], options: any): void { - } + static beforeDefineHook(instances: Hook[], options: any): void {} @AfterDefine - static afterDefineHook(instances: Hook[], options: any): void { - } + static afterDefineHook(instances: Hook[], options: any): void {} @BeforeInit - static beforeInitHook(instances: Hook[], options: any): void { - } + static beforeInitHook(instances: Hook[], options: any): void {} @AfterInit - static afterInitHook(instances: Hook[], options: any): void { - } + static afterInitHook(instances: Hook[], options: any): void {} @BeforeBulkDestroy - static beforeBulkDestroyHook(options: any): void { - } + static beforeBulkDestroyHook(options: any): void {} @AfterBulkDestroy - static afterBulkDestroyHook(options: any): void { - } + static afterBulkDestroyHook(options: any): void {} @BeforeBulkRestore - static beforeBulkRestoreHook(options: any): void { - } + static beforeBulkRestoreHook(options: any): void {} @AfterBulkRestore - static afterBulkRestoreHook(options: any): void { - } + static afterBulkRestoreHook(options: any): void {} @BeforeBulkUpdate - static beforeBulkUpdateHook(options: any): void { - } + static beforeBulkUpdateHook(options: any): void {} @AfterBulkUpdate - static afterBulkUpdateHook(options: any): void { - } + static afterBulkUpdateHook(options: any): void {} @BeforeFind - static beforeFindHook(options: any): void { - } + static beforeFindHook(options: any): void {} @BeforeFindAfterExpandIncludeAll - static beforeFindAfterExpandIncludeAllHook(options: any): void { - } + static beforeFindAfterExpandIncludeAllHook(options: any): void {} @BeforeFindAfterOptions - static beforeFindAfterOptionsHook(options: any): void { - } + static beforeFindAfterOptionsHook(options: any): void {} @AfterFind - static afterFindHook(options: any): void { - } + static afterFindHook(options: any): void {} @BeforeCount - static beforeCountHook(options: any): void { - } + static beforeCountHook(options: any): void {} // Hooks can also be named. This allows them to be removed at a later time using // Model.removeHook('hookType', 'hookName'). Please be aware that hook removal does not // work correctly in versions of Sequelize earlier than 4.4.10. - @BeforeValidate({name: 'myBeforeValidateHook'}) - static beforeValidateHookWithName(instance: Hook, options: any): void { - } + @BeforeValidate({ name: 'myBeforeValidateHook' }) + static beforeValidateHookWithName(instance: Hook, options: any): void {} - @AfterValidate({name: 'myAfterValidateHook'}) - static afterValidateHookWithName(instance: Hook, options: any): void { - } + @AfterValidate({ name: 'myAfterValidateHook' }) + static afterValidateHookWithName(instance: Hook, options: any): void {} - @ValidationFailed({name: 'myValidationFailedHook'}) - static validationFailedHookWithName(instance: Hook, options: any, err: any): void { - } + @ValidationFailed({ name: 'myValidationFailedHook' }) + static validationFailedHookWithName(instance: Hook, options: any, err: any): void {} - @BeforeCreate({name: 'myBeforeCreateHook'}) - static beforeCreateHookWithName(instance: Hook, options: any): void { - } + @BeforeCreate({ name: 'myBeforeCreateHook' }) + static beforeCreateHookWithName(instance: Hook, options: any): void {} - @AfterCreate({name: 'myAfterCreateHook'}) - static afterCreateHookWithName(instance: Hook, options: any): void { - } + @AfterCreate({ name: 'myAfterCreateHook' }) + static afterCreateHookWithName(instance: Hook, options: any): void {} - @BeforeDestroy({name: 'myBeforeDestroyHook'}) - static beforeDestroyHookWithName(instance: Hook, options: any): void { - } + @BeforeDestroy({ name: 'myBeforeDestroyHook' }) + static beforeDestroyHookWithName(instance: Hook, options: any): void {} - @AfterDestroy({name: 'myAfterDestroyHook'}) - static afterDestroyHookWithName(instance: Hook, options: any): void { - } + @AfterDestroy({ name: 'myAfterDestroyHook' }) + static afterDestroyHookWithName(instance: Hook, options: any): void {} - @BeforeRestore({name: 'myBeforeRestoreHook'}) - static beforeRestoreHookWithName(instance: Hook, options: any): void { - } + @BeforeRestore({ name: 'myBeforeRestoreHook' }) + static beforeRestoreHookWithName(instance: Hook, options: any): void {} - @AfterRestore({name: 'myAfterRestoreHook'}) - static afterRestoreHookWithName(instance: Hook, options: any): void { - } + @AfterRestore({ name: 'myAfterRestoreHook' }) + static afterRestoreHookWithName(instance: Hook, options: any): void {} - @BeforeUpdate({name: 'myBeforeUpdateHook'}) - static beforeUpdateHookWithName(instance: Hook, options: any): void { - } + @BeforeUpdate({ name: 'myBeforeUpdateHook' }) + static beforeUpdateHookWithName(instance: Hook, options: any): void {} - @AfterUpdate({name: 'myAfterUpdateHook'}) - static afterUpdateHookWithName(instance: Hook, options: any): void { - } + @AfterUpdate({ name: 'myAfterUpdateHook' }) + static afterUpdateHookWithName(instance: Hook, options: any): void {} // NOTE: this hook only available in Sequelize v4 - @BeforeSave({name: 'myBeforeSaveHook'}) - static beforeSaveHookWithName(instance: Hook, options: any): void { - } + @BeforeSave({ name: 'myBeforeSaveHook' }) + static beforeSaveHookWithName(instance: Hook, options: any): void {} // NOTE: this hook only available in Sequelize v4 - @AfterSave({name: 'myAfterSaveHook'}) - static afterSaveHookWithName(instance: Hook, options: any): void { - } + @AfterSave({ name: 'myAfterSaveHook' }) + static afterSaveHookWithName(instance: Hook, options: any): void {} // NOTE: this hook only available in Sequelize v4 - @BeforeUpsert({name: 'myBeforeUpsertHook'}) - static beforeUpsertHookWithName(instance: Hook, options: any): void { - } + @BeforeUpsert({ name: 'myBeforeUpsertHook' }) + static beforeUpsertHookWithName(instance: Hook, options: any): void {} // NOTE: this hook only available in Sequelize v4 - @AfterUpsert({name: 'myAfterUpsertHook'}) - static afterUpsertHookWithName(instance: Hook, options: any): void { - } + @AfterUpsert({ name: 'myAfterUpsertHook' }) + static afterUpsertHookWithName(instance: Hook, options: any): void {} - @BeforeBulkCreate({name: 'myBeforeBulkCreateHook'}) - static beforeBulkCreateHookWithName(instances: Hook[], options: any): void { - } + @BeforeBulkCreate({ name: 'myBeforeBulkCreateHook' }) + static beforeBulkCreateHookWithName(instances: Hook[], options: any): void {} - @AfterBulkCreate({name: 'myAfterBulkCreateHook'}) - static afterBulkCreateHookWithName(instances: Hook[], options: any): void { - } + @AfterBulkCreate({ name: 'myAfterBulkCreateHook' }) + static afterBulkCreateHookWithName(instances: Hook[], options: any): void {} - @BeforeBulkDestroy({name: 'myBeforeBulkDestroyHook'}) - static beforeBulkDestroyHookWithName(options: any): void { - } + @BeforeBulkDestroy({ name: 'myBeforeBulkDestroyHook' }) + static beforeBulkDestroyHookWithName(options: any): void {} - @AfterBulkDestroy({name: 'myAfterBulkDestroyHook'}) - static afterBulkDestroyHookWithName(options: any): void { - } + @AfterBulkDestroy({ name: 'myAfterBulkDestroyHook' }) + static afterBulkDestroyHookWithName(options: any): void {} - @BeforeBulkRestore({name: 'myBeforeBulkRestoreHook'}) - static beforeBulkRestoreHookWithName(options: any): void { - } + @BeforeBulkRestore({ name: 'myBeforeBulkRestoreHook' }) + static beforeBulkRestoreHookWithName(options: any): void {} - @AfterBulkRestore({name: 'myAfterBulkRestoreHook'}) - static afterBulkRestoreHookWithName(options: any): void { - } + @AfterBulkRestore({ name: 'myAfterBulkRestoreHook' }) + static afterBulkRestoreHookWithName(options: any): void {} - @BeforeBulkUpdate({name: 'myBeforeBulkUpdateHook'}) - static beforeBulkUpdateHookWithName(options: any): void { - } + @BeforeBulkUpdate({ name: 'myBeforeBulkUpdateHook' }) + static beforeBulkUpdateHookWithName(options: any): void {} - @AfterBulkUpdate({name: 'myAfterBulkUpdateHook'}) - static afterBulkUpdateHookWithName(options: any): void { - } + @AfterBulkUpdate({ name: 'myAfterBulkUpdateHook' }) + static afterBulkUpdateHookWithName(options: any): void {} - @BeforeFind({name: 'myBeforeFindHook'}) - static beforeFindHookWithName(options: any): void { - } + @BeforeFind({ name: 'myBeforeFindHook' }) + static beforeFindHookWithName(options: any): void {} - @BeforeFindAfterExpandIncludeAll({name: 'myBeforeFindAfterExpandIncludeAllHook'}) - static beforeFindAfterExpandIncludeAllHookWithName(options: any): void { - } + @BeforeFindAfterExpandIncludeAll({ name: 'myBeforeFindAfterExpandIncludeAllHook' }) + static beforeFindAfterExpandIncludeAllHookWithName(options: any): void {} - @BeforeFindAfterOptions({name: 'myBeforeFindAfterOptionsHook'}) - static beforeFindAfterOptionsHookWithName(options: any): void { - } + @BeforeFindAfterOptions({ name: 'myBeforeFindAfterOptionsHook' }) + static beforeFindAfterOptionsHookWithName(options: any): void {} - @AfterFind({name: 'myAfterFindHook'}) - static afterFindHookWithName(options: any): void { - } + @AfterFind({ name: 'myAfterFindHook' }) + static afterFindHookWithName(options: any): void {} - @BeforeCount({name: 'myBeforeCountHook'}) - static beforeCountHookWithName(options: any): void { - } + @BeforeCount({ name: 'myBeforeCountHook' }) + static beforeCountHookWithName(options: any): void {} } diff --git a/test/models/Manufacturer.ts b/test/models/Manufacturer.ts index c7f37fbb..db484ea0 100644 --- a/test/models/Manufacturer.ts +++ b/test/models/Manufacturer.ts @@ -1,16 +1,15 @@ -import {Table, Model, Column, HasMany, Scopes} from "../../src"; -import {ShoeWithScopes} from "./ShoeWithScopes"; +import { Table, Model, Column, HasMany, Scopes } from '../../src'; +import { ShoeWithScopes } from './ShoeWithScopes'; @Scopes({ brandOnly: { attributes: { - exclude: ['notInScopeBrandOnly'] - } - } + exclude: ['notInScopeBrandOnly'], + }, + }, }) @Table -export class Manufacturer extends Model { - +export class Manufacturer extends Model { @Column brand: string; diff --git a/test/models/Page.ts b/test/models/Page.ts index de71f466..8b7d83ef 100644 --- a/test/models/Page.ts +++ b/test/models/Page.ts @@ -1,9 +1,8 @@ -import {Table, Model, ForeignKey, Column, BelongsTo, DataType} from "../../src"; -import {Book} from "./Book"; +import { Table, Model, ForeignKey, Column, BelongsTo, DataType } from '../../src'; +import { Book } from './Book'; @Table -export class Page extends Model { - +export class Page extends Model { @Column(DataType.TEXT) content: string; diff --git a/test/models/Person.ts b/test/models/Person.ts index 0b5f6364..aa4d8e88 100644 --- a/test/models/Person.ts +++ b/test/models/Person.ts @@ -1,8 +1,7 @@ -import {Table, Model, Column, PrimaryKey, DataType, Default} from "../../src"; +import { Table, Model, Column, PrimaryKey, DataType, Default } from '../../src'; @Table -export class Person extends Model { - +export class Person extends Model { @PrimaryKey @Default(DataType.UUIDV1) @Column(DataType.UUID) diff --git a/test/models/Player.ts b/test/models/Player.ts index 3f2f3f01..a33541d8 100644 --- a/test/models/Player.ts +++ b/test/models/Player.ts @@ -1,10 +1,18 @@ -import {Table, Model, PrimaryKey, ForeignKey, Column, AutoIncrement, HasOne, BelongsTo} from "../../src"; -import {Team} from "./Team"; -import {Shoe} from "./Shoe"; +import { + Table, + Model, + PrimaryKey, + ForeignKey, + Column, + AutoIncrement, + HasOne, + BelongsTo, +} from '../../src'; +import { Team } from './Team'; +import { Shoe } from './Shoe'; @Table -export class Player extends Model { - +export class Player extends Model { @PrimaryKey @AutoIncrement @Column diff --git a/test/models/Shoe.ts b/test/models/Shoe.ts index a46e4671..b84ef8e2 100644 --- a/test/models/Shoe.ts +++ b/test/models/Shoe.ts @@ -1,13 +1,12 @@ -import {Table, Model, ForeignKey, Column, BelongsTo} from "../../src"; -import {Player} from "./Player"; +import { Table, Model, ForeignKey, Column, BelongsTo } from '../../src'; +import { Player } from './Player'; export const SHOE_TABLE_NAME = 'Glove'; @Table({ - tableName: SHOE_TABLE_NAME + tableName: SHOE_TABLE_NAME, }) -export class Shoe extends Model { - +export class Shoe extends Model { @Column brand: string; diff --git a/test/models/ShoeWithDeprecatedScopes.ts b/test/models/ShoeWithDeprecatedScopes.ts index c43ffd66..bb9dc268 100644 --- a/test/models/ShoeWithDeprecatedScopes.ts +++ b/test/models/ShoeWithDeprecatedScopes.ts @@ -1,43 +1,40 @@ -import {Table, Model, Column, ForeignKey, BelongsTo, - DefaultScope, Scopes} from "../../src"; -import {Manufacturer} from "./Manufacturer"; -import {Person} from "./Person"; +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import { Table, Model, Column, ForeignKey, BelongsTo, DefaultScope, Scopes } from '../../src'; +import { Manufacturer } from './Manufacturer'; +import { Person } from './Person'; export const SHOE_DEFAULT_SCOPE = { - attributes: ['id', 'primaryColor', 'secondaryColor', 'producedAt'] + attributes: ['id', 'primaryColor', 'secondaryColor', 'producedAt'], }; export const SHOE_SCOPES = { full: { - include: [() => Manufacturer] + include: [() => Manufacturer], }, yellow: { - where: {primaryColor: 'yellow'} + where: { primaryColor: 'yellow' }, }, red: { - where: {primaryColor: 'red'} + where: { primaryColor: 'red' }, }, noImg: { - where: {img: null} + where: { img: null }, }, - manufacturerWithScope: { + /*manufacturerWithScope: { include: [() => Manufacturer.scope('brandOnly')] - }, - primaryColor: primaryColor => ({ - where: {primaryColor} - } - ), - primaryColorWithManufacturer: primaryColor => ({ - include: [Manufacturer], - where: {primaryColor}, - } - ) + },*/ + primaryColor: (primaryColor) => ({ + where: { primaryColor }, + }), + primaryColorWithManufacturer: (primaryColor) => ({ + include: [Manufacturer], + where: { primaryColor }, + }), }; @DefaultScope(SHOE_DEFAULT_SCOPE) @Scopes(SHOE_SCOPES) @Table -export class ShoeWithDeprecatedScopes extends Model { - +export class ShoeWithDeprecatedScopes extends Model { @Column readonly secretKey: string; @@ -66,5 +63,4 @@ export class ShoeWithDeprecatedScopes extends Model { @BelongsTo(() => Person) owner: Person; - } diff --git a/test/models/ShoeWithScopes.ts b/test/models/ShoeWithScopes.ts index 1384dbb2..44628f2e 100644 --- a/test/models/ShoeWithScopes.ts +++ b/test/models/ShoeWithScopes.ts @@ -1,43 +1,40 @@ -import {Table, Model, Column, ForeignKey, BelongsTo, - DefaultScope, Scopes} from "../../src"; -import {Manufacturer} from "./Manufacturer"; -import {Person} from "./Person"; +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import { Table, Model, Column, ForeignKey, BelongsTo, DefaultScope, Scopes } from '../../src'; +import { Manufacturer } from './Manufacturer'; +import { Person } from './Person'; export const SHOE_DEFAULT_SCOPE_GETTER = () => ({ - attributes: ['id', 'primaryColor', 'secondaryColor', 'producedAt'] + attributes: ['id', 'primaryColor', 'secondaryColor', 'producedAt'], }); export const SHOE_SCOPES__GETTER = () => ({ full: { - include: [Manufacturer] + include: [Manufacturer], }, yellow: { - where: {primaryColor: 'yellow'} + where: { primaryColor: 'yellow' }, }, red: { - where: {primaryColor: 'red'} + where: { primaryColor: 'red' }, }, noImg: { - where: {img: null} + where: { img: null }, }, manufacturerWithScope: { - include: [Manufacturer.scope('brandOnly')] + include: [Manufacturer.scope('brandOnly')], }, - primaryColor: primaryColor => ({ - where: {primaryColor} - } - ), - primaryColorWithManufacturer: primaryColor => ({ - include: [Manufacturer], - where: {primaryColor}, - } - ) + primaryColor: (primaryColor) => ({ + where: { primaryColor }, + }), + primaryColorWithManufacturer: (primaryColor) => ({ + include: [Manufacturer], + where: { primaryColor }, + }), }); @DefaultScope(SHOE_DEFAULT_SCOPE_GETTER) @Scopes(SHOE_SCOPES__GETTER) @Table -export class ShoeWithScopes extends Model { - +export class ShoeWithScopes extends Model { @Column readonly secretKey: string; @@ -66,5 +63,4 @@ export class ShoeWithScopes extends Model { @BelongsTo(() => Person) owner: Person; - } diff --git a/test/models/ShoeWithValidation.ts b/test/models/ShoeWithValidation.ts index 8c54a3c4..e7c8e01d 100644 --- a/test/models/ShoeWithValidation.ts +++ b/test/models/ShoeWithValidation.ts @@ -1,12 +1,42 @@ import { - Table, Model, Column, PrimaryKey, DataType, - Equals, Contains, Is, IsDate, Length, IsUrl, IsAfter, IsBefore, - IsUUID, IsAlpha, IsAlphanumeric, IsEmail, IsInt, IsDecimal, IsFloat, - IsIn, IsIP, IsIPv4, IsIPv6, IsLowercase, IsUppercase, Max, Min, - Not, NotContains, NotIn, NotNull, Validate, NotEmpty, IsNumeric, - IsNull, IsArray -} from "../../src"; -import {IsCreditCard} from "../../src/validation/is-credit-card"; + Table, + Model, + Column, + PrimaryKey, + DataType, + Equals, + Contains, + Is, + IsDate, + Length, + IsUrl, + IsAfter, + IsBefore, + IsUUID, + IsAlpha, + IsAlphanumeric, + IsEmail, + IsInt, + IsDecimal, + IsFloat, + IsIn, + IsIP, + IsIPv4, + IsIPv6, + IsLowercase, + IsUppercase, + Max, + Min, + Not, + NotContains, + NotIn, + Validate, + NotEmpty, + IsNumeric, + IsNull, + IsArray, +} from '../../src'; +import { IsCreditCard } from '../../src/validation/is-credit-card'; export const HEX_REGEX = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/; export function hexColor(value: string): void { @@ -24,11 +54,10 @@ export const KEY_VALUE = 'READONLY'; export const PARTIAL_SPECIAL_VALUE = 'Special'; export const PRODUCED_AT_IS_AFTER = '1987-04-04'; export const PRODUCED_AT_IS_BEFORE = '2017-02-27'; -export const BRAND_LENGTH = {min: 3, max: 15}; +export const BRAND_LENGTH = { min: 3, max: 15 }; @Table -export class ShoeWithValidation extends Model { - +export class ShoeWithValidation extends Model { @IsUUID(UUID_VERSION) @PrimaryKey @Column @@ -51,7 +80,7 @@ export class ShoeWithValidation extends Model { brandUrl: string; @Is('HexColor', hexColor) - @Length({min: 4, msg: 'too short'}) + @Length({ min: 4, msg: 'too short' }) @Column primaryColor: string; @@ -91,7 +120,7 @@ export class ShoeWithValidation extends Model { @IsIn(IS_IN) @NotIn(IS_IN) @NotContains(NOT_CONTAINS) - @Validate({isArray: true}) + @Validate({ isArray: true }) @Column(DataType.STRING) dummy: any; } diff --git a/test/models/Team.ts b/test/models/Team.ts index 6d2a2b1d..1046392f 100644 --- a/test/models/Team.ts +++ b/test/models/Team.ts @@ -1,9 +1,8 @@ -import {Table, Model, PrimaryKey, AutoIncrement, Column, HasMany} from "../../src"; -import {Player} from "./Player"; +import { Table, Model, PrimaryKey, AutoIncrement, Column, HasMany } from '../../src'; +import { Player } from './Player'; @Table -export class Team extends Model { - +export class Team extends Model { @PrimaryKey @AutoIncrement @Column diff --git a/test/models/TimeStampsUser.ts b/test/models/TimeStampsUser.ts index 9b29e451..4be1511b 100644 --- a/test/models/TimeStampsUser.ts +++ b/test/models/TimeStampsUser.ts @@ -1,10 +1,9 @@ -import {Table, Model, PrimaryKey, AutoIncrement, Column} from "../../src"; +import { Table, Model, PrimaryKey, AutoIncrement, Column } from '../../src'; @Table({ - timestamps: true + timestamps: true, }) -export class TimeStampsUser extends Model { - +export class TimeStampsUser extends Model { @PrimaryKey @AutoIncrement @Column diff --git a/test/models/User.ts b/test/models/User.ts index c4c28aaf..d0756043 100644 --- a/test/models/User.ts +++ b/test/models/User.ts @@ -1,8 +1,19 @@ -import {Table, Model, PrimaryKey, Column, AutoIncrement, DataType, Default, AllowNull, Unique, Length, IsInt} from "../../src"; +import { + Table, + Model, + PrimaryKey, + Column, + AutoIncrement, + DataType, + Default, + AllowNull, + Unique, + Length, + IsInt, +} from '../../src'; @Table -export class User extends Model { - +export class User extends Model { @PrimaryKey @AutoIncrement @Column @@ -10,7 +21,7 @@ export class User extends Model { @Column({ type: DataType.UUID, - defaultValue: DataType.UUIDV1 + defaultValue: DataType.UUIDV1, }) uuidv1: string; @@ -19,7 +30,7 @@ export class User extends Model { @Column(DataType.UUID) uuidv4: string; - @Length({max: 20}) + @Length({ max: 20 }) @Column username: string; @@ -42,7 +53,7 @@ export class User extends Model { isSuperUser: boolean | number; @Column({ - defaultValue: DataType.NOW + defaultValue: DataType.NOW, }) touchedAt: Date; @@ -50,7 +61,7 @@ export class User extends Model { birthDate: Date; @Column({ - allowNull: true + allowNull: true, }) dateAllowNullTrue: Date; @@ -69,5 +80,4 @@ export class User extends Model { extraField: string; extraField2: boolean; extraField3: number; - } diff --git a/test/models/UserWithCreatedAtButWithoutUpdatedAt.ts b/test/models/UserWithCreatedAtButWithoutUpdatedAt.ts index c57b8da8..8e39a392 100644 --- a/test/models/UserWithCreatedAtButWithoutUpdatedAt.ts +++ b/test/models/UserWithCreatedAtButWithoutUpdatedAt.ts @@ -1,11 +1,10 @@ -import {Table, Model, Column} from "../../src"; +import { Table, Model, Column } from '../../src'; @Table({ timestamps: true, - updatedAt: false + updatedAt: false, }) -export class UserWithCreatedAtButWithoutUpdatedAt extends Model { - +export class UserWithCreatedAtButWithoutUpdatedAt extends Model { @Column name: string; } diff --git a/test/models/UserWithCustomUpdatedAt.ts b/test/models/UserWithCustomUpdatedAt.ts index cb93db95..2d080984 100644 --- a/test/models/UserWithCustomUpdatedAt.ts +++ b/test/models/UserWithCustomUpdatedAt.ts @@ -1,12 +1,10 @@ -import {Table, Model, Column} from "../../src"; - -@Table({timestamps: false}) -export class UserWithCustomUpdatedAt extends Model { +import { Table, Model, Column } from '../../src'; +@Table({ timestamps: false }) +export class UserWithCustomUpdatedAt extends Model { @Column name: string; @Column updatedAt: Date; - } diff --git a/test/models/UserWithNoAutoIncrementation.ts b/test/models/UserWithNoAutoIncrementation.ts index b2a1a316..32520fd1 100644 --- a/test/models/UserWithNoAutoIncrementation.ts +++ b/test/models/UserWithNoAutoIncrementation.ts @@ -1,16 +1,14 @@ -import {Table, Model, Column, DataType} from "../../src"; +import { Table, Model, Column, DataType } from '../../src'; @Table -export class UserWithNoAutoIncrementation extends Model { - +export class UserWithNoAutoIncrementation extends Model { @Column({ type: DataType.INTEGER.UNSIGNED, autoIncrement: false, - primaryKey: true + primaryKey: true, }) id: number; @Column username: string; - } diff --git a/test/models/UserWithSwag.ts b/test/models/UserWithSwag.ts index 18e654f6..b6efad67 100644 --- a/test/models/UserWithSwag.ts +++ b/test/models/UserWithSwag.ts @@ -1,8 +1,7 @@ -import {Table, Model, Column, DataType} from "../../src"; +import { Table, Model, Column, DataType } from '../../src'; @Table -export class UserWithSwag extends Model { - +export class UserWithSwag extends Model { @Column name: string; @@ -10,15 +9,14 @@ export class UserWithSwag extends Model { type: DataType.VIRTUAL, get(): string { return 'swag'; - } + }, }) bio: string; @Column({ validate: { - isEmail: true - } + isEmail: true, + }, }) email: string; - } diff --git a/test/models/UserWithValidation.ts b/test/models/UserWithValidation.ts index 646483bc..c6c751d3 100644 --- a/test/models/UserWithValidation.ts +++ b/test/models/UserWithValidation.ts @@ -1,21 +1,19 @@ -import {Table, Model, Column, DataType} from "../../src"; +import { Table, Model, Column, DataType } from '../../src'; @Table -export class UserWithValidation extends Model { - +export class UserWithValidation extends Model { @Column name: string; @Column({ - type: DataType.TEXT + type: DataType.TEXT, }) bio: string; @Column({ validate: { - isEmail: true - } + isEmail: true, + }, }) email: string; - } diff --git a/test/models/UserWithVersion.ts b/test/models/UserWithVersion.ts index 49c60045..52549d90 100644 --- a/test/models/UserWithVersion.ts +++ b/test/models/UserWithVersion.ts @@ -1,9 +1,7 @@ -import {Column, Model, Table} from "../../src"; - -@Table({version: true}) -export class UserWithVersion extends Model { +import { Column, Model, Table } from '../../src'; +@Table({ version: true }) +export class UserWithVersion extends Model { @Column name: string; - } diff --git a/test/models/exports/Game.ts b/test/models/exports/Game.ts index 2257c216..e20f8ec9 100644 --- a/test/models/exports/Game.ts +++ b/test/models/exports/Game.ts @@ -1,8 +1,7 @@ -import {Table, Column, Model} from '../../../src'; +import { Table, Column, Model } from '../../../src'; @Table -export class Game extends Model { - +export class Game extends Model { @Column title: string; } diff --git a/test/models/exports/custom-match/match.model.ts b/test/models/exports/custom-match/match.model.ts index 569ac617..892f827e 100644 --- a/test/models/exports/custom-match/match.model.ts +++ b/test/models/exports/custom-match/match.model.ts @@ -1,11 +1,10 @@ -import {Table, Column, Model} from '../../../../src'; +import { Table, Column, Model } from '../../../../src'; export const MatchN = 'Not a model'; export const NMatch = 'Not a model'; @Table -export class Match extends Model { - +export class Match extends Model { @Column title: string; } diff --git a/test/models/exports/gamer.model.ts b/test/models/exports/gamer.model.ts index 09894951..6e0fc13b 100644 --- a/test/models/exports/gamer.model.ts +++ b/test/models/exports/gamer.model.ts @@ -1,8 +1,7 @@ -import {Table, Column, Model} from '../../../src'; +import { Table, Column, Model } from '../../../src'; @Table -export default class Gamer extends Model { - +export default class Gamer extends Model { @Column nickname: string; } diff --git a/test/models/exports/throws/_cheater.ts b/test/models/exports/throws/_cheater.ts index 60b2b45b..eb874406 100644 --- a/test/models/exports/throws/_cheater.ts +++ b/test/models/exports/throws/_cheater.ts @@ -1,4 +1,4 @@ -import {Table, Model} from '../../../../src'; +import { Table, Model } from '../../../../src'; @Table -export class Cheater extends Model {} +export class Cheater extends Model {} diff --git a/test/models/globs/match-dir-only/PlayerDir.ts b/test/models/globs/match-dir-only/PlayerDir.ts index 7650e09e..769fa4c1 100644 --- a/test/models/globs/match-dir-only/PlayerDir.ts +++ b/test/models/globs/match-dir-only/PlayerDir.ts @@ -1,7 +1,7 @@ -import {Table, Model, Column,} from "../../../../src"; +import { Table, Model, Column } from '../../../../src'; @Table -export default class PlayerDir extends Model { +export default class PlayerDir extends Model { @Column name: string; } diff --git a/test/models/globs/match-dir-only/ShoeDir.ts b/test/models/globs/match-dir-only/ShoeDir.ts index a050a49f..25f4aad6 100644 --- a/test/models/globs/match-dir-only/ShoeDir.ts +++ b/test/models/globs/match-dir-only/ShoeDir.ts @@ -1,9 +1,7 @@ -import {Table, Model, Column} from "../../../../src"; +import { Table, Model, Column } from '../../../../src'; @Table -export default class ShoeDir extends Model { - +export default class ShoeDir extends Model { @Column brand: string; - } diff --git a/test/models/globs/match-dir-only/TeamDir.ts b/test/models/globs/match-dir-only/TeamDir.ts index 9b478b79..abf33fcc 100644 --- a/test/models/globs/match-dir-only/TeamDir.ts +++ b/test/models/globs/match-dir-only/TeamDir.ts @@ -1,8 +1,7 @@ -import {Table, Model, Column} from "../../../../src"; +import { Table, Model, Column } from '../../../../src'; @Table -export default class TeamDir extends Model { - +export default class TeamDir extends Model { @Column name: string; } diff --git a/test/models/globs/match-files/AddressDir.ts b/test/models/globs/match-files/AddressDir.ts index 8ef167ba..013e283a 100644 --- a/test/models/globs/match-files/AddressDir.ts +++ b/test/models/globs/match-files/AddressDir.ts @@ -1,7 +1,5 @@ -import {Model} from "../../../../src"; -import {Table} from "../../../../src/model/table/table"; +import { Model } from '../../../../src'; +import { Table } from '../../../../src/model/table/table'; @Table -export class AddressDir extends Model { - -} +export class AddressDir extends Model {} diff --git a/test/models/globs/match-files/UserDir.ts b/test/models/globs/match-files/UserDir.ts index df2cd9ed..b21fb251 100644 --- a/test/models/globs/match-files/UserDir.ts +++ b/test/models/globs/match-files/UserDir.ts @@ -1,6 +1,4 @@ -import {Model, Table} from "../../../../src"; +import { Model, Table } from '../../../../src'; @Table -export class UserDir extends Model { - -} +export class UserDir extends Model {} diff --git a/test/models/globs/match-sub-dir-files/players/player.model.ts b/test/models/globs/match-sub-dir-files/players/player.model.ts index b872e135..1506ac60 100644 --- a/test/models/globs/match-sub-dir-files/players/player.model.ts +++ b/test/models/globs/match-sub-dir-files/players/player.model.ts @@ -1,7 +1,7 @@ -import {Table, Model, Column,} from "../../../../../src"; +import { Table, Model, Column } from '../../../../../src'; @Table -export default class PlayerGlob extends Model { +export default class PlayerGlob extends Model { @Column name: string; } diff --git a/test/models/globs/match-sub-dir-files/shoes/shoe.model.ts b/test/models/globs/match-sub-dir-files/shoes/shoe.model.ts index c338327e..ec3bdbd8 100644 --- a/test/models/globs/match-sub-dir-files/shoes/shoe.model.ts +++ b/test/models/globs/match-sub-dir-files/shoes/shoe.model.ts @@ -1,9 +1,7 @@ -import {Table, Model, Column} from "../../../../../src"; +import { Table, Model, Column } from '../../../../../src'; @Table -export default class ShoeGlob extends Model { - +export default class ShoeGlob extends Model { @Column brand: string; - } diff --git a/test/models/globs/match-sub-dir-files/teams/team.model.ts b/test/models/globs/match-sub-dir-files/teams/team.model.ts index a65766ed..54fb3b35 100644 --- a/test/models/globs/match-sub-dir-files/teams/team.model.ts +++ b/test/models/globs/match-sub-dir-files/teams/team.model.ts @@ -1,8 +1,7 @@ -import {Table, Model, Column} from "../../../../../src"; +import { Table, Model, Column } from '../../../../../src'; @Table -export default class TeamGlob extends Model { - +export default class TeamGlob extends Model { @Column name: string; } diff --git a/test/specs/annotations/belongs-to-many.spec.ts b/test/specs/annotations/belongs-to-many.spec.ts index 2613780f..99b75d5a 100644 --- a/test/specs/annotations/belongs-to-many.spec.ts +++ b/test/specs/annotations/belongs-to-many.spec.ts @@ -1,24 +1,21 @@ -import {expect, use} from 'chai'; +import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Table} from '../../../src/model/table/table'; -import {Model} from '../../../src/model/model/model'; -import {createSequelize} from '../../utils/sequelize'; -import {BelongsToMany} from '../../../src/associations/belongs-to-many/belongs-to-many'; +import { Table } from '../../../src/model/table/table'; +import { Model } from '../../../src/model/model/model'; +import { createSequelize } from '../../utils/sequelize'; +import { BelongsToMany } from '../../../src/associations/belongs-to-many/belongs-to-many'; use(chaiAsPromised); -// tslint:disable:max-classes-per-file describe('BelongsToMany', () => { - const as = 'manyTeams'; const sequelize = createSequelize(false); @Table - class Team extends Model {} + class Team extends Model {} @Table - class Player extends Model { - + class Player extends Model { @BelongsToMany(() => Team, { as, through: 'TeamPlayer', @@ -33,5 +30,4 @@ describe('BelongsToMany', () => { it('should pass as options to sequelize association', () => { expect(Player['associations']).to.have.property(as); }); - }); diff --git a/test/specs/annotations/belongs-to.spec.ts b/test/specs/annotations/belongs-to.spec.ts index 1f63f045..460d2d2d 100644 --- a/test/specs/annotations/belongs-to.spec.ts +++ b/test/specs/annotations/belongs-to.spec.ts @@ -1,25 +1,22 @@ -import {expect, use} from 'chai'; +import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Table} from '../../../src/model/table/table'; -import {BelongsTo} from '../../../src/associations/belongs-to/belongs-to'; -import {Model} from '../../../src/model/model/model'; -import {createSequelize} from '../../utils/sequelize'; +import { Table } from '../../../src/model/table/table'; +import { BelongsTo } from '../../../src/associations/belongs-to/belongs-to'; +import { Model } from '../../../src/model/model/model'; +import { createSequelize } from '../../utils/sequelize'; use(chaiAsPromised); -// tslint:disable:max-classes-per-file describe('BelongsTo', () => { - const as = 'parent'; const sequelize = createSequelize(false); @Table - class Team extends Model {} + class Team extends Model {} @Table - class Player extends Model { - - @BelongsTo(() => Team, {as, foreignKey: 'teamId'}) + class Player extends Model { + @BelongsTo(() => Team, { as, foreignKey: 'teamId' }) team: Team; } @@ -33,15 +30,16 @@ describe('BelongsTo', () => { const _sequelize = createSequelize(false); @Table - class Team extends Model {} + class Team extends Model {} @Table - class Player extends Model { + class Player extends Model { @BelongsTo(() => Team) team: Team; } - expect(() => _sequelize.addModels([Team, Player])).to.throw(/Foreign key for "\w+" is missing on "\w+"./); + expect(() => _sequelize.addModels([Team, Player])).to.throw( + /Foreign key for "\w+" is missing on "\w+"./ + ); }); - }); diff --git a/test/specs/annotations/comment.spec.ts b/test/specs/annotations/comment.spec.ts index dc9f6b8f..dbcf90f5 100644 --- a/test/specs/annotations/comment.spec.ts +++ b/test/specs/annotations/comment.spec.ts @@ -1,24 +1,24 @@ -import { expect, use } from 'chai'; -import { createSequelize } from "../../utils/sequelize"; +import { expect } from 'chai'; +import { createSequelize } from '../../utils/sequelize'; import { Table } from '../../../src/model/table/table'; import { Model } from '../../../src/model/model/model'; -import { Column } from "../../../src/model/column/column"; -import { Comment } from "../../../src/model/column/column-options/comment"; +import { Column } from '../../../src/model/column/column'; +import { Comment } from '../../../src/model/column/column-options/comment'; -describe("comment", () => { - const sequelize = createSequelize(false); - const BookTitleCommentString = "title for book"; +describe('comment', () => { + const sequelize = createSequelize(false); + const BookTitleCommentString = 'title for book'; - @Table - class Book extends Model { - @Comment(BookTitleCommentString) - @Column - title: string; - } + @Table + class Book extends Model { + @Comment(BookTitleCommentString) + @Column + title: string; + } - sequelize.addModels([Book]); + sequelize.addModels([Book]); - it("should set comment property on model options", () => { - expect(Book['tableAttributes'].title.comment).to.be.eq(BookTitleCommentString); - }); + it('should set comment property on model options', () => { + expect(Book['tableAttributes'].title.comment).to.be.eq(BookTitleCommentString); + }); }); diff --git a/test/specs/annotations/has-many.spec.ts b/test/specs/annotations/has-many.spec.ts index 1252e265..290cc727 100644 --- a/test/specs/annotations/has-many.spec.ts +++ b/test/specs/annotations/has-many.spec.ts @@ -1,27 +1,24 @@ -import {expect, use} from 'chai'; +import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Table} from '../../../src/model/table/table'; -import {Model} from '../../../src/model/model/model'; -import {createSequelize} from '../../utils/sequelize'; -import {HasMany} from '../../../src/associations/has/has-many'; +import { Table } from '../../../src/model/table/table'; +import { Model } from '../../../src/model/model/model'; +import { createSequelize } from '../../utils/sequelize'; +import { HasMany } from '../../../src/associations/has/has-many'; use(chaiAsPromised); -// tslint:disable:max-classes-per-file describe('HasMany', () => { - const as = 'babies'; const sequelize = createSequelize(false); @Table - class Player extends Model {} + class Player extends Model {} @Table - class Team extends Model { - + class Team extends Model { @HasMany(() => Player, { as, - foreignKey: 'teamId' + foreignKey: 'teamId', }) players: Player[]; } @@ -31,5 +28,4 @@ describe('HasMany', () => { it('should pass as options to sequelize association', () => { expect(Team['associations']).to.have.property(as); }); - }); diff --git a/test/specs/annotations/has-one.spec.ts b/test/specs/annotations/has-one.spec.ts index 51a112d3..6cf0c89a 100644 --- a/test/specs/annotations/has-one.spec.ts +++ b/test/specs/annotations/has-one.spec.ts @@ -1,36 +1,31 @@ -import {expect, use} from 'chai'; +import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {Table} from '../../../src/model/table/table'; -import {Model} from '../../../src/model/model/model'; -import {createSequelize} from '../../utils/sequelize'; -import {HasOne} from '../../../src/associations/has/has-one'; +import { Table } from '../../../src/model/table/table'; +import { Model } from '../../../src/model/model/model'; +import { createSequelize } from '../../utils/sequelize'; +import { HasOne } from '../../../src/associations/has/has-one'; use(chaiAsPromised); -// tslint:disable:max-classes-per-file describe('HasOne', () => { - const as = 'baby'; const sequelize = createSequelize(false); @Table - class Player extends Model {} + class Player extends Model {} @Table - class Team extends Model { - + class Team extends Model { @HasOne(() => Player, { as, - foreignKey: 'teamId' + foreignKey: 'teamId', }) player: Player; } - sequelize.addModels([Team, Player]); it('should pass as options to sequelize association', () => { expect(Team['associations']).to.have.property(as); }); - }); diff --git a/test/specs/association.spec.ts b/test/specs/association.spec.ts index 7f16d8fb..4625af3c 100644 --- a/test/specs/association.spec.ts +++ b/test/specs/association.spec.ts @@ -1,40 +1,44 @@ -/* tslint:disable:max-classes-per-file */ - -import {expect, use} from 'chai'; +import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import * as OriginSequelize from 'sequelize'; -import * as Promise from 'bluebird'; -import {createSequelize} from "../utils/sequelize"; +import { createSequelize } from '../utils/sequelize'; import { - Sequelize, Model, Table, Column, BelongsToMany, - ForeignKey, HasOne, HasMany, BelongsTo, DataType -} from "../../src"; -import {expectAutoGeneratedFunctions} from "../utils/association"; -import {assertInstance} from "../utils/common"; -import {AllowNull} from "../../src/model/column/column-options/allow-null"; -import {PrimaryKey} from '../../src/model/column/primary-key/primary-key'; + Sequelize, + Model, + Table, + Column, + BelongsToMany, + ForeignKey, + HasOne, + HasMany, + BelongsTo, + DataType, +} from '../../src'; +import { expectAutoGeneratedFunctions } from '../utils/association'; +import { assertInstance } from '../utils/common'; +import { AllowNull } from '../../src/model/column/column-options/allow-null'; +import { PrimaryKey } from '../../src/model/column/primary-key/primary-key'; use(chaiAsPromised); const Association: any = OriginSequelize['Association']; /* Some base classes that we can override later */ -class ConcreteModel> extends Model { -} +class ConcreteModel extends Model {} -class BookModel extends ConcreteModel { +class BookModel extends ConcreteModel { title: string; pages: PageModel[]; authors: AuthorModel[]; } -class PageModel extends ConcreteModel { +class PageModel extends ConcreteModel { content: string; bookId: number; book: BookModel; } -class AuthorModel extends ConcreteModel { +class AuthorModel extends ConcreteModel { name: string; books: BookWithAuthorModel[]; } @@ -43,23 +47,21 @@ class BookWithAuthorModel extends BookModel { authors: AuthorModel[]; } - describe('association', () => { - let sequelize: Sequelize; const jsForDummiesBook = { - title: 'JS for dummies' + title: 'JS for dummies', }; const crimeAndPunishmentBook = { - title: 'Crime and Punishment' + title: 'Crime and Punishment', }; - const elisa = {name: 'elisa'}; - const robin = {name: 'robin'}; - const nelly = {name: 'nelly'}; - const brom = {name: 'brom'}; + const elisa = { name: 'elisa' }; + const robin = { name: 'robin' }; + const nelly = { name: 'nelly' }; + const brom = { name: 'brom' }; before(() => { sequelize = createSequelize(false); @@ -67,517 +69,359 @@ describe('association', () => { describe('One-to-many', () => { function oneToManyTestSuites(Book: typeof BookModel, Page: typeof PageModel): void { - const sherlockHolmesBook = { title: 'Sherlock Holmes', - pages: [ - {content: 'Watson'}, - {content: 'Moriaty'}, - ] + pages: [{ content: 'Watson' }, { content: 'Moriaty' }], }; const page1 = { content: 'written by Oscar Wilde', book: { - title: 'The Picture of Dorian Gray' - } + title: 'The Picture of Dorian Gray', + }, }; const page2 = { - content: 'js1' + content: 'js1', }; const page3 = { - content: 'js2' + content: 'js2', }; const page4 = { - content: 'js3' + content: 'js3', }; const page5 = { - content: 'js4' + content: 'js4', }; before(() => sequelize.addModels([Page, Book])); beforeEach(() => { - return sequelize.sync({force: true}); + return sequelize.sync({ force: true }); }); it('should create models with specified relations', () => { - expect(Book) .to.have.property('associations') .that.has.property('pages') .that.is.an.instanceOf(Association['HasMany']) - .and.has.property('foreignKey', 'bookId') - ; + .and.has.property('foreignKey', 'bookId'); expect(Page) .to.have.property('associations') .that.has.property('book') .that.is.an.instanceOf(Association['BelongsTo']) - .and.has.property('foreignKey', 'bookId') - ; + .and.has.property('foreignKey', 'bookId'); }); it('should create models with generated functions on its prototype', () => { - - expectAutoGeneratedFunctions(Book, {singular: 'page', plural: 'pages'}); - expectAutoGeneratedFunctions(Page, {singular: 'book'}); + expectAutoGeneratedFunctions(Book, { singular: 'page', plural: 'pages' }); + expectAutoGeneratedFunctions(Page, { singular: 'book' }); }); describe('create()', () => { - it('should create instances and relation between', () => - Promise.all([ - Book.create(sherlockHolmesBook, {include: [Page]}) - .then(book => { - - assertInstance(book, sherlockHolmesBook); - }), - Page.create(page1, {include: [Book]}) - .then(page => { - - assertInstance(page, page1); - }) - ]) - ); + Book.create(sherlockHolmesBook, { include: [Page] }).then((book) => { + assertInstance(book, sherlockHolmesBook); + }), + Page.create(page1, { include: [Book] }).then((page) => { + assertInstance(page, page1); + }), + ])); it('should create instances without relation', () => - Book - .create({ - title: 'Sherlock Holmes', - pages: [ - {content: 'Watson'}, - {content: 'Moriaty'}, - ] - }) - .then(book => { - - expect(book) - .to.have.property('id') - .that.is.not.null; - - expect(book) - .not.to.have.property('pages'); - }) - ); + Book.create({ + title: 'Sherlock Holmes', + pages: [{ content: 'Watson' }, { content: 'Moriaty' }], + }).then((book) => { + expect(book).to.have.property('id').that.is.not.null; + + expect(book).not.to.have.property('pages'); + })); }); describe('findByPk()', () => { - it('should find instances with related instances', () => - Promise.all([ - Book.create(sherlockHolmesBook, {include: [Page]}) - .then(book => Book.findByPk(book.id, {include: [Page]})) - .then(book => { - + Book.create(sherlockHolmesBook, { include: [Page] }) + .then((book) => Book.findByPk(book.id, { include: [Page] })) + .then((book) => { assertInstance(book, sherlockHolmesBook); }), - Page.create(page1, {include: [Book]}) - .then(page => Page.findByPk(page.id, {include: [Book]})) - .then(page => { - + Page.create(page1, { include: [Book] }) + .then((page) => Page.findByPk(page.id, { include: [Book] })) + .then((page) => { assertInstance(page, page1); - }) - ]) - ); + }), + ])); }); describe('findOne()', () => { - it('should find instances with related instances', () => - Promise.all([ - Book.create(sherlockHolmesBook, {include: [Page]}) - .then(book => Book.findOne({include: [Page], where: {id: book.id}})) - .then(book => { - + Book.create(sherlockHolmesBook, { include: [Page] }) + .then((book) => Book.findOne({ include: [Page], where: { id: book.id } })) + .then((book) => { assertInstance(book, sherlockHolmesBook); }), - Page.create(page1, {include: [Book]}) - .then(page => Page.findOne({include: [Book], where: {id: page.id}})) - .then(page => { - + Page.create(page1, { include: [Book] }) + .then((page) => Page.findOne({ include: [Book], where: { id: page.id } })) + .then((page) => { assertInstance(page, page1); - }) - ]) - ); + }), + ])); }); describe('findAll()', () => { - it('should find instances with related instances', () => - Promise.all([ - Book.create(sherlockHolmesBook, {include: [Page]}) - .then(book => Book.findAll({include: [Page], where: {id: book.id}})) - .then(books => { - + Book.create(sherlockHolmesBook, { include: [Page] }) + .then((book) => Book.findAll({ include: [Page], where: { id: book.id } })) + .then((books) => { assertInstance(books[0], sherlockHolmesBook); }), - Page.create(page1, {include: [Book]}) - .then(page => Page.findAll({include: [Book], where: {id: page.id}})) - .then(pages => { - + Page.create(page1, { include: [Book] }) + .then((page) => Page.findAll({ include: [Book], where: { id: page.id } })) + .then((pages) => { assertInstance(pages[0], page1); - }) - ]) - ); + }), + ])); }); describe('$get', () => { - it('should get related instances of source instance', () => - - Book.create(sherlockHolmesBook, {include: [Page]}) - .then(book => Book.findByPk(book.id)) - .then(book => - book - .$get('pages') - .then(pages => { - - assertInstance(pages, sherlockHolmesBook.pages); - }) - ) - ); + Book.create(sherlockHolmesBook, { include: [Page] }) + .then((book) => Book.findByPk(book.id)) + .then((book) => + book.$get('pages').then((pages) => { + assertInstance(pages, sherlockHolmesBook.pages); + }) + )); it('should get related instance of source instance', () => - - Page.create(page1, {include: [Book]}) - .then(page => Page.findByPk(page.id)) - .then(page => - page - .$get('book') - .then(book => { - - assertInstance(book, page1.book); - }) - ) - ); + Page.create(page1, { include: [Book] }) + .then((page) => Page.findByPk(page.id)) + .then((page) => + page.$get('book').then((book) => { + assertInstance(book, page1.book); + }) + )); }); describe('$set', () => { - it('should set relation between specified instances and source instance', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Page.create(page2), - Page.create(page3) - ]) - .then(([book, ...pages]) => + Promise.all([Book.create(jsForDummiesBook), Page.create(page2), Page.create(page3)]).then( + ([book, ...pages]) => book .$set('pages', pages) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - - assertInstance(_book, Object.assign({pages: [page2, page3]}, jsForDummiesBook)); + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { + assertInstance(_book, Object.assign({ pages: [page2, page3] }, jsForDummiesBook)); }) - ) - ); + )); it('should override previous relations', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Page.create(page2), - Page.create(page3), - Page.create(page4), - Page.create(page5), - ]) - .then(([book, pageA, pageB, pageC, pageD]) => - book - .$set('pages', [pageA, pageB]) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - - assertInstance(_book, Object.assign({pages: [page2, page3]}, jsForDummiesBook)); - }) - // override previous pages - .then(() => book.$set('pages', [pageC, pageD])) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - - // and check, if there are overridden - assertInstance(_book, Object.assign({pages: [page4, page5]}, jsForDummiesBook)); - }) - ) - ); + Promise.all([ + Book.create(jsForDummiesBook), + Page.create(page2), + Page.create(page3), + Page.create(page4), + Page.create(page5), + ]).then(([book, pageA, pageB, pageC, pageD]) => + book + .$set('pages', [pageA, pageB]) + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { + assertInstance(_book, Object.assign({ pages: [page2, page3] }, jsForDummiesBook)); + }) + // override previous pages + .then(() => book.$set('pages', [pageC, pageD])) + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { + // and check, if there are overridden + assertInstance(_book, Object.assign({ pages: [page4, page5] }, jsForDummiesBook)); + }) + )); it('should set relation between specified instance and source instance', () => - - Promise - .all([ - Page.create(page2), - Book.create(jsForDummiesBook) - ]) - .then(([page, book]) => - page - .$set('book', book) - .then(() => Page.findByPk(page.id, {include: [Book]})) - .then(_page => { - - assertInstance(_page, Object.assign({book: jsForDummiesBook}, page2)); - }) - ) - ); + Promise.all([Page.create(page2), Book.create(jsForDummiesBook)]).then(([page, book]) => + page + .$set('book', book) + .then(() => Page.findByPk(page.id, { include: [Book] })) + .then((_page) => { + assertInstance(_page, Object.assign({ book: jsForDummiesBook }, page2)); + }) + )); it('should override previous relation', () => - - Promise - .all([ - Page.create(page2), - Book.create(jsForDummiesBook), - Book.create(crimeAndPunishmentBook), - ]) - .then(([page, bookA, bookB]) => - page - .$set('book', bookA) - .then(() => Page.findByPk(page.id, {include: [Book]})) - .then(_page => { - - assertInstance(_page, Object.assign({book: jsForDummiesBook}, page2)); - }) - .then(() => page.$set('book', bookB)) - .then(() => Page.findByPk(page.id, {include: [Book]})) - .then(_page => { - - assertInstance(_page, Object.assign({book: crimeAndPunishmentBook}, page2)); - }) - ) - ); + Promise.all([ + Page.create(page2), + Book.create(jsForDummiesBook), + Book.create(crimeAndPunishmentBook), + ]).then(([page, bookA, bookB]) => + page + .$set('book', bookA) + .then(() => Page.findByPk(page.id, { include: [Book] })) + .then((_page) => { + assertInstance(_page, Object.assign({ book: jsForDummiesBook }, page2)); + }) + .then(() => page.$set('book', bookB)) + .then(() => Page.findByPk(page.id, { include: [Book] })) + .then((_page) => { + assertInstance(_page, Object.assign({ book: crimeAndPunishmentBook }, page2)); + }) + )); }); describe('$add', () => { - it('should add relation between specified instance and source instance', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Page.create(page2), - ]) - .then(([book, page]) => - book - .$add('page', page) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - - assertInstance(_book, Object.assign({pages: [page2]}, jsForDummiesBook)); - }) - ) - ); + Promise.all([Book.create(jsForDummiesBook), Page.create(page2)]).then(([book, page]) => + book + .$add('page', page) + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { + assertInstance(_book, Object.assign({ pages: [page2] }, jsForDummiesBook)); + }) + )); it('should add relations between specified instance and source instance', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Page.create(page2), - Page.create(page3), - ]) - .then(([book, ...pages]) => + Promise.all([Book.create(jsForDummiesBook), Page.create(page2), Page.create(page3)]).then( + ([book, ...pages]) => book .$add('pages', pages) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - - assertInstance(_book, Object.assign({pages: [page2, page3]}, jsForDummiesBook)); + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { + assertInstance(_book, Object.assign({ pages: [page2, page3] }, jsForDummiesBook)); }) - ) - ); + )); it('should not override previous relations', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Page.create(page2), - Page.create(page3), - ]) - .then(([book, pageA, pageB]) => + Promise.all([Book.create(jsForDummiesBook), Page.create(page2), Page.create(page3)]).then( + ([book, pageA, pageB]) => book .$add('page', pageA) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - - assertInstance(_book, Object.assign({pages: [page2]}, jsForDummiesBook)); + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { + assertInstance(_book, Object.assign({ pages: [page2] }, jsForDummiesBook)); }) // now we add another page .then(() => book.$add('page', pageB)) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { // ... and check, if both pages exist - assertInstance(_book, Object.assign({pages: [page2, page3]}, jsForDummiesBook)); + assertInstance(_book, Object.assign({ pages: [page2, page3] }, jsForDummiesBook)); }) - ) - ); + )); }); describe('$create', () => { - it('should create new instance and add relation between new instance and source instance (has many)', () => - - Book.create(jsForDummiesBook) - .then((book) => - book - .$create('page', page2) - .then(page => { - - assertInstance(page, page2); - }) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - - assertInstance(_book, Object.assign({pages: [page2]}, jsForDummiesBook)); - }) - ) - ); + Book.create(jsForDummiesBook).then((book) => + book + .$create('page', page2) + .then((page) => { + assertInstance(page, page2); + }) + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { + assertInstance(_book, Object.assign({ pages: [page2] }, jsForDummiesBook)); + }) + )); it('should create new instance and add relation between new instance and source instance (belongs to)', () => - - Page.create(page3) - .then((page) => - page - .$create('book', jsForDummiesBook) - .then(() => Page.findByPk(page.id, {include: [Book]})) - .then(_page => { - - assertInstance(_page, Object.assign({book: jsForDummiesBook}, page3)); - }) - ) - ); - + Page.create(page3).then((page) => + page + .$create('book', jsForDummiesBook) + .then(() => Page.findByPk(page.id, { include: [Book] })) + .then((_page) => { + assertInstance(_page, Object.assign({ book: jsForDummiesBook }, page3)); + }) + )); }); describe('$has', () => { - it('should return true due to relation between specified instances and source instance', () => - - Book.create(sherlockHolmesBook, {include: [Page]}) - .then((book) => - Book - .findByPk(book.id) - .then(_book => _book.$has('pages', book.pages)) - .then(result => { - - expect(result).to.be.true; - }) - ) - ); + Book.create(sherlockHolmesBook, { include: [Page] }).then((book) => + Book.findByPk(book.id) + .then((_book) => _book.$has('pages', book.pages)) + .then((result) => { + expect(result).to.be.true; + }) + )); it('should return false due to no relation between specified instance and source instance', () => - - Promise - .all([ - Book.create(sherlockHolmesBook, {include: [Page]}), - Page.create(page3) - ]) - .then(([book, page]) => - Book - .findByPk(book.id) - .then(_book => _book.$has('pages', page)) - .then(result => { - - expect(result).to.be.false; - }) - ) - ); - + Promise.all([ + Book.create(sherlockHolmesBook, { include: [Page] }), + Page.create(page3), + ]).then(([book, page]) => + Book.findByPk(book.id) + .then((_book) => _book.$has('pages', page)) + .then((result) => { + expect(result).to.be.false; + }) + )); }); describe('$count', () => { - it('should return number of specified relations', () => - - Book.create(sherlockHolmesBook, {include: [Page]}) - .then((book) => - Book - .findByPk(book.id) - .then(_book => _book.$count('pages')) - .then(result => { - - expect(result).to.equal(sherlockHolmesBook.pages.length); - }) - ) - ); + Book.create(sherlockHolmesBook, { include: [Page] }).then((book) => + Book.findByPk(book.id) + .then((_book) => _book.$count('pages')) + .then((result) => { + expect(result).to.equal(sherlockHolmesBook.pages.length); + }) + )); it('should return 0, since source instance has no relations', () => - - Book.create(sherlockHolmesBook) - .then((book) => - Book - .findByPk(book.id) - .then(_book => _book.$count('pages')) - .then(result => { - - expect(result).to.equal(0); - }) - ) - ); - - + Book.create(sherlockHolmesBook).then((book) => + Book.findByPk(book.id) + .then((_book) => _book.$count('pages')) + .then((result) => { + expect(result).to.equal(0); + }) + )); }); describe('$remove', () => { - it('should remove relation between specified instance and source instance', () => + Book.create(sherlockHolmesBook, { include: [Page] }).then((book) => + Book.findByPk(book.id, { include: [Page] }) + .then((_book) => { + assertInstance(_book, sherlockHolmesBook); - Book.create(sherlockHolmesBook, {include: [Page]}) - .then((book) => - Book - .findByPk(book.id, {include: [Page]}) - .then(_book => { - - assertInstance(_book, sherlockHolmesBook); - - return _book.$remove('page', _book.pages[0]); - }) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - - assertInstance(_book, { - title: sherlockHolmesBook.title, - pages: [sherlockHolmesBook.pages[1]] - }); - }) - ) - ); + return _book.$remove('page', _book.pages[0]); + }) + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { + assertInstance(_book, { + title: sherlockHolmesBook.title, + pages: [sherlockHolmesBook.pages[1]], + }); + }) + )); it('should remove relations between specified instances and source instance', () => + Book.create(sherlockHolmesBook, { include: [Page] }).then((book) => + Book.findByPk(book.id, { include: [Page] }) + .then((_book) => { + assertInstance(_book, sherlockHolmesBook); - Book.create(sherlockHolmesBook, {include: [Page]}) - .then((book) => - Book - .findByPk(book.id, {include: [Page]}) - .then(_book => { - - assertInstance(_book, sherlockHolmesBook); - - return _book.$remove('pages', _book.pages); - }) - .then(() => Book.findByPk(book.id, {include: [Page]})) - .then(_book => { - - assertInstance(_book, { - title: sherlockHolmesBook.title - }); - }) - ) - ); + return _book.$remove('pages', _book.pages); + }) + .then(() => Book.findByPk(book.id, { include: [Page] })) + .then((_book) => { + assertInstance(_book, { + title: sherlockHolmesBook.title, + }); + }) + )); }); } describe('resolve foreign keys automatically', () => { - @Table - class Book extends Model implements BookModel { - + class Book extends Model implements BookModel { @Column title: string; @@ -588,8 +432,7 @@ describe('association', () => { } @Table - class Page extends Model implements PageModel { - + class Page extends Model implements PageModel { @Column(DataType.TEXT) content: string; @@ -604,10 +447,8 @@ describe('association', () => { }); describe('set foreign keys explicitly', () => { - @Table - class Book2 extends Model implements BookModel { - + class Book2 extends Model implements BookModel { @Column title: string; @@ -618,8 +459,7 @@ describe('association', () => { } @Table - class Page2 extends Model implements PageModel { - + class Page2 extends Model implements PageModel { @Column(DataType.TEXT) content: string; @@ -632,13 +472,17 @@ describe('association', () => { oneToManyTestSuites(Book2, Page2); }); - function oneToManyWithOptionsTestSuites(Book: typeof BookModel, Page: typeof PageModel, alternateName: boolean = false): void { + function oneToManyWithOptionsTestSuites( + Book: typeof BookModel, + Page: typeof PageModel, + alternateName = false + ): void { const foreignKey = alternateName ? 'book_id' : 'bookId'; before(() => sequelize.addModels([Page, Book])); beforeEach(() => { - return sequelize.sync({force: true}); + return sequelize.sync({ force: true }); }); it('should create models with specified relations', () => { @@ -646,33 +490,29 @@ describe('association', () => { .to.have.property('associations') .that.has.property('pages') .that.is.an.instanceOf(Association['HasMany']) - .which.includes({foreignKey}) + .which.includes({ foreignKey }) .and.has.property('foreignKeyAttribute') - .which.includes({allowNull: false, name: foreignKey}) - ; + .which.includes({ allowNull: false, name: foreignKey }); expect(Book) .to.have.property('associations') .that.has.property('pages') .that.has.property('options') - .with.property('onDelete', 'CASCADE') - ; + .with.property('onDelete', 'CASCADE'); expect(Page) .to.have.property('associations') .that.has.property('book') .that.is.an.instanceOf(Association['BelongsTo']) - .which.includes({foreignKey}) + .which.includes({ foreignKey }) .and.has.property('foreignKeyAttribute') - .which.includes({allowNull: false, name: foreignKey}) - ; + .which.includes({ allowNull: false, name: foreignKey }); expect(Page) .to.have.property('associations') .that.has.property('book') .that.has.property('options') - .with.property('onDelete', 'CASCADE') - ; + .with.property('onDelete', 'CASCADE'); }); describe('create()', () => { @@ -680,63 +520,59 @@ describe('association', () => { const page = { content: 'written by Oscar Wilde', book: { - title: 'The Picture of Dorian Gray' - } + title: 'The Picture of Dorian Gray', + }, }; - return Page.create(page, {include: [Book]}) - .catch(err => - expect(err.message) - .to.match(new RegExp(`^notNull Violation: (${Page.name}.${foreignKey}|${foreignKey}) cannot be null$`))); + return Page.create(page, { include: [Book] }).catch((err) => + expect(err.message).to.match( + new RegExp( + `^notNull Violation: (${Page.name}.${foreignKey}|${foreignKey}) cannot be null$` + ) + ) + ); }); it('should create instances that require a parent primary key', () => { const book = { title: 'Sherlock Holmes', - pages: [ - {content: 'Watson'}, - {content: 'Moriaty'}, - ] + pages: [{ content: 'Watson' }, { content: 'Moriaty' }], }; - return Book.create(book, {include: [Page]}) - .then((actual: any) => { - expect(actual.id).to.be.gt(0); - expect(actual.title).to.eq(book.title); - expect(actual.pages).to.have.lengthOf(2); - expect(actual.pages[0].id).to.be.gt(0); - expect(actual.pages[0].content).to.eq(book.pages[0].content); - expect(actual.pages[1].id).to.be.gt(0); - expect(actual.pages[1].content).to.eq(book.pages[1].content); - }); + return Book.create(book, { include: [Page] }).then((actual: any) => { + expect(actual.id).to.be.gt(0); + expect(actual.title).to.eq(book.title); + expect(actual.pages).to.have.lengthOf(2); + expect(actual.pages[0].id).to.be.gt(0); + expect(actual.pages[0].content).to.eq(book.pages[0].content); + expect(actual.pages[1].id).to.be.gt(0); + expect(actual.pages[1].content).to.eq(book.pages[1].content); + }); }); }); } describe('resolve foreign keys automatically with association options', () => { - @Table - class Book3 extends Model implements BookModel { - + class Book3 extends Model implements BookModel { @Column title: string; authors: any[]; - @HasMany(() => Page3, {foreignKey: {allowNull: false}, onDelete: 'CASCADE'}) + @HasMany(() => Page3, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' }) pages: Page3[]; } @Table - class Page3 extends Model implements PageModel { - + class Page3 extends Model implements PageModel { @Column(DataType.TEXT) content: string; @ForeignKey(() => Book3) bookId: number; - @BelongsTo(() => Book3, {foreignKey: {allowNull: false}, onDelete: 'CASCADE'}) + @BelongsTo(() => Book3, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' }) book: Book3; } @@ -744,29 +580,32 @@ describe('association', () => { }); describe('set foreign keys explicitly with association options', () => { - @Table - class Book4 extends Model implements BookModel { - + class Book4 extends Model implements BookModel { @Column title: string; authors: any[]; - @HasMany(() => Page4, {foreignKey: {allowNull: false, name: 'book_id'}, onDelete: 'CASCADE'}) + @HasMany(() => Page4, { + foreignKey: { allowNull: false, name: 'book_id' }, + onDelete: 'CASCADE', + }) pages: Page4[]; } @Table - class Page4 extends Model implements PageModel { - + class Page4 extends Model implements PageModel { @Column(DataType.TEXT) content: string; @ForeignKey(() => Book4) bookId: number; - @BelongsTo(() => Book4, {foreignKey: {allowNull: false, name: 'book_id'}, onDelete: 'CASCADE'}) + @BelongsTo(() => Book4, { + foreignKey: { allowNull: false, name: 'book_id' }, + onDelete: 'CASCADE', + }) book: Book4; } @@ -774,28 +613,25 @@ describe('association', () => { }); describe('set foreign keys explicitly via options', () => { - @Table - class Book5 extends Model implements BookModel { - + class Book5 extends Model implements BookModel { @Column title: string; authors: any[]; - @HasMany(() => Page5, {foreignKey: 'bookId'}) + @HasMany(() => Page5, { foreignKey: 'bookId' }) pages: Page5[]; } @Table - class Page5 extends Model implements PageModel { - + class Page5 extends Model implements PageModel { @Column(DataType.TEXT) content: string; bookId: number; - @BelongsTo(() => Book5, {foreignKey: 'bookId'}) + @BelongsTo(() => Book5, { foreignKey: 'bookId' }) book: Book5; } @@ -803,30 +639,29 @@ describe('association', () => { }); it('Should throw error when trying to resolve associations with uninitialized Models', () => { - const _sequelize = createSequelize(false); @Table - class Friend extends Model { - } + class Friend extends Model {} @Table - class User extends Model { - + class User extends Model { @HasOne(() => Friend, 'userId') friend: Friend; } - expect(() => - _sequelize.addModels([User]) - ).to.throw(new RegExp('Friend has not been defined')); + expect(() => _sequelize.addModels([User])).to.throw( + new RegExp('Friend has not been defined') + ); }); }); describe('Many-to-many', () => { - - function manyToManyTestSuites(Book: typeof BookModel, Author: typeof AuthorModel, AuthorBook?: typeof ConcreteModel): void { - + function manyToManyTestSuites( + Book: typeof BookModel, + Author: typeof AuthorModel, + AuthorBook?: typeof ConcreteModel + ): void { const models: Array = [Book, Author]; if (AuthorBook) { @@ -835,449 +670,321 @@ describe('association', () => { const sherlockHolmesBook = { title: 'Sherlock Holmes', - authors: [ - {name: 'Sir Arthur Conan Doyle'}, - {name: 'No Ghost'}, - ] + authors: [{ name: 'Sir Arthur Conan Doyle' }, { name: 'No Ghost' }], }; const julesVerne = { name: 'Jules Verne', books: [ - {title: 'Journey to the Center of the Earth'}, - {title: 'Twenty Thousand Leagues Under the Sea'}, - ] + { title: 'Journey to the Center of the Earth' }, + { title: 'Twenty Thousand Leagues Under the Sea' }, + ], }; before(() => sequelize.addModels(models)); - beforeEach(() => sequelize.sync({force: true})); + beforeEach(() => sequelize.sync({ force: true })); it('should create models with specified relations', () => { - expect(Book) .to.have.property('associations') .that.has.property('authors') .that.is.an.instanceOf(Association['BelongsToMany']) - .and.has.property('foreignKey', 'bookId') - ; + .and.has.property('foreignKey', 'bookId'); expect(Author) .to.have.property('associations') .that.has.property('books') .that.is.an.instanceOf(Association['BelongsToMany']) - .and.has.property('foreignKey', 'authorId') - ; + .and.has.property('foreignKey', 'authorId'); }); it('should create models with generated functions on its prototype', () => { - - expectAutoGeneratedFunctions(Book, {singular: 'author', plural: 'authors'}); - expectAutoGeneratedFunctions(Author, {singular: 'book', plural: 'books'}); + expectAutoGeneratedFunctions(Book, { singular: 'author', plural: 'authors' }); + expectAutoGeneratedFunctions(Author, { singular: 'book', plural: 'books' }); }); describe('create()', () => { - it('should create instances and relation between', () => - Promise.all([ - Book.create(sherlockHolmesBook, {include: [Author]}) - .then(book => { - - assertInstance(book, sherlockHolmesBook); - }), - Author.create(julesVerne, {include: [Book]}) - .then(author => { - - assertInstance(author, julesVerne); - }) - ]) - ); + Book.create(sherlockHolmesBook, { include: [Author] }).then((book) => { + assertInstance(book, sherlockHolmesBook); + }), + Author.create(julesVerne, { include: [Book] }).then((author) => { + assertInstance(author, julesVerne); + }), + ])); it('should create instances without relation', () => - Author.create(julesVerne) - .then(author => { - - assertInstance(author, {name: julesVerne.name}); - }) - ); + Author.create(julesVerne).then((author) => { + assertInstance(author, { name: julesVerne.name }); + })); }); describe('findByPk()', () => { - it('should find instances with related instances', () => - Promise.all([ - Book.create(sherlockHolmesBook, {include: [Author]}) - .then(book => Book.findByPk(book.id, {include: [Author]})) - .then(book => { - + Book.create(sherlockHolmesBook, { include: [Author] }) + .then((book) => Book.findByPk(book.id, { include: [Author] })) + .then((book) => { assertInstance(book, sherlockHolmesBook); }), - Author.create(julesVerne, {include: [Book]}) - .then(author => Author.findByPk(author.id, {include: [Book]})) - .then(author => { - + Author.create(julesVerne, { include: [Book] }) + .then((author) => Author.findByPk(author.id, { include: [Book] })) + .then((author) => { assertInstance(author, julesVerne); - }) - ]) - ); + }), + ])); }); describe('findOne()', () => { - it('should find instances with related instances', () => - Promise.all([ - Book.create(sherlockHolmesBook, {include: [Author]}) - .then(book => Book.findOne({include: [Author], where: {id: book.id}})) - .then(book => { - + Book.create(sherlockHolmesBook, { include: [Author] }) + .then((book) => Book.findOne({ include: [Author], where: { id: book.id } })) + .then((book) => { assertInstance(book, sherlockHolmesBook); }), - Author.create(julesVerne, {include: [Book]}) - .then(author => Author.findOne({include: [Book], where: {id: author.id}})) - .then(author => { - + Author.create(julesVerne, { include: [Book] }) + .then((author) => Author.findOne({ include: [Book], where: { id: author.id } })) + .then((author) => { assertInstance(author, julesVerne); - }) - ]) - ); + }), + ])); }); describe('findAll()', () => { - it('should find instances with related instances', () => - Promise.all([ - Book.create(sherlockHolmesBook, {include: [Author]}) - .then(book => Book.findAll({include: [Author], where: {id: book.id}})) - .then(books => { - + Book.create(sherlockHolmesBook, { include: [Author] }) + .then((book) => Book.findAll({ include: [Author], where: { id: book.id } })) + .then((books) => { assertInstance(books[0], sherlockHolmesBook); }), - Author.create(julesVerne, {include: [Book]}) - .then(author => Author.findAll({include: [Book], where: {id: author.id}})) - .then(authors => { - + Author.create(julesVerne, { include: [Book] }) + .then((author) => Author.findAll({ include: [Book], where: { id: author.id } })) + .then((authors) => { assertInstance(authors[0], julesVerne); - }) - ]) - ); + }), + ])); }); describe('$get', () => { - it('should get related instances of source instance', () => - - Promise - .all([ - Book.create(sherlockHolmesBook, {include: [Author]}) - .then(book => Book.findByPk(book.id)) - .then(book => - book - .$get('authors') - .then(authors => { - - assertInstance(authors, sherlockHolmesBook.authors); - }) - ), - Author.create(julesVerne, {include: [Book]}) - .then(author => Author.findByPk(author.id)) - .then(author => - author - .$get('books') - .then(books => { - - assertInstance(books, julesVerne.books); - }) - ) - - ]) - ); + Promise.all([ + Book.create(sherlockHolmesBook, { include: [Author] }) + .then((book) => Book.findByPk(book.id)) + .then((book) => + book.$get('authors').then((authors) => { + assertInstance(authors, sherlockHolmesBook.authors); + }) + ), + Author.create(julesVerne, { include: [Book] }) + .then((author) => Author.findByPk(author.id)) + .then((author) => + author.$get('books').then((books) => { + assertInstance(books, julesVerne.books); + }) + ), + ])); }); describe('$set', () => { - it('should set relation between specified instances and source instance', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Author.create(elisa), - Author.create(robin) - ]) - .then(([book, ...authors]) => - book - .$set('authors', authors) - .then(() => Book.findByPk(book.id, {include: [Author]})) - .then(_book => { - - assertInstance(_book, Object.assign({authors: [elisa, robin]}, jsForDummiesBook)); - }) - ) - ); + Promise.all([ + Book.create(jsForDummiesBook), + Author.create(elisa), + Author.create(robin), + ]).then(([book, ...authors]) => + book + .$set('authors', authors) + .then(() => Book.findByPk(book.id, { include: [Author] })) + .then((_book) => { + assertInstance(_book, Object.assign({ authors: [elisa, robin] }, jsForDummiesBook)); + }) + )); it('should override previous relations', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Author.create(elisa), - Author.create(nelly), - Author.create(brom), - Author.create(robin), - ]) - .then(([book, _elisa, _nelly, _brom, _robin]) => - book - .$set('authors', [_elisa, _nelly]) - .then(() => Book.findByPk(book.id, {include: [Author]})) - .then(_book => { - - assertInstance(_book, Object.assign({authors: [elisa, nelly]}, jsForDummiesBook)); - }) - // override previous authors - .then(() => book.$set('authors', [_brom, _robin])) - .then(() => Book.findByPk(book.id, {include: [Author]})) - .then(_book => { - - // and check, if there are overridden - assertInstance(_book, Object.assign({authors: [brom, robin]}, jsForDummiesBook)); - }) - ) - ); - + Promise.all([ + Book.create(jsForDummiesBook), + Author.create(elisa), + Author.create(nelly), + Author.create(brom), + Author.create(robin), + ]).then(([book, _elisa, _nelly, _brom, _robin]) => + book + .$set('authors', [_elisa, _nelly]) + .then(() => Book.findByPk(book.id, { include: [Author] })) + .then((_book) => { + assertInstance(_book, Object.assign({ authors: [elisa, nelly] }, jsForDummiesBook)); + }) + // override previous authors + .then(() => book.$set('authors', [_brom, _robin])) + .then(() => Book.findByPk(book.id, { include: [Author] })) + .then((_book) => { + // and check, if there are overridden + assertInstance(_book, Object.assign({ authors: [brom, robin] }, jsForDummiesBook)); + }) + )); }); describe('$add', () => { - it('should add relation between specified instance and source instance', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Author.create(elisa), - ]) - .then(([book, _elisa]) => + Promise.all([Book.create(jsForDummiesBook), Author.create(elisa)]).then( + ([book, _elisa]) => book .$add('author', _elisa) - .then(() => Book.findByPk(book.id, {include: [Author]})) - .then(_book => { - - assertInstance(_book, Object.assign({authors: [elisa]}, jsForDummiesBook)); + .then(() => Book.findByPk(book.id, { include: [Author] })) + .then((_book) => { + assertInstance(_book, Object.assign({ authors: [elisa] }, jsForDummiesBook)); }) - ) - ); + )); it('should add relations between specified instance and source instance', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Author.create(elisa), - Author.create(brom), - ]) - .then(([book, ...authors]) => - book - .$add('authors', authors) - .then(() => Book.findByPk(book.id, {include: [Author]})) - .then(_book => { - - assertInstance(_book, Object.assign({authors: [elisa, brom]}, jsForDummiesBook)); - }) - ) - ); + Promise.all([ + Book.create(jsForDummiesBook), + Author.create(elisa), + Author.create(brom), + ]).then(([book, ...authors]) => + book + .$add('authors', authors) + .then(() => Book.findByPk(book.id, { include: [Author] })) + .then((_book) => { + assertInstance(_book, Object.assign({ authors: [elisa, brom] }, jsForDummiesBook)); + }) + )); it('should not override previous relations', () => - - Promise - .all([ - Book.create(jsForDummiesBook), - Author.create(elisa), - Author.create(brom), - ]) - .then(([book, _elisa, _brom]) => - book - .$add('author', _elisa) - .then(() => Book.findByPk(book.id, {include: [Author]})) - .then(_book => { - - assertInstance(_book, Object.assign({authors: [elisa]}, jsForDummiesBook)); - }) - // now we add another author - .then(() => book.$add('author', _brom)) - .then(() => Book.findByPk(book.id, {include: [Author]})) - .then(_book => { - - // ... and check, if both authors exist - assertInstance(_book, Object.assign({authors: [elisa, brom]}, jsForDummiesBook)); - }) - ) - ); + Promise.all([ + Book.create(jsForDummiesBook), + Author.create(elisa), + Author.create(brom), + ]).then(([book, _elisa, _brom]) => + book + .$add('author', _elisa) + .then(() => Book.findByPk(book.id, { include: [Author] })) + .then((_book) => { + assertInstance(_book, Object.assign({ authors: [elisa] }, jsForDummiesBook)); + }) + // now we add another author + .then(() => book.$add('author', _brom)) + .then(() => Book.findByPk(book.id, { include: [Author] })) + .then((_book) => { + // ... and check, if both authors exist + assertInstance(_book, Object.assign({ authors: [elisa, brom] }, jsForDummiesBook)); + }) + )); }); describe('$create', () => { - it('should create new instance and add relation between new instance and source instance (has many)', () => - - Book.create(jsForDummiesBook) - .then((book) => - book - .$create('author', elisa) - .then(author => { - - assertInstance(author, elisa); - }) - .then(() => Book.findByPk(book.id, {include: [Author]})) - .then(_book => { - - assertInstance(_book, Object.assign({authors: [elisa]}, jsForDummiesBook)); - }) - ) - ); + Book.create(jsForDummiesBook).then((book) => + book + .$create('author', elisa) + .then((author) => { + assertInstance(author, elisa); + }) + .then(() => Book.findByPk(book.id, { include: [Author] })) + .then((_book) => { + assertInstance(_book, Object.assign({ authors: [elisa] }, jsForDummiesBook)); + }) + )); it('should create new instance and add relation between new instance and source instance (belongs to)', () => - - Author.create(elisa) - .then((author) => - author - .$create('book', jsForDummiesBook) - .then(book => { - - assertInstance(book, jsForDummiesBook); - }) - .then(() => Author.findByPk(author.id, {include: [Book]})) - .then(_author => { - - assertInstance(_author, Object.assign({books: [jsForDummiesBook]}, elisa)); - }) - ) - ); - + Author.create(elisa).then((author) => + author + .$create('book', jsForDummiesBook) + .then((book) => { + assertInstance(book, jsForDummiesBook); + }) + .then(() => Author.findByPk(author.id, { include: [Book] })) + .then((_author) => { + assertInstance(_author, Object.assign({ books: [jsForDummiesBook] }, elisa)); + }) + )); }); describe('$has', () => { - it('should return true due to relation between specified instances and source instance', () => - - Book.create(sherlockHolmesBook, {include: [Author]}) - .then((book) => - Book - .findByPk(book.id) - .then(_book => _book.$has('authors', book.authors)) - .then(result => { - - expect(result).to.be.true; - }) - ) - ); + Book.create(sherlockHolmesBook, { include: [Author] }).then((book) => + Book.findByPk(book.id) + .then((_book) => _book.$has('authors', book.authors)) + .then((result) => { + expect(result).to.be.true; + }) + )); it('should return false due to no relation between specified instance and source instance', () => - - Promise - .all([ - Book.create(sherlockHolmesBook, {include: [Author]}), - Author.create(elisa) - ]) - .then(([book, author]) => - Book - .findByPk(book.id) - .then(_book => _book.$has('authors', author)) - .then(result => { - - expect(result).to.be.false; - }) - ) - ); - + Promise.all([ + Book.create(sherlockHolmesBook, { include: [Author] }), + Author.create(elisa), + ]).then(([book, author]) => + Book.findByPk(book.id) + .then((_book) => _book.$has('authors', author)) + .then((result) => { + expect(result).to.be.false; + }) + )); }); describe('$count', () => { - it('should return number of specified relations', () => - - Book.create(sherlockHolmesBook, {include: [Author]}) - .then((book) => - Book - .findByPk(book.id) - .then(_book => _book.$count('authors')) - .then(result => { - - expect(result).to.equal(sherlockHolmesBook.authors.length); - }) - ) - ); + Book.create(sherlockHolmesBook, { include: [Author] }).then((book) => + Book.findByPk(book.id) + .then((_book) => _book.$count('authors')) + .then((result) => { + expect(result).to.equal(sherlockHolmesBook.authors.length); + }) + )); it('should return 0, since source instance has no relations', () => - - Author.create(elisa) - .then((author) => - Author - .findByPk(author.id) - .then(_author => _author.$count('books')) - .then(result => { - - expect(result).to.equal(0); - }) - ) - ); - - + Author.create(elisa).then((author) => + Author.findByPk(author.id) + .then((_author) => _author.$count('books')) + .then((result) => { + expect(result).to.equal(0); + }) + )); }); describe('$remove', () => { - it('should remove relation between specified instance and source instance', () => + Book.create(sherlockHolmesBook, { include: [Author] }).then((book) => + Book.findByPk(book.id, { include: [Author] }) + .then((_book) => { + assertInstance(_book, sherlockHolmesBook); - Book.create(sherlockHolmesBook, {include: [Author]}) - .then((book) => - Book - .findByPk(book.id, {include: [Author]}) - .then(_book => { - - assertInstance(_book, sherlockHolmesBook); - - return _book.$remove('author', _book.authors[0]); - }) - .then(() => Book.findByPk(book.id, {include: [Author]})) - .then(_book => { - - assertInstance(_book, { - title: sherlockHolmesBook.title, - authors: [sherlockHolmesBook.authors[1]] - }); - }) - ) - ); + return _book.$remove('author', _book.authors[0]); + }) + .then(() => Book.findByPk(book.id, { include: [Author] })) + .then((_book) => { + assertInstance(_book, { + title: sherlockHolmesBook.title, + authors: [sherlockHolmesBook.authors[1]], + }); + }) + )); it('should remove relations between specified instances and source instance', () => + Author.create(julesVerne, { include: [Book] }).then((author) => + Author.findByPk(author.id, { include: [Book] }) + .then((_author) => { + assertInstance(_author, julesVerne); - Author.create(julesVerne, {include: [Book]}) - .then((author) => - Author - .findByPk(author.id, {include: [Book]}) - .then(_author => { - - assertInstance(_author, julesVerne); - - return _author.$remove('books', _author.books); - }) - .then(() => Author.findByPk(author.id, {include: [Book]})) - .then(_author => { - - assertInstance(_author, { - name: julesVerne.name - }); - }) - ) - ); + return _author.$remove('books', _author.books); + }) + .then(() => Author.findByPk(author.id, { include: [Book] })) + .then((_author) => { + assertInstance(_author, { + name: julesVerne.name, + }); + }) + )); }); } describe('resolve foreign keys automatically', () => { - @Table class Book extends BookModel { - @Column title: string; @@ -1286,19 +993,16 @@ describe('association', () => { } @Table - class AuthorBook extends Model { - + class AuthorBook extends Model { @ForeignKey(() => Book) bookId: number; @ForeignKey(() => Author) authorId: number; - } @Table - class Author extends Model { - + class Author extends Model { @Column name: string; @@ -1310,22 +1014,19 @@ describe('association', () => { }); describe('set foreign keys automatically via options', () => { - @Table class Book4 extends BookModel { - @Column title: string; @BelongsToMany(() => Author4, { - through: () => AuthorBook4 + through: () => AuthorBook4, }) authors: Author4[]; } @Table - class AuthorBook4 extends Model { - + class AuthorBook4 extends Model { @ForeignKey(() => Book4) bookId: number; @@ -1334,8 +1035,7 @@ describe('association', () => { } @Table - class Author4 extends Model { - + class Author4 extends Model { @Column name: string; @@ -1349,10 +1049,8 @@ describe('association', () => { }); describe('set foreign keys explicitly', () => { - @Table class Book2 extends BookModel { - @Column title: string; @@ -1361,8 +1059,7 @@ describe('association', () => { } @Table - class Author2 extends Model { - + class Author2 extends Model { @Column name: string; @@ -1374,10 +1071,8 @@ describe('association', () => { }); describe('set foreign keys explicitly via options', () => { - @Table class Book3 extends BookModel { - @Column title: string; @@ -1390,8 +1085,7 @@ describe('association', () => { } @Table - class Author3 extends Model { - + class Author3 extends Model { @Column name: string; @@ -1407,10 +1101,8 @@ describe('association', () => { }); describe('set through model via through options', () => { - @Table - class Book66 extends Model { - + class Book66 extends Model { @Column title: string; @@ -1419,14 +1111,13 @@ describe('association', () => { @BelongsToMany(() => Author66, { through: { model: () => AuthorBook66, - } + }, }) authors: Author66[]; } @Table - class AuthorBook66 extends Model { - + class AuthorBook66 extends Model { @ForeignKey(() => Book66) bookId: number; @@ -1435,15 +1126,14 @@ describe('association', () => { } @Table - class Author66 extends Model { - + class Author66 extends Model { @Column name: string; @BelongsToMany(() => Book66, { through: { model: () => AuthorBook66, - } + }, }) books: Book66[]; } @@ -1452,10 +1142,8 @@ describe('association', () => { }); describe('set through model string via through options', () => { - @Table - class Book66 extends Model { - + class Book66 extends Model { @Column title: string; @@ -1472,8 +1160,7 @@ describe('association', () => { } @Table - class Author66 extends Model { - + class Author66 extends Model { @Column name: string; @@ -1491,10 +1178,8 @@ describe('association', () => { }); describe('ThroughOptions', () => { - @Table - class User77 extends Model { - + class User77 extends Model { @Column name: string; @@ -1502,8 +1187,8 @@ describe('association', () => { through: { model: () => Subscription, scope: { - targetType: 'user' - } + targetType: 'user', + }, }, foreignKeyConstraint: true, foreignKey: 'subscriberId', @@ -1514,8 +1199,7 @@ describe('association', () => { } @Table - class Subscription extends Model { - + class Subscription extends Model { @PrimaryKey @ForeignKey(() => User77) @Column @@ -1533,39 +1217,33 @@ describe('association', () => { it('should set scope in pure sequelize association options', () => { expect(User77['associations'].usersSubscribedTo['through']) - .to.have.property('scope').that.eqls({targetType: 'user'}); + .to.have.property('scope') + .that.eqls({ targetType: 'user' }); }); - }); it('Should throw error when trying to resolve associations with uninitialized Models', () => { - const _sequelize = createSequelize(false); @Table - class UserFriend extends Model { - } + class UserFriend extends Model {} @Table - class Friend extends Model { - } + class Friend extends Model {} @Table - class User extends Model { - + class User extends Model { @BelongsToMany(() => Friend, () => UserFriend) friend: Friend; } - expect(() => - _sequelize.addModels([User, Friend]) - ).to.throw(new RegExp('UserFriend has not been defined')); + expect(() => _sequelize.addModels([User, Friend])).to.throw( + new RegExp('UserFriend has not been defined') + ); }); - }); describe('One-to-one', () => { - const userWithAddress = { name: 'Sherlock Holmes', address: { @@ -1573,7 +1251,7 @@ describe('association', () => { city: 'London', zipCode: '12345', country: 'England', - } + }, }; const emancipatedAddress = { @@ -1582,8 +1260,8 @@ describe('association', () => { zipCode: '12345', country: 'England', user: { - name: 'hng?' - } + name: 'hng?', + }, }; const petersAddress = { @@ -1600,12 +1278,12 @@ describe('association', () => { country: 'United States', }; - class AbstractUser extends Model { + class AbstractUser extends Model { name: string; address: AbstractAddress; } - class AbstractAddress extends Model { + class AbstractAddress extends Model { street: string; zipCode: string; city: string; @@ -1615,253 +1293,178 @@ describe('association', () => { } function oneToOneTestSuites(User: typeof AbstractUser, Address: typeof AbstractAddress): void { - before(() => sequelize.addModels([User, Address])); - beforeEach(() => sequelize.sync({force: true})); + beforeEach(() => sequelize.sync({ force: true })); it('should create models with specified relations', () => { - expect(User) .to.have.property('associations') .that.has.property('address') .that.is.an.instanceOf(Association['HasOne']) - .and.has.property('foreignKey', 'userId') - ; + .and.has.property('foreignKey', 'userId'); expect(Address) .to.have.property('associations') .that.has.property('user') .that.is.an.instanceOf(Association['BelongsTo']) - .and.has.property('foreignKey', 'userId') - ; + .and.has.property('foreignKey', 'userId'); }); it('should create models with generated functions on its prototype', () => { - - expectAutoGeneratedFunctions(User, {singular: 'address'}); - expectAutoGeneratedFunctions(Address, {singular: 'user'}); + expectAutoGeneratedFunctions(User, { singular: 'address' }); + expectAutoGeneratedFunctions(Address, { singular: 'user' }); }); describe('create()', () => { - it('should create instances and relation between', () => - Promise.all([ - User.create(userWithAddress, {include: [Address]}) - .then(user => { - - assertInstance(user, userWithAddress); - }), - Address.create(emancipatedAddress, {include: [User]}) - .then(address => { - - assertInstance(address, emancipatedAddress); - }) - ]) - ); + User.create(userWithAddress, { include: [Address] }).then((user) => { + assertInstance(user, userWithAddress); + }), + Address.create(emancipatedAddress, { include: [User] }).then((address) => { + assertInstance(address, emancipatedAddress); + }), + ])); it('should create instances without relation', () => - User - .create(userWithAddress) - .then(user => { - - expect(user) - .to.have.property('id') - .that.is.not.null; - - expect(user) - .not.to.have.property('address'); - }) - ); + User.create(userWithAddress).then((user) => { + expect(user).to.have.property('id').that.is.not.null; + + expect(user).not.to.have.property('address'); + })); }); describe('findByPk()', () => { - it('should find instances with related instances', () => - Promise.all([ - User.create(userWithAddress, {include: [Address]}) - .then(user => User.findByPk(user.id, {include: [Address]})) - .then(user => { - + User.create(userWithAddress, { include: [Address] }) + .then((user) => User.findByPk(user.id, { include: [Address] })) + .then((user) => { assertInstance(user, userWithAddress); }), - Address.create(emancipatedAddress, {include: [User]}) - .then(address => Address.findByPk(address.id, {include: [User]})) - .then(address => { - + Address.create(emancipatedAddress, { include: [User] }) + .then((address) => Address.findByPk(address.id, { include: [User] })) + .then((address) => { assertInstance(address, emancipatedAddress); - }) - ]) - ); + }), + ])); }); describe('findOne()', () => { - it('should find instances with related instances', () => - Promise.all([ - User.create(userWithAddress, {include: [Address]}) - .then(user => User.findOne({include: [Address], where: {id: user.id}})) - .then(user => { - + User.create(userWithAddress, { include: [Address] }) + .then((user) => User.findOne({ include: [Address], where: { id: user.id } })) + .then((user) => { assertInstance(user, userWithAddress); }), - Address.create(emancipatedAddress, {include: [User]}) - .then(address => Address.findOne({include: [User], where: {id: address.id}})) - .then(address => { - + Address.create(emancipatedAddress, { include: [User] }) + .then((address) => Address.findOne({ include: [User], where: { id: address.id } })) + .then((address) => { assertInstance(address, emancipatedAddress); - }) - ]) - ); + }), + ])); }); describe('findAll()', () => { - it('should find instances with related instances', () => - Promise.all([ - User.create(userWithAddress, {include: [Address]}) - .then(user => User.findAll({include: [Address], where: {id: user.id}})) - .then(users => { - + User.create(userWithAddress, { include: [Address] }) + .then((user) => User.findAll({ include: [Address], where: { id: user.id } })) + .then((users) => { assertInstance(users[0], userWithAddress); }), - Address.create(emancipatedAddress, {include: [User]}) - .then(address => Address.findAll({include: [User], where: {id: address.id}})) - .then(addresses => { - + Address.create(emancipatedAddress, { include: [User] }) + .then((address) => Address.findAll({ include: [User], where: { id: address.id } })) + .then((addresses) => { assertInstance(addresses[0], emancipatedAddress); - }) - ]) - ); + }), + ])); }); describe('$get', () => { - it('should get related instances of source instance', () => - - Promise - .all([ - User.create(userWithAddress, {include: [Address]}) - .then(user => User.findByPk(user.id)) - .then(user => - user - .$get('address') - .then(address => { - - assertInstance(address, userWithAddress.address); - }) - ), - Address.create(emancipatedAddress, {include: [User]}) - .then(author => Address.findByPk(author.id)) - .then(author => - author - .$get('user') - .then(user => { - - assertInstance(user, emancipatedAddress.user); - }) - ) - - ]) - ); + Promise.all([ + User.create(userWithAddress, { include: [Address] }) + .then((user) => User.findByPk(user.id)) + .then((user) => + user.$get('address').then((address) => { + assertInstance(address, userWithAddress.address); + }) + ), + Address.create(emancipatedAddress, { include: [User] }) + .then((author) => Address.findByPk(author.id)) + .then((author) => + author.$get('user').then((user) => { + assertInstance(user, emancipatedAddress.user); + }) + ), + ])); }); describe('$set', () => { - it('should set relation between specified instances and source instance', () => - - Promise - .all([ - User.create(elisa), - Address.create(petersAddress) - ]) - .then(([user, address]) => - user - .$set('address', address) - .then(() => User.findByPk(user.id, {include: [Address]})) - .then(_user => { - - assertInstance(_user, Object.assign({address: petersAddress}, elisa)); - }) - ) - ); + Promise.all([User.create(elisa), Address.create(petersAddress)]).then(([user, address]) => + user + .$set('address', address) + .then(() => User.findByPk(user.id, { include: [Address] })) + .then((_user) => { + assertInstance(_user, Object.assign({ address: petersAddress }, elisa)); + }) + )); it('should override previous relations', () => - - Promise - .all([ - User.create(elisa), - Address.create(petersAddress), - Address.create(petersOtherAddress), - ]) - .then(([user, address1, address2]) => - user - .$set('address', address1) - .then(() => User.findByPk(user.id, {include: [Address]})) - .then(_user => { - - assertInstance(_user, Object.assign({address: petersAddress}, elisa)); - }) - // override previous authors - .then(() => user.$set('address', address2)) - .then(() => User.findByPk(user.id, {include: [Address]})) - .then(_user => { - - // and check, if there are overridden - assertInstance(_user, Object.assign({address: petersOtherAddress}, elisa)); - }) - ) - ); - + Promise.all([ + User.create(elisa), + Address.create(petersAddress), + Address.create(petersOtherAddress), + ]).then(([user, address1, address2]) => + user + .$set('address', address1) + .then(() => User.findByPk(user.id, { include: [Address] })) + .then((_user) => { + assertInstance(_user, Object.assign({ address: petersAddress }, elisa)); + }) + // override previous authors + .then(() => user.$set('address', address2)) + .then(() => User.findByPk(user.id, { include: [Address] })) + .then((_user) => { + // and check, if there are overridden + assertInstance(_user, Object.assign({ address: petersOtherAddress }, elisa)); + }) + )); }); describe('$create', () => { - it('should create new instance and add relation between new instance and source instance (has one)', () => - - User.create(elisa) - .then((user) => - user - .$create('address', Object.assign({}, petersAddress)) - .then(address => { - - assertInstance(address, petersAddress); - }) - .then(() => User.findByPk(user.id, {include: [Address]})) - .then(_user => { - - assertInstance(_user, Object.assign({address: petersAddress}, elisa)); - }) - ) - ); + User.create(elisa).then((user) => + user + .$create('address', Object.assign({}, petersAddress)) + .then((address) => { + assertInstance(address, petersAddress); + }) + .then(() => User.findByPk(user.id, { include: [Address] })) + .then((_user) => { + assertInstance(_user, Object.assign({ address: petersAddress }, elisa)); + }) + )); it('should create new instance and add relation between new instance and source instance (belongs to)', () => - - Address.create(petersAddress) - .then((address) => - address - .$create('user', Object.assign({}, elisa)) - .then(() => Address.findByPk(address.id, {include: [User]})) - .then(_address => { - - assertInstance(_address, Object.assign({user: elisa}, petersAddress)); - }) - ) - ); - + Address.create(petersAddress).then((address) => + address + .$create('user', Object.assign({}, elisa)) + .then(() => Address.findByPk(address.id, { include: [User] })) + .then((_address) => { + assertInstance(_address, Object.assign({ user: elisa }, petersAddress)); + }) + )); }); - } describe('resolve foreign keys automatically', () => { - @Table - class User extends Model { - + class User extends Model { @Column name: string; @@ -1870,8 +1473,7 @@ describe('association', () => { } @Table - class Address extends Model
{ - + class Address extends Model { @Column street: string; @@ -1895,10 +1497,8 @@ describe('association', () => { }); describe('set foreign keys explicitly', () => { - @Table - class User2 extends Model { - + class User2 extends Model { @Column name: string; @@ -1907,8 +1507,7 @@ describe('association', () => { } @Table - class Address2 extends Model { - + class Address2 extends Model { @Column street: string; @@ -1930,16 +1529,18 @@ describe('association', () => { oneToOneTestSuites(User2, Address2); }); - function oneToOneWithOptionsTestSuites(User: typeof AbstractUser, - Address: typeof AbstractAddress, - alternateName: boolean = false, - onDeleteAction: string = 'CASCADE'): void { + function oneToOneWithOptionsTestSuites( + User: typeof AbstractUser, + Address: typeof AbstractAddress, + alternateName = false, + onDeleteAction = 'CASCADE' + ): void { const foreignKey = alternateName ? 'user_id' : 'userId'; before(() => sequelize.addModels([User, Address])); beforeEach(() => { - return sequelize.sync({force: true}); + return sequelize.sync({ force: true }); }); it('should create models with specified relations', () => { @@ -1947,70 +1548,64 @@ describe('association', () => { .to.have.property('associations') .that.has.property('address') .that.is.an.instanceOf(Association['HasOne']) - .which.includes({foreignKey}) + .which.includes({ foreignKey }) .and.has.property('foreignKeyAttribute') - .which.includes({allowNull: false, name: foreignKey}) - ; + .which.includes({ allowNull: false, name: foreignKey }); expect(User) .to.have.property('associations') .that.has.property('address') .that.has.property('options') - .with.property('onDelete', onDeleteAction) - ; + .with.property('onDelete', onDeleteAction); expect(Address) .to.have.property('associations') .that.has.property('user') .that.is.an.instanceOf(Association['BelongsTo']) - .which.includes({foreignKey}) + .which.includes({ foreignKey }) .and.has.property('foreignKeyAttribute') - .which.includes({allowNull: false, name: foreignKey}) - ; + .which.includes({ allowNull: false, name: foreignKey }); expect(Address) .to.have.property('associations') .that.has.property('user') .that.has.property('options') - .with.property('onDelete', onDeleteAction) - ; + .with.property('onDelete', onDeleteAction); }); describe('create()', () => { it('should fail creating instances that require a primary key', () => { - - return Address.create(petersAddress, {include: [User]}) - .catch(err => - expect(err.message) - .to.match(new RegExp(`^notNull Violation: (${Address.name}.${foreignKey}|${foreignKey}) cannot be null$`))); + return Address.create(petersAddress, { include: [User] }).catch((err) => + expect(err.message).to.match( + new RegExp( + `^notNull Violation: (${Address.name}.${foreignKey}|${foreignKey}) cannot be null$` + ) + ) + ); }); it('should create instances that require a parent primary key', () => { - return User.create(userWithAddress, {include: [Address]}) - .then((actual: any) => { - assertInstance(actual, userWithAddress); - }); + return User.create(userWithAddress, { include: [Address] }).then((actual: any) => { + assertInstance(actual, userWithAddress); + }); }); }); } describe('resolve foreign keys automatically with association options', () => { - const ON_DELETE_ACTION = 'SET NULL'; @Table - class User3 extends Model { - + class User3 extends Model { @Column name: string; - @HasOne(() => Address3, {foreignKey: {allowNull: false}, onDelete: ON_DELETE_ACTION}) + @HasOne(() => Address3, { foreignKey: { allowNull: false }, onDelete: ON_DELETE_ACTION }) address: any; } @Table - class Address3 extends Model { - + class Address3 extends Model { @Column street: string; @@ -2028,7 +1623,7 @@ describe('association', () => { @Column userId: number; - @BelongsTo(() => User3, {foreignKey: {allowNull: false}, onDelete: ON_DELETE_ACTION}) + @BelongsTo(() => User3, { foreignKey: { allowNull: false }, onDelete: ON_DELETE_ACTION }) user: User3; } @@ -2036,20 +1631,20 @@ describe('association', () => { }); describe('set foreign keys explicitly with association options', () => { - @Table - class User4 extends Model { - + class User4 extends Model { @Column name: string; - @HasOne(() => Address4, {foreignKey: {allowNull: false, name: 'user_id'}, onDelete: 'CASCADE'}) + @HasOne(() => Address4, { + foreignKey: { allowNull: false, name: 'user_id' }, + onDelete: 'CASCADE', + }) address: any; } @Table - class Address4 extends Model { - + class Address4 extends Model { @Column street: string; @@ -2063,7 +1658,7 @@ describe('association', () => { country: string; @BelongsTo(() => User4, { - foreignKey: {allowNull: false, name: 'user_id'}, + foreignKey: { allowNull: false, name: 'user_id' }, onDelete: 'CASCADE', }) user: User4; @@ -2075,20 +1670,17 @@ describe('association', () => { }); describe('set foreign keys explicitly via options', () => { - @Table - class User5 extends Model { - + class User5 extends Model { @Column name: string; - @HasOne(() => Address5, {foreignKey: 'userId'}) + @HasOne(() => Address5, { foreignKey: 'userId' }) address: any; } @Table - class Address5 extends Model { - + class Address5 extends Model { @Column street: string; @@ -2101,7 +1693,7 @@ describe('association', () => { @Column country: string; - @BelongsTo(() => User5, {foreignKey: 'userId'}) + @BelongsTo(() => User5, { foreignKey: 'userId' }) user: User5; userId: number; @@ -2111,20 +1703,17 @@ describe('association', () => { }); describe('set foreign keys explicitly with association options (allowNull: false on foreignKey)', () => { - @Table - class User6 extends Model { - + class User6 extends Model { @Column name: string; - @HasOne(() => Address6, {foreignKey: {allowNull: false}}) + @HasOne(() => Address6, { foreignKey: { allowNull: false } }) address: any; } @Table - class Address6 extends Model { - + class Address6 extends Model { @Column street: string; @@ -2139,12 +1728,12 @@ describe('association', () => { @ForeignKey(() => User6) @AllowNull(false) - @Column({field: 'user_id'}) + @Column({ field: 'user_id' }) userId: number; @BelongsTo(() => User6, { onDelete: 'CASCADE', - foreignKey: {allowNull: false} + foreignKey: { allowNull: false }, }) user: User6; } @@ -2152,5 +1741,4 @@ describe('association', () => { oneToOneWithOptionsTestSuites(User6, Address6, false); }); }); - }); diff --git a/test/specs/browser.spec.ts b/test/specs/browser.spec.ts new file mode 100644 index 00000000..1ecd475b --- /dev/null +++ b/test/specs/browser.spec.ts @@ -0,0 +1,108 @@ +import * as browser from '../../src/browser'; +import { should } from 'chai'; + +describe('browser definitions', () => { + it('should be able to use noop implementations as decorators', () => { + class TestModel extends browser.Model { + // we don't care about the types matching here since at runtime you can pass + // as many args to a function as you like + @((browser.AllowNull as any)({ someOption: (browser.DataType as any).STRING } as any)) + @browser.AutoIncrement() + @browser.Column() + @browser.Comment() + @browser.CreatedAt() + @browser.Default() + @browser.DefaultScope() + @browser.DeletedAt() + @browser.ForeignKey() + @browser.PrimaryKey() + @browser.Scopes() + @browser.Table() + @browser.Unique() + @browser.UpdatedAt() + @browser.BelongsTo() + @browser.BelongsToMany() + @browser.HasMany() + @browser.HasOne() + @browser.AfterBulkCreate() + @browser.AfterBulkDelete() + @browser.AfterBulkDestroy() + @browser.AfterBulkRestore() + @browser.AfterBulkSync() + @browser.AfterBulkUpdate() + @browser.AfterConnect() + @browser.AfterCreate() + @browser.AfterDefine() + @browser.AfterDelete() + @browser.AfterDestroy() + @browser.AfterFind() + @browser.AfterInit() + @browser.AfterRestore() + @browser.AfterSave() + @browser.AfterSync() + @browser.AfterUpdate() + @browser.AfterUpsert() + @browser.AfterValidate() + @browser.BeforeBulkCreate() + @browser.BeforeBulkDelete() + @browser.BeforeBulkDestroy() + @browser.BeforeBulkRestore() + @browser.BeforeBulkSync() + @browser.BeforeBulkUpdate() + @browser.BeforeConnect() + @browser.BeforeCount() + @browser.BeforeCreate() + @browser.BeforeDefine() + @browser.BeforeDelete() + @browser.BeforeDestroy() + @browser.BeforeFind() + @browser.BeforeFindAfterExpandIncludeAll() + @browser.BeforeFindAfterOptions() + @browser.BeforeInit() + @browser.BeforeRestore() + @browser.BeforeSave() + @browser.BeforeSync() + @browser.BeforeUpdate() + @browser.BeforeUpsert() + @browser.BeforeValidate() + @browser.ValidationFailed() + @browser.Contains() + @browser.Equals() + @browser.Is() + @browser.IsAfter() + @browser.IsAlpha() + @browser.IsAlphanumeric() + @browser.IsArray() + @browser.IsBefore() + @browser.IsCreditCard() + @browser.IsDate() + @browser.IsDecimal() + @browser.IsEmail() + @browser.IsFloat() + @browser.IsIn() + @browser.IsInt() + @browser.IsIP() + @browser.IsIPv4() + @browser.IsIPv6() + @browser.IsLowercase() + @browser.IsNull() + @browser.IsNumeric() + @browser.IsUppercase() + @browser.IsUrl() + @browser.IsUUID() + @browser.Length() + @browser.Max() + @browser.Min() + @browser.Not() + @browser.NotContains() + @browser.NotEmpty() + @browser.NotIn() + @browser.NotNull() + @browser.Validate() + @browser.Validator() + field: string; + } + + should().exist(new TestModel()); + }); +}); diff --git a/test/specs/hooks/hooks.spec.ts b/test/specs/hooks/hooks.spec.ts index d9e57262..8d611f62 100644 --- a/test/specs/hooks/hooks.spec.ts +++ b/test/specs/hooks/hooks.spec.ts @@ -3,11 +3,11 @@ import * as chai from 'chai'; import * as sinon from 'sinon'; import * as sinonChai from 'sinon-chai'; -import { BeforeCreate, Sequelize } from "../../../src"; -import { Column, Model, Table } from "../../../src"; +import { BeforeCreate, Sequelize } from '../../../src'; +import { Column, Model, Table } from '../../../src'; -import { Hook } from "../../models/Hook"; -import { createSequelize } from "../../utils/sequelize"; +import { Hook } from '../../models/Hook'; +import { createSequelize } from '../../utils/sequelize'; const expect = chai.expect; chai.use(sinonChai); @@ -20,15 +20,14 @@ describe('hook', () => { }); beforeEach(() => { - - return sequelize.sync({force: true}); + return sequelize.sync({ force: true }); }); it('should throw on non-static hooks', () => { expect(() => { @Table - class User extends Model { - + // eslint-disable-next-line @typescript-eslint/no-unused-vars + class User extends Model { @Column firstName: string; @@ -36,17 +35,18 @@ describe('hook', () => { lastName: string; @BeforeCreate - nonStaticHookFunction(): void {} + nonStaticHookFunction(): void { + // nonStaticHookFunction + } } }).to.throw(Error, /not a static method/); }); it('should throw on methods with reserved names', () => { expect(() => { - // tslint:disable-next-line:max-classes-per-file @Table - class User extends Model { - + // eslint-disable-next-line @typescript-eslint/no-unused-vars + class User extends Model { @Column firstName: string; @@ -54,7 +54,9 @@ describe('hook', () => { lastName: string; @BeforeCreate - static beforeCreate(): void {} + static beforeCreate(): void { + // beforeCreate + } } }).to.throw(Error, /name is reserved/); }); @@ -80,7 +82,10 @@ describe('hook', () => { const beforeBulkUpdateHookStub = sinon.stub(Hook, 'beforeBulkUpdateHook'); const afterBulkUpdateHookStub = sinon.stub(Hook, 'afterBulkUpdateHook'); const beforeFindHookStub = sinon.stub(Hook, 'beforeFindHook'); - const beforeFindAfterExpandIncludeAllHookStub = sinon.stub(Hook, 'beforeFindAfterExpandIncludeAllHook'); + const beforeFindAfterExpandIncludeAllHookStub = sinon.stub( + Hook, + 'beforeFindAfterExpandIncludeAllHook' + ); const beforeFindAfterOptionsHookStub = sinon.stub(Hook, 'beforeFindAfterOptionsHook'); const afterFindHookStub = sinon.stub(Hook, 'afterFindHook'); const beforeCountHookStub = sinon.stub(Hook, 'beforeCountHook'); @@ -126,8 +131,14 @@ describe('hook', () => { const beforeBulkUpdateHookWithNameStub = sinon.stub(Hook, 'beforeBulkUpdateHookWithName'); const afterBulkUpdateHookWithNameStub = sinon.stub(Hook, 'afterBulkUpdateHookWithName'); const beforeFindHookWithNameStub = sinon.stub(Hook, 'beforeFindHookWithName'); - const beforeFindAfterExpandIncludeAllHookWithNameStub = sinon.stub(Hook, 'beforeFindAfterExpandIncludeAllHookWithName'); - const beforeFindAfterOptionsHookWithNameStub = sinon.stub(Hook, 'beforeFindAfterOptionsHookWithName'); + const beforeFindAfterExpandIncludeAllHookWithNameStub = sinon.stub( + Hook, + 'beforeFindAfterExpandIncludeAllHookWithName' + ); + const beforeFindAfterOptionsHookWithNameStub = sinon.stub( + Hook, + 'beforeFindAfterOptionsHookWithName' + ); const afterFindHookWithNameStub = sinon.stub(Hook, 'afterFindHookWithName'); const beforeCountHookWithNameStub = sinon.stub(Hook, 'beforeCountHookWithName'); @@ -172,8 +183,12 @@ describe('hook', () => { expect(Hook['options'].hooks['beforeBulkUpdate']).to.include(beforeBulkUpdateHookStub); expect(Hook['options'].hooks['afterBulkUpdate']).to.include(afterBulkUpdateHookStub); expect(Hook['options'].hooks['beforeFind']).to.include(beforeFindHookStub); - expect(Hook['options'].hooks['beforeFindAfterExpandIncludeAll']).to.include(beforeFindAfterExpandIncludeAllHookStub); - expect(Hook['options'].hooks['beforeFindAfterOptions']).to.include(beforeFindAfterOptionsHookStub); + expect(Hook['options'].hooks['beforeFindAfterExpandIncludeAll']).to.include( + beforeFindAfterExpandIncludeAllHookStub + ); + expect(Hook['options'].hooks['beforeFindAfterOptions']).to.include( + beforeFindAfterOptionsHookStub + ); expect(Hook['options'].hooks['afterFind']).to.include(afterFindHookStub); expect(Hook['options'].hooks['beforeCount']).to.include(beforeCountHookStub); @@ -195,64 +210,120 @@ describe('hook', () => { // Named hooks - expect(Hook['options'].hooks['beforeValidate']) - .to.include({ name: 'myBeforeValidateHook', fn: beforeValidateHookWithNameStub }); - expect(Hook['options'].hooks['afterValidate']) - .to.include({ name: 'myAfterValidateHook', fn: afterValidateHookWithNameStub }); - expect(Hook['options'].hooks['validationFailed']) - .to.include({ name: 'myValidationFailedHook', fn: validationFailedHookWithNameStub }); - expect(Hook['options'].hooks['beforeCreate']) - .to.include({ name: 'myBeforeCreateHook', fn: beforeCreateHookWithNameStub }); - expect(Hook['options'].hooks['afterCreate']) - .to.include({ name: 'myAfterCreateHook', fn: afterCreateHookWithNameStub }); - expect(Hook['options'].hooks['beforeDestroy']) - .to.include({ name: 'myBeforeDestroyHook', fn: beforeDestroyHookWithNameStub }); - expect(Hook['options'].hooks['afterDestroy']) - .to.include({ name: 'myAfterDestroyHook', fn: afterDestroyHookWithNameStub }); - expect(Hook['options'].hooks['beforeRestore']) - .to.include({ name: 'myBeforeRestoreHook', fn: beforeRestoreHookWithNameStub }); - expect(Hook['options'].hooks['afterRestore']) - .to.include({ name: 'myAfterRestoreHook', fn: afterRestoreHookWithNameStub }); - expect(Hook['options'].hooks['beforeUpdate']) - .to.include({ name: 'myBeforeUpdateHook', fn: beforeUpdateHookWithNameStub }); - expect(Hook['options'].hooks['afterUpdate']) - .to.include({ name: 'myAfterUpdateHook', fn: afterUpdateHookWithNameStub }); - expect(Hook['options'].hooks['beforeBulkCreate']) - .to.include({ name: 'myBeforeBulkCreateHook', fn: beforeBulkCreateHookWithNameStub }); - expect(Hook['options'].hooks['afterBulkCreate']) - .to.include({ name: 'myAfterBulkCreateHook', fn: afterBulkCreateHookWithNameStub }); - expect(Hook['options'].hooks['beforeBulkDestroy']) - .to.include({ name: 'myBeforeBulkDestroyHook', fn: beforeBulkDestroyHookWithNameStub }); - expect(Hook['options'].hooks['afterBulkDestroy']) - .to.include({ name: 'myAfterBulkDestroyHook', fn: afterBulkDestroyHookWithNameStub }); - expect(Hook['options'].hooks['beforeBulkRestore']) - .to.include({ name: 'myBeforeBulkRestoreHook', fn: beforeBulkRestoreHookWithNameStub }); - expect(Hook['options'].hooks['afterBulkRestore']) - .to.include({ name: 'myAfterBulkRestoreHook', fn: afterBulkRestoreHookWithNameStub }); - expect(Hook['options'].hooks['beforeBulkUpdate']) - .to.include({ name: 'myBeforeBulkUpdateHook', fn: beforeBulkUpdateHookWithNameStub }); - expect(Hook['options'].hooks['afterBulkUpdate']) - .to.include({ name: 'myAfterBulkUpdateHook', fn: afterBulkUpdateHookWithNameStub }); - expect(Hook['options'].hooks['beforeFind']) - .to.include({ name: 'myBeforeFindHook', fn: beforeFindHookWithNameStub }); - expect(Hook['options'].hooks['beforeFindAfterExpandIncludeAll']) - .to.include({ name: 'myBeforeFindAfterExpandIncludeAllHook', fn: beforeFindAfterExpandIncludeAllHookWithNameStub }); - expect(Hook['options'].hooks['beforeFindAfterOptions']) - .to.include({ name: 'myBeforeFindAfterOptionsHook', fn: beforeFindAfterOptionsHookWithNameStub }); - expect(Hook['options'].hooks['afterFind']) - .to.include({ name: 'myAfterFindHook', fn: afterFindHookWithNameStub }); - expect(Hook['options'].hooks['beforeCount']) - .to.include({ name: 'myBeforeCountHook', fn: beforeCountHookWithNameStub }); + expect(Hook['options'].hooks['beforeValidate']).to.deep.include({ + name: 'myBeforeValidateHook', + fn: beforeValidateHookWithNameStub, + }); + expect(Hook['options'].hooks['afterValidate']).to.deep.include({ + name: 'myAfterValidateHook', + fn: afterValidateHookWithNameStub, + }); + expect(Hook['options'].hooks['validationFailed']).to.deep.include({ + name: 'myValidationFailedHook', + fn: validationFailedHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeCreate']).to.deep.include({ + name: 'myBeforeCreateHook', + fn: beforeCreateHookWithNameStub, + }); + expect(Hook['options'].hooks['afterCreate']).to.deep.include({ + name: 'myAfterCreateHook', + fn: afterCreateHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeDestroy']).to.deep.include({ + name: 'myBeforeDestroyHook', + fn: beforeDestroyHookWithNameStub, + }); + expect(Hook['options'].hooks['afterDestroy']).to.deep.include({ + name: 'myAfterDestroyHook', + fn: afterDestroyHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeRestore']).to.deep.include({ + name: 'myBeforeRestoreHook', + fn: beforeRestoreHookWithNameStub, + }); + expect(Hook['options'].hooks['afterRestore']).to.deep.include({ + name: 'myAfterRestoreHook', + fn: afterRestoreHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeUpdate']).to.deep.include({ + name: 'myBeforeUpdateHook', + fn: beforeUpdateHookWithNameStub, + }); + expect(Hook['options'].hooks['afterUpdate']).to.deep.include({ + name: 'myAfterUpdateHook', + fn: afterUpdateHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeBulkCreate']).to.deep.include({ + name: 'myBeforeBulkCreateHook', + fn: beforeBulkCreateHookWithNameStub, + }); + expect(Hook['options'].hooks['afterBulkCreate']).to.deep.include({ + name: 'myAfterBulkCreateHook', + fn: afterBulkCreateHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeBulkDestroy']).to.deep.include({ + name: 'myBeforeBulkDestroyHook', + fn: beforeBulkDestroyHookWithNameStub, + }); + expect(Hook['options'].hooks['afterBulkDestroy']).to.deep.include({ + name: 'myAfterBulkDestroyHook', + fn: afterBulkDestroyHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeBulkRestore']).to.deep.include({ + name: 'myBeforeBulkRestoreHook', + fn: beforeBulkRestoreHookWithNameStub, + }); + expect(Hook['options'].hooks['afterBulkRestore']).to.deep.include({ + name: 'myAfterBulkRestoreHook', + fn: afterBulkRestoreHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeBulkUpdate']).to.deep.include({ + name: 'myBeforeBulkUpdateHook', + fn: beforeBulkUpdateHookWithNameStub, + }); + expect(Hook['options'].hooks['afterBulkUpdate']).to.deep.include({ + name: 'myAfterBulkUpdateHook', + fn: afterBulkUpdateHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeFind']).to.deep.include({ + name: 'myBeforeFindHook', + fn: beforeFindHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeFindAfterExpandIncludeAll']).to.deep.include({ + name: 'myBeforeFindAfterExpandIncludeAllHook', + fn: beforeFindAfterExpandIncludeAllHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeFindAfterOptions']).to.deep.include({ + name: 'myBeforeFindAfterOptionsHook', + fn: beforeFindAfterOptionsHookWithNameStub, + }); + expect(Hook['options'].hooks['afterFind']).to.deep.include({ + name: 'myAfterFindHook', + fn: afterFindHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeCount']).to.deep.include({ + name: 'myBeforeCountHook', + fn: beforeCountHookWithNameStub, + }); if (OriginSequelize['version'].split('.')[0] === '4') { - expect(Hook['options'].hooks['beforeSave']) - .to.include({ name: 'myBeforeSaveHook', fn: beforeSaveHookWithNameStub }); - expect(Hook['options'].hooks['afterSave']) - .to.include({ name: 'myAfterSaveHook', fn: afterSaveHookWithNameStub }); - expect(Hook['options'].hooks['beforeUpsert']) - .to.include({ name: 'myBeforeUpsertHook', fn: beforeUpsertHookWithNameStub }); - expect(Hook['options'].hooks['afterUpsert']) - .to.include({ name: 'myAfterUpsertHook', fn: afterUpsertHookWithNameStub }); + expect(Hook['options'].hooks['beforeSave']).to.deep.include({ + name: 'myBeforeSaveHook', + fn: beforeSaveHookWithNameStub, + }); + expect(Hook['options'].hooks['afterSave']).to.deep.include({ + name: 'myAfterSaveHook', + fn: afterSaveHookWithNameStub, + }); + expect(Hook['options'].hooks['beforeUpsert']).to.deep.include({ + name: 'myBeforeUpsertHook', + fn: beforeUpsertHookWithNameStub, + }); + expect(Hook['options'].hooks['afterUpsert']).to.deep.include({ + name: 'myAfterUpsertHook', + fn: afterUpsertHookWithNameStub, + }); } }); }); diff --git a/test/specs/index.spec.ts b/test/specs/index.spec.ts new file mode 100644 index 00000000..cdff18b7 --- /dev/null +++ b/test/specs/index.spec.ts @@ -0,0 +1,244 @@ +import { expect, use } from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; + +import { createSequelize } from '../utils/sequelize'; +import { Sequelize, Model, Table, Column } from '../../src'; +import { Index } from '../../src/model/index/index-decorator'; +import { createIndexDecorator } from '../../src/model/index/create-index-decorator'; + +use(chaiAsPromised); + +let sequelize: Sequelize; +before(() => { + sequelize = createSequelize(false); +}); + +describe('built-in index decorator', () => { + it('creates index', async () => { + @Table + class Test extends Model { + @Index + @Column + field: string; + } + sequelize.addModels([Test]); + + const queries = []; + await Test.sync({ + force: true, + logging: (sql) => queries.push(sql.substr(sql.indexOf(':') + 2)), + }); + expect(queries).to.have.property('length', 4); + expect(queries[3]).to.equal('CREATE INDEX `tests_field` ON `Tests` (`field`)'); + }); + + it('creates multiple indexes', async () => { + @Table + class Test extends Model { + @Index + @Column + fieldA: string; + + @Index + @Column + fieldB: string; + } + sequelize.addModels([Test]); + + const queries = []; + await Test.sync({ + force: true, + logging: (sql) => queries.push(sql.substr(sql.indexOf(':') + 2)), + }); + expect(queries).to.have.property('length', 5); + expect(queries[3]).to.equal('CREATE INDEX `tests_field_a` ON `Tests` (`fieldA`)'); + expect(queries[4]).to.equal('CREATE INDEX `tests_field_b` ON `Tests` (`fieldB`)'); + }); + + it('creates named index', async () => { + @Table + class Test extends Model { + @Index('my-index') + @Column + field: string; + } + sequelize.addModels([Test]); + + const queries = []; + await Test.sync({ + force: true, + logging: (sql) => queries.push(sql.substr(sql.indexOf(':') + 2)), + }); + expect(queries).to.have.property('length', 4); + expect(queries[3]).to.equal('CREATE INDEX `my-index` ON `Tests` (`field`)'); + }); + + it('adds multiple fields to the same index', async () => { + @Table + class Test extends Model { + @Index('my-index') + @Column + fieldA: string; + + @Index('my-index') + @Column + fieldB: string; + } + sequelize.addModels([Test]); + + const queries = []; + await Test.sync({ + force: true, + logging: (sql) => queries.push(sql.substr(sql.indexOf(':') + 2)), + }); + expect(queries).to.have.property('length', 4); + expect(queries[3]).to.equal('CREATE INDEX `my-index` ON `Tests` (`fieldA`, `fieldB`)'); + }); + + it('sets extra options for index', async () => { + @Table + class Test extends Model { + @Index({ + name: 'my-index', + unique: true, + where: { indexed: true }, + }) + @Column + field: string; + + @Column + indexed: boolean; + } + sequelize.addModels([Test]); + + const queries = []; + await Test.sync({ + force: true, + logging: (sql) => queries.push(sql.substr(sql.indexOf(':') + 2)), + }); + expect(queries).to.have.property('length', 4); + expect(queries[3]).to.equal( + 'CREATE UNIQUE INDEX `my-index` ON `Tests` (`field`) WHERE `indexed` = 1' + ); + }); + + it('sets extra options for field', async () => { + @Table + class Test extends Model { + @Index({ + name: 'my-index', + order: 'ASC', + collate: 'NOCASE', + }) + @Column + fieldA: string; + + @Index({ + name: 'my-index', + order: 'DESC', + }) + @Column + fieldB: string; + } + sequelize.addModels([Test]); + + const queries = []; + await Test.sync({ + force: true, + logging: (sql) => queries.push(sql.substr(sql.indexOf(':') + 2)), + }); + expect(queries).to.have.property('length', 4); + expect(queries[3]).to.equal( + 'CREATE INDEX `my-index` ON `Tests`' + ' (`fieldA` COLLATE `NOCASE` ASC, `fieldB` DESC)' + ); + }); +}); + +describe('custom index decorator', () => { + it('creates index', async () => { + const MyIndex = createIndexDecorator(); + const OtherIndex = createIndexDecorator(); + + @Table + class Test extends Model { + @MyIndex + @Column + fieldA: string; + + @MyIndex + @Column + fieldB: string; + + @OtherIndex + @Column + fieldC: string; + } + sequelize.addModels([Test]); + + const queries = []; + await Test.sync({ + force: true, + logging: (sql) => queries.push(sql.substr(sql.indexOf(':') + 2)), + }); + expect(queries).to.have.property('length', 5); + expect(queries[3]).to.equal( + 'CREATE INDEX `tests_field_a_field_b` ON `Tests` (`fieldA`, `fieldB`)' + ); + expect(queries[4]).to.equal('CREATE INDEX `tests_field_c` ON `Tests` (`fieldC`)'); + }); + + it('sets extra options for index', async () => { + const MyIndex = createIndexDecorator({ + name: 'my-index', + unique: true, + where: { indexed: true }, + }); + + @Table + class Test extends Model { + @MyIndex + @Column + field: string; + + @Column + indexed: boolean; + } + sequelize.addModels([Test]); + + const queries = []; + await Test.sync({ + force: true, + logging: (sql) => queries.push(sql.substr(sql.indexOf(':') + 2)), + }); + expect(queries).to.have.property('length', 4); + expect(queries[3]).to.equal( + 'CREATE UNIQUE INDEX `my-index` ON `Tests` (`field`) WHERE `indexed` = 1' + ); + }); + + it('sets extra options for field', async () => { + const MyIndex = createIndexDecorator({ name: 'my-index' }); + + @Table + class Test extends Model { + @MyIndex({ order: 'ASC', collate: 'NOCASE' }) + @Column + fieldA: string; + + @MyIndex({ order: 'DESC' }) + @Column + fieldB: string; + } + sequelize.addModels([Test]); + + const queries = []; + await Test.sync({ + force: true, + logging: (sql) => queries.push(sql.substr(sql.indexOf(':') + 2)), + }); + expect(queries).to.have.property('length', 4); + expect(queries[3]).to.equal( + 'CREATE INDEX `my-index` ON `Tests`' + ' (`fieldA` COLLATE `NOCASE` ASC, `fieldB` DESC)' + ); + }); +}); diff --git a/test/specs/instance-methods.spec.ts b/test/specs/instance-methods.spec.ts index 726365e1..d987610a 100644 --- a/test/specs/instance-methods.spec.ts +++ b/test/specs/instance-methods.spec.ts @@ -1,15 +1,12 @@ -import {expect} from 'chai'; -import * as Promise from 'bluebird'; -import {Model, Table, Column} from "../../src"; -import {createSequelize} from "../utils/sequelize"; +import { expect } from 'chai'; +import { Model, Table, Column } from '../../src'; +import { createSequelize } from '../utils/sequelize'; describe('instance-methods', () => { - let sequelize; @Table - class User extends Model { - + class User extends Model { @Column firstName: string; @@ -17,12 +14,10 @@ describe('instance-methods', () => { lastName: string; getFullName(): string { - return this.firstName + ' ' + this.lastName; } setFullName(name: string): void { - const split = name.split(' '); this.lastName = split.pop(); @@ -35,48 +30,38 @@ describe('instance-methods', () => { sequelize.addModels([User]); }); - beforeEach(() => sequelize.sync({force: true})); + beforeEach(() => sequelize.sync({ force: true })); const suites: Array<[string, () => Promise]> = [ - ['build', () => Promise.resolve(User.build({firstName: 'Peter', lastName: 'Parker'}))], - ['new', () => Promise.resolve(new User({firstName: 'Peter', lastName: 'Parker'}))], - ['create', () => (User.create({firstName: 'Peter', lastName: 'Parker'}))], + ['build', () => Promise.resolve(User.build({ firstName: 'Peter', lastName: 'Parker' }))], + ['new', () => Promise.resolve(new User({ firstName: 'Peter', lastName: 'Parker' }))], + ['create', () => User.create({ firstName: 'Peter', lastName: 'Parker' })], ]; suites.forEach(([name, create]) => { - describe(name, () => { - let user; - beforeEach(() => create().then(_user => user = _user)); + beforeEach(() => create().then((_user) => (user = _user))); it('should have access to functions of prototype', () => { - - Object - .keys(User.prototype) - .forEach(key => { - - expect(user).to.have.property(key, User.prototype[key]); - }); + Object.keys(User.prototype).forEach((key) => { + expect(user).to.have.property(key, User.prototype[key]); + }); }); describe('"get" function', () => { - it('should return appropriate value', () => { - expect(user.getFullName()).to.equal(user.firstName + ' ' + user.lastName); }); }); describe('"set" function', () => { - const firstName = 'Tony'; const lastName = 'Stark'; const fullName = firstName + ' ' + lastName; it('should set specified value to instance', () => { - user.setFullName(fullName); expect(user.firstName).to.equal(firstName); @@ -84,21 +69,17 @@ describe('instance-methods', () => { }); it('should store set value', () => { - user.setFullName(fullName); return user .save() .then(() => User.findByPk(user.id)) - .then(_user => { - + .then((_user) => { expect(_user.firstName).to.equal(firstName); expect(_user.lastName).to.equal(lastName); - }) - ; + }); }); }); }); }); - }); diff --git a/test/specs/instance.spec.ts b/test/specs/instance.spec.ts index 850e4ce9..4cbf05f9 100644 --- a/test/specs/instance.spec.ts +++ b/test/specs/instance.spec.ts @@ -1,4 +1,3 @@ -import * as Promise from 'bluebird'; import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import { useFakeTimers } from 'sinon'; @@ -6,160 +5,145 @@ import { ValidationError } from 'sequelize'; import * as validateUUID from 'uuid-validate'; import chaiDatetime = require('chai-datetime'); -import { AllowNull, BelongsTo, Column, DataType, Default, ForeignKey, HasMany, HasOne, Model, PrimaryKey, Sequelize, Table } from "../../src"; -import { TableOptions } from "../../src/model/table/table-options"; -import { Book } from "../models/Book"; -import { Box } from "../models/Box"; -import { Page } from "../models/Page"; -import { Person } from "../models/Person"; -import { Player } from "../models/Player"; -import { Shoe } from "../models/Shoe"; -import { Team } from "../models/Team"; -import { TimeStampsUser } from "../models/TimeStampsUser"; -import { User } from "../models/User"; -import { UserWithCreatedAtButWithoutUpdatedAt } from "../models/UserWithCreatedAtButWithoutUpdatedAt"; -import { UserWithCustomUpdatedAt } from "../models/UserWithCustomUpdatedAt"; -import { UserWithNoAutoIncrementation } from "../models/UserWithNoAutoIncrementation"; -import { UserWithValidation } from "../models/UserWithValidation"; -import { UserWithVersion } from "../models/UserWithVersion"; -import { createSequelize } from "../utils/sequelize"; +import { + AllowNull, + BelongsTo, + Column, + DataType, + Default, + ForeignKey, + HasMany, + HasOne, + Model, + PrimaryKey, + Sequelize, + Table, +} from '../../src'; +import { TableOptions } from '../../src/model/table/table-options'; +import { Book } from '../models/Book'; +import { Box } from '../models/Box'; +import { Page } from '../models/Page'; +import { Person } from '../models/Person'; +import { Player } from '../models/Player'; +import { Shoe } from '../models/Shoe'; +import { Team } from '../models/Team'; +import { TimeStampsUser } from '../models/TimeStampsUser'; +import { User } from '../models/User'; +import { UserWithCreatedAtButWithoutUpdatedAt } from '../models/UserWithCreatedAtButWithoutUpdatedAt'; +import { UserWithCustomUpdatedAt } from '../models/UserWithCustomUpdatedAt'; +import { UserWithNoAutoIncrementation } from '../models/UserWithNoAutoIncrementation'; +import { UserWithValidation } from '../models/UserWithValidation'; +import { UserWithVersion } from '../models/UserWithVersion'; +import { createSequelize } from '../utils/sequelize'; // import {UserWithSwag} from "../models/UserWithSwag"; // TODO@robin create belongs to many with through options "add" test -const {InstanceError} = require('sequelize'); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const { InstanceError } = require('sequelize'); use(chaiAsPromised); use(chaiDatetime); -/* tslint:disable:max-classes-per-file */ - describe('instance', () => { - let sequelize: Sequelize; - before(() => sequelize = createSequelize()); + before(() => (sequelize = createSequelize())); - beforeEach(() => sequelize.sync({force: true})); + beforeEach(() => sequelize.sync({ force: true })); describe('instanceof', () => { - beforeEach(() => Promise.all([ - Book.create({ - title: 'Crime and Punishment', - pages: [{content: 'A'}] - }, {include: [Page]}), - Book.create({ - title: 'The Brothers Karamazov', - pages: [{content: 'B'}, {content: 'C'}] - }, {include: [Page]}) + Book.create( + { + title: 'Crime and Punishment', + pages: [{ content: 'A' }], + }, + { include: [Page] } + ), + Book.create( + { + title: 'The Brothers Karamazov', + pages: [{ content: 'B' }, { content: 'C' }], + }, + { include: [Page] } + ), ]) ); it('should return true for found instance (findOne)', () => - Book - .findOne() - .then(book => { - expect(book).to.be.an.instanceof(Book); - expect(book).to.be.an.instanceof(Model); - }) - ); + Book.findOne().then((book) => { + expect(book).to.be.an.instanceof(Book); + expect(book).to.be.an.instanceof(Model); + })); it('should return true for found instances (findAll)', () => - Book - .findAll() - .then(books => { - - books.forEach(book => { - - expect(book).to.be.an.instanceof(Book); - expect(book).to.be.an.instanceof(Model); - }); - }) - ); + Book.findAll().then((books) => { + books.forEach((book) => { + expect(book).to.be.an.instanceof(Book); + expect(book).to.be.an.instanceof(Model); + }); + })); it('should return true for include values of found instance', () => - Book - .findOne({include: [Page]}) - .then(book => { - - book.pages.forEach(page => { - - expect(page).to.be.an.instanceof(Page); - expect(page).to.be.an.instanceof(Model); - }); - }) - ); + Book.findOne({ include: [Page] }).then((book) => { + book.pages.forEach((page) => { + expect(page).to.be.an.instanceof(Page); + expect(page).to.be.an.instanceof(Model); + }); + })); }); describe('isNewRecord', () => { - it('returns true for non-saved objects', () => { - const user = User.build({username: 'user'}); + const user = User.build({ username: 'user' }); expect(user.id).to.be.null; expect(user.isNewRecord).to.be.ok; }); it('returns false for saved objects', () => - User - .build({username: 'user'}) + User.build({ username: 'user' }) .save() .then((user) => { expect(user.isNewRecord).to.not.be.ok; - }) - ); + })); it('returns false for created objects', () => - User - .create({username: 'user'}) - .then((user) => { - expect(user.id).to.not.be.null; - expect(user.isNewRecord).to.not.be.ok; - }) - ); + User.create({ username: 'user' }).then((user) => { + expect(user.id).to.not.be.null; + expect(user.isNewRecord).to.not.be.ok; + })); it('returns false for objects found by find method', () => - User - .create({username: 'user'}) - .then(() => - User - .create({username: 'user'}) - .then((user) => - User - .findByPk(user.id) - .then((_user) => { - expect(_user).to.not.be.null; - expect(_user && _user.isNewRecord).to.not.be.ok; - }) - ) + User.create({ username: 'user' }).then(() => + User.create({ username: 'user' }).then((user) => + User.findByPk(user.id).then((_user) => { + expect(_user).to.not.be.null; + expect(_user && _user.isNewRecord).to.not.be.ok; + }) ) - ); + )); it('returns false for objects found by findAll method', () => { const users: Array> = []; for (let i = 0; i < 10; i++) { - users[users.length] = {username: 'user'}; + users[users.length] = { username: 'user' }; } - return User - .bulkCreate(users) - .then(() => - User - .findAll() - .then((_users) => { - _users.forEach((u) => { - expect(u.isNewRecord).to.not.be.ok; - }); - }) - ); + return User.bulkCreate(users).then(() => + User.findAll().then((_users) => { + _users.forEach((u) => { + expect(u.isNewRecord).to.not.be.ok; + }); + }) + ); }); }); describe('increment', () => { - - beforeEach(() => User.create({id: 1, aNumber: 0, bNumber: 0})); + beforeEach(() => User.create({ id: 1, aNumber: 0, bNumber: 0 })); // TODO transactions doesn't seem to work with sqlite3 // if (sequelize['dialect']['supports']['transactions']) { @@ -195,192 +179,129 @@ describe('instance', () => { // ); // } - it('supports returning', () => { - if (sequelize['dialect']['supports']['returnValues']) { - User - .findByPk(1) - .then((user1) => { - - if (user1) { - return user1 - .increment('aNumber', {by: 2}) - .then(() => { - expect(user1.aNumber).to.be.equal(2); - }); - } - }); + User.findByPk(1).then((user1) => { + if (user1) { + return user1.increment('aNumber', { by: 2 }).then(() => { + expect(user1.aNumber).to.be.equal(2); + }); + } + }); } }); it('supports where conditions', () => - User - .findByPk(1) - .then((user1) => { - - if (user1) { - - return user1.increment(['aNumber'], {by: 2, where: {bNumber: 1}}) - .then(() => - User - .findByPk(1) - .then((user3) => { - expect(user3.aNumber).to.be.equal(0); - }) - ); - } - } - ) - ); + User.findByPk(1).then((user1) => { + if (user1) { + return user1.increment(['aNumber'], { by: 2, where: { bNumber: 1 } }).then(() => + User.findByPk(1).then((user3) => { + expect(user3.aNumber).to.be.equal(0); + }) + ); + } + })); it('with array', () => - User - .findByPk(1) - .then((user1) => - user1.increment(['aNumber'], {by: 2}) - .then(() => - User - .findByPk(1) - .then((user3) => { - expect(user3.aNumber).to.be.equal(2); - }) - ) + User.findByPk(1).then((user1) => + user1.increment(['aNumber'], { by: 2 }).then(() => + User.findByPk(1).then((user3) => { + expect(user3.aNumber).to.be.equal(2); + }) ) - ); + )); it('with single field', () => - User - .findByPk(1) - .then((user1) => - user1 - .increment('aNumber', {by: 2}) - .then(() => - User - .findByPk(1) - .then((user3) => { - expect(user3.aNumber).to.be.equal(2); - }) - ) + User.findByPk(1).then((user1) => + user1.increment('aNumber', { by: 2 }).then(() => + User.findByPk(1).then((user3) => { + expect(user3.aNumber).to.be.equal(2); + }) ) - ); + )); it('with single field and no value', () => - User - .findByPk(1) - .then((user1) => - user1.increment('aNumber') - .then(() => - User - .findByPk(1) - .then((user2) => { - expect(user2.aNumber).to.be.equal(1); - }) - ) + User.findByPk(1).then((user1) => + user1.increment('aNumber').then(() => + User.findByPk(1).then((user2) => { + expect(user2.aNumber).to.be.equal(1); + }) ) - ); + )); it('should still work right with other concurrent updates', () => - User - .findByPk(1) - .then((user1) => - // Select the user again (simulating a concurrent query) - User - .findByPk(1) - .then((user2) => - user2 - .update({ - aNumber: user2.aNumber + 1 + User.findByPk(1).then((user1) => + // Select the user again (simulating a concurrent query) + User.findByPk(1).then((user2) => + user2 + .update({ + aNumber: user2.aNumber + 1, + }) + .then(() => + user1.increment(['aNumber'], { by: 2 }).then(() => + User.findByPk(1).then((user5) => { + expect(user5.aNumber).to.be.equal(3); }) - .then(() => - user1 - .increment(['aNumber'], {by: 2}) - .then(() => - User - .findByPk(1) - .then((user5) => { - expect(user5.aNumber).to.be.equal(3); - }) - ) - ) + ) ) ) - ); + )); it('should still work right with other concurrent increments', () => - User - .findByPk(1) - .then((user1) => - Promise.all([ - user1.increment(['aNumber'], {by: 2}), - user1.increment(['aNumber'], {by: 2}), - user1.increment(['aNumber'], {by: 2}) - ]) - .then(() => - User - .findByPk(1) - .then((user2) => { - expect(user2.aNumber).to.equal(6); - }) - ) + User.findByPk(1).then((user1) => + Promise.all([ + user1.increment(['aNumber'], { by: 2 }), + user1.increment(['aNumber'], { by: 2 }), + user1.increment(['aNumber'], { by: 2 }), + ]).then(() => + User.findByPk(1).then((user2) => { + expect(user2.aNumber).to.equal(6); + }) ) - ); + )); it('with key value pair', () => - User - .findByPk(1) - .then((user1) => - user1 - .increment({aNumber: 1, bNumber: 2}) - .then(() => - User - .findByPk(1) - .then((user3) => { - expect(user3.aNumber).to.be.equal(1); - expect(user3.bNumber).to.be.equal(2); - }) - ) + User.findByPk(1).then((user1) => + user1.increment({ aNumber: 1, bNumber: 2 }).then(() => + User.findByPk(1).then((user3) => { + expect(user3.aNumber).to.be.equal(1); + expect(user3.bNumber).to.be.equal(2); + }) ) - ); + )); it('with timestamps set to true', () => { - const clock = useFakeTimers(); let oldDate; - return TimeStampsUser - .sync({force: true}) - .then(() => TimeStampsUser.create({aNumber: 1})) + return TimeStampsUser.sync({ force: true }) + .then(() => TimeStampsUser.create({ aNumber: 1 })) .then((user) => { - oldDate = user.updatedAt; clock.tick(1000); - return user.increment('aNumber', {by: 1}); + return user.increment('aNumber', { by: 1 }); }) .then(() => TimeStampsUser.findByPk(1)) - .then(user => { + .then((user) => { expect(user).to.have.property('updatedAt'); expect(user.updatedAt).to.be.greaterThan(oldDate); }); }); it('with timestamps set to true and options.silent set to true', () => { - let oldDate; - return TimeStampsUser - .sync({force: true}) - .then(() => TimeStampsUser.create({aNumber: 1})) + return TimeStampsUser.sync({ force: true }) + .then(() => TimeStampsUser.create({ aNumber: 1 })) .then((user) => { - oldDate = user.updatedAt; - return user.increment('aNumber', {by: 1, silent: true}); + return user.increment('aNumber', { by: 1, silent: true }); }) .then(() => TimeStampsUser.findByPk(1)) - .then(user => { + .then((user) => { expect(user).to.have.property('updatedAt'); expect(user.updatedAt).to.eqls(oldDate); }); @@ -388,7 +309,6 @@ describe('instance', () => { }); describe('decrement', () => { - // TODO transactions doesn't seem to work with sqlite3 // if (sequelize['dialect']['supports']['transactions']) { // @@ -420,166 +340,123 @@ describe('instance', () => { // } it('with array', () => - User - .create({aNumber: 0}) + User.create({ aNumber: 0 }) .then(() => User.findByPk(1)) .then((user1) => - user1 - .decrement(['aNumber'], {by: 2}) - .then(() => - User - .findByPk(1) - .then((user3) => { - expect(user3.aNumber).to.be.equal(-2); - }) - ) - ) - ); + user1.decrement(['aNumber'], { by: 2 }).then(() => + User.findByPk(1).then((user3) => { + expect(user3.aNumber).to.be.equal(-2); + }) + ) + )); it('with single field', () => - User - .create({aNumber: 0}) + User.create({ aNumber: 0 }) .then(() => User.findByPk(1)) .then((user1) => - user1 - .decrement('aNumber', {by: 2}) - .then(() => - User - .findByPk(1) - .then((user3) => { - expect(user3.aNumber).to.be.equal(-2); - }) - ) - ) - ); + user1.decrement('aNumber', { by: 2 }).then(() => + User.findByPk(1).then((user3) => { + expect(user3.aNumber).to.be.equal(-2); + }) + ) + )); it('with single field and no value', () => - User - .create({aNumber: 0}) + User.create({ aNumber: 0 }) .then(() => User.findByPk(1)) .then((user1) => - user1 - .decrement('aNumber') - .then(() => - User - .findByPk(1) - .then((user2) => { - expect(user2.aNumber).to.be.equal(-1); - }) - ) - ) - ); + user1.decrement('aNumber').then(() => + User.findByPk(1).then((user2) => { + expect(user2.aNumber).to.be.equal(-1); + }) + ) + )); it('should still work right with other concurrent updates', () => - User - .create({aNumber: 0}) + User.create({ aNumber: 0 }) .then(() => User.findByPk(1)) .then((user1) => // Select the user again (simulating a concurrent query) - User - .findByPk(1) - .then((user2) => - user2 - .update({ - aNumber: user2.aNumber + 1 - }) - .then(() => - user1 - .decrement(['aNumber'], {by: 2}) - .then(() => - User - .findByPk(1) - .then((user5) => { - expect(user5.aNumber).to.be.equal(-1); - }) - ) + User.findByPk(1).then((user2) => + user2 + .update({ + aNumber: user2.aNumber + 1, + }) + .then(() => + user1.decrement(['aNumber'], { by: 2 }).then(() => + User.findByPk(1).then((user5) => { + expect(user5.aNumber).to.be.equal(-1); + }) ) - ) - ) - ); + ) + ) + )); it('should still work right with other concurrent increments', () => - User - .create({aNumber: 0}) + User.create({ aNumber: 0 }) .then(() => User.findByPk(1)) .then((user1) => Promise.all([ - user1.decrement(['aNumber'], {by: 2}), - user1.decrement(['aNumber'], {by: 2}), - user1.decrement(['aNumber'], {by: 2}) - ]) - .then(() => - User - .findByPk(1) - .then((user2) => { - expect(user2.aNumber).to.equal(-6); - }) - ) - ) - ); + user1.decrement(['aNumber'], { by: 2 }), + user1.decrement(['aNumber'], { by: 2 }), + user1.decrement(['aNumber'], { by: 2 }), + ]).then(() => + User.findByPk(1).then((user2) => { + expect(user2.aNumber).to.equal(-6); + }) + ) + )); it('with key value pair', () => - User - .create({aNumber: 0, bNumber: 0}) + User.create({ aNumber: 0, bNumber: 0 }) .then(() => User.findByPk(1)) .then((user1) => - user1 - .decrement({aNumber: 1, bNumber: 2}) - .then(() => - User - .findByPk(1) - .then((user3) => { - expect(user3.aNumber).to.be.equal(-1); - expect(user3.bNumber).to.be.equal(-2); - }) - ) - ) - ); + user1.decrement({ aNumber: 1, bNumber: 2 }).then(() => + User.findByPk(1).then((user3) => { + expect(user3.aNumber).to.be.equal(-1); + expect(user3.bNumber).to.be.equal(-2); + }) + ) + )); it('with timestamps set to true', () => { - let oldDate; const clock = useFakeTimers(); - return TimeStampsUser - .sync({force: true}) - .then(() => TimeStampsUser.create({aNumber: 1})) + return TimeStampsUser.sync({ force: true }) + .then(() => TimeStampsUser.create({ aNumber: 1 })) .then((user) => { oldDate = user.updatedAt; clock.tick(1000); - return user.decrement('aNumber', {by: 1}); + return user.decrement('aNumber', { by: 1 }); }) .then(() => TimeStampsUser.findByPk(1)) - .then(user => { + .then((user) => { expect(user).to.have.property('updatedAt'); expect(user.updatedAt).to.be.greaterThan(oldDate); }); }); it('with timestamps set to true and options.silent set to true', () => { - let oldDate; - return TimeStampsUser - .sync({force: true}) - .then(() => TimeStampsUser.create({aNumber: 1})) + return TimeStampsUser.sync({ force: true }) + .then(() => TimeStampsUser.create({ aNumber: 1 })) .then((user) => { oldDate = user.updatedAt; - return user.decrement('aNumber', {by: 1, silent: true}); + return user.decrement('aNumber', { by: 1, silent: true }); }) .then(() => TimeStampsUser.findByPk(1)) - .then(user => { + .then((user) => { expect(user).to.have.property('updatedAt'); expect(user.updatedAt).to.eqls(oldDate); }); }); - }); describe('reload', () => { - // TODO transactions doesn't seem to work with sqlite3 // if (sequelize['dialect']['supports']['transactions']) { // @@ -615,69 +492,55 @@ describe('instance', () => { // } it('should return a reference to the same DAO instead of creating a new one', () => - User - .create({username: 'John Doe'}) - .then((originalUser) => - originalUser - .update({username: 'Doe John'}) - .then(() => - originalUser - .reload() - .then((updatedUser) => { - expect(originalUser === updatedUser).to.be.true; - }) - ) + User.create({ username: 'John Doe' }).then((originalUser) => + originalUser.update({ username: 'Doe John' }).then(() => + originalUser.reload().then((updatedUser) => { + expect(originalUser === updatedUser).to.be.true; + }) ) - ); + )); it('should update the values on all references to the DAO', () => - User - .create({username: 'John Doe'}) - .then((originalUser) => - User - .findByPk(originalUser.id) - .then((updater) => - updater - .update({username: 'Doe John'}) - .then(() => { - // We used a different reference when calling update, so originalUser is now out of sync - expect(originalUser.username).to.equal('John Doe'); - return originalUser.reload().then((updatedUser) => { - expect(originalUser.username).to.equal('Doe John'); - expect(updatedUser.username).to.equal('Doe John'); - }); - }) - ) + User.create({ username: 'John Doe' }).then((originalUser) => + User.findByPk(originalUser.id).then((updater) => + updater.update({ username: 'Doe John' }).then(() => { + // We used a different reference when calling update, so originalUser is now out of sync + expect(originalUser.username).to.equal('John Doe'); + return originalUser.reload().then((updatedUser) => { + expect(originalUser.username).to.equal('Doe John'); + expect(updatedUser.username).to.equal('Doe John'); + }); + }) ) - ); + )); it('should support updating a subset of attributes', () => - User - .create({aNumber: 1, bNumber: 1}) + User.create({ aNumber: 1, bNumber: 1 }) // TODO Sequelize typings issue caused by sequelize/types/lib/model.d.ts on line 2394 // TODO The order of overloads is wrong - .tap((user) => User.update({bNumber: 2}, {where: {id: user.get('id') as any}})) - .then((user) => user.reload({attributes: ['bNumber']})) + .then((user) => { + User.update({ bNumber: 2 }, { where: { id: user.get('id') as any } }); + return user; + }) + .then((user) => user.reload({ attributes: ['bNumber'] })) .then((user) => { expect(user.get('aNumber')).to.equal(1); expect(user.get('bNumber')).to.equal(2); - }) - ); + })); // taps are no more supported it('should update read only attributes as well (updatedAt)', () => { let _originalUser; let originallyUpdatedAt; let _updatedUser; - return TimeStampsUser - .create({username: 'John Doe'}) + return TimeStampsUser.create({ username: 'John Doe' }) .then((originalUser) => { originallyUpdatedAt = originalUser.updatedAt; _originalUser = originalUser; return TimeStampsUser.findByPk(originalUser.id); }) - .then((updater) => updater.update({username: 'Doe John'})) + .then((updater) => updater.update({ username: 'Doe John' })) .then((updatedUser) => { _updatedUser = updatedUser; _originalUser.reload(); @@ -689,181 +552,163 @@ describe('instance', () => { }); it('should update the associations as well', () => - Book - .sync({force: true}) - .then(() => Page.sync({force: true})) - .then(() => Book.create({title: 'A very old book'})) + Book.sync({ force: true }) + .then(() => Page.sync({ force: true })) + .then(() => Book.create({ title: 'A very old book' })) .then((book) => - Page - .create({content: 'om nom nom'}) - .then((page) => - book - .$set('pages', [page]) - .then(() => Book.findOne({where: {id: book.id}, include: [Page]})) - .then((leBook: Book) => - page - .update({content: 'something totally different'}) - .then((_page: Page) => { - expect(leBook.pages.length).to.equal(1); - expect(leBook.pages[0].content).to.equal('om nom nom'); - expect(_page.content).to.equal('something totally different'); - - return leBook - .reload() - .then((_leBook: any) => { - expect(_leBook.pages.length).to.equal(1); - expect(_leBook.pages[0].content).to.equal('something totally different'); - expect(_page.content).to.equal('something totally different'); - }); - }) - ) - ) - ) - ); + Page.create({ content: 'om nom nom' }).then((page) => + book + .$set('pages', [page]) + .then(() => Book.findOne({ where: { id: book.id }, include: [Page] })) + .then((leBook: Book) => + page.update({ content: 'something totally different' }).then((_page: Page) => { + expect(leBook.pages.length).to.equal(1); + expect(leBook.pages[0].content).to.equal('om nom nom'); + expect(_page.content).to.equal('something totally different'); + + return leBook.reload().then((_leBook: any) => { + expect(_leBook.pages.length).to.equal(1); + expect(_leBook.pages[0].content).to.equal('something totally different'); + expect(_page.content).to.equal('something totally different'); + }); + }) + ) + ) + )); it('should update internal options of the instance', () => - Book - .sync({force: true}) - .then(() => Page.sync({force: true})) - .then(() => Book.create({title: 'A very old book'})) + Book.sync({ force: true }) + .then(() => Page.sync({ force: true })) + .then(() => Book.create({ title: 'A very old book' })) .then((book) => - Page - .create() - .then((page) => - book['setPages']([page]) // todo - .then(() => - Book - .findOne({where: {id: book.id}}) - .then((leBook) => { - return leBook.reload({include: [Page]}) - .then((_leBook: Book) => { - expect(_leBook.pages.length).to.equal(1); - expect(_leBook.get({plain: true})['pages'].length).to.equal(1); - }); - }) - ) - ) - ) - ); + Page.create().then((page) => + book['setPages']([page]) // todo + .then(() => + Book.findOne({ where: { id: book.id } }).then((leBook) => { + return leBook.reload({ include: [Page] }).then((_leBook: Book) => { + expect(_leBook.pages.length).to.equal(1); + expect(_leBook.get({ plain: true })['pages'].length).to.equal(1); + }); + }) + ) + ) + )); it('should return an error when reload fails', () => - User - .create({username: 'John Doe'}) - .then((user) => - user - .destroy() - .then(() => { - return expect(user.reload()).to.be.rejectedWith( - InstanceError, - 'Instance could not be reloaded because it does not exist anymore (find call returned null)' - ); - }) - ) - ); + User.create({ username: 'John Doe' }).then((user) => + user.destroy().then(() => { + return expect(user.reload()).to.be.rejectedWith( + InstanceError, + 'Instance could not be reloaded because it does not exist anymore (find call returned null)' + ); + }) + )); it('should set an association to null after deletion, 1-1', () => - Shoe - .create({ + Shoe.create( + { brand: 'the brand', player: { - name: 'the player' - } - }, {include: [Player]}) - .then((shoe: Shoe) => - Player - .findOne({ - where: {id: shoe.player.id}, - include: [Shoe] - }) - .then((lePlayer: Player) => { - expect(lePlayer.shoe).not.to.be.null; - return lePlayer.shoe.destroy().return(lePlayer); - }) - .then((lePlayer) => lePlayer.reload() as any) - .then((lePlayer: Player) => { - expect(lePlayer.shoe).to.be.null; - }) - ) - ); + name: 'the player', + }, + }, + { include: [Player] } + ).then((shoe: Shoe) => + Player.findOne({ + where: { id: shoe.player.id }, + include: [Shoe], + }) + .then((lePlayer: Player) => { + expect(lePlayer.shoe).not.to.be.null; + lePlayer.shoe.destroy(); // Destroy Now Returns Void So can't call return() void + return lePlayer; + }) + .then((lePlayer) => lePlayer.reload() as any) + .then((lePlayer: Player) => { + expect(lePlayer.shoe).to.be.null; + }) + )); it('should set an association to empty after all deletion, 1-N', () => - Team - .create({ + Team.create( + { name: 'the team', - players: [{ - name: 'the player1' - }, { - name: 'the player2' - }] - }, {include: [Player]}) - .then((team) => - Team - .findOne({ - where: {id: team.id}, - include: [Player] - }) - .then((leTeam: Team) => { - expect(leTeam.players).not.to.be.empty; + players: [ + { + name: 'the player1', + }, + { + name: 'the player2', + }, + ], + }, + { include: [Player] } + ).then((team) => + Team.findOne({ + where: { id: team.id }, + include: [Player], + }) + .then((leTeam: Team) => { + expect(leTeam.players).not.to.be.empty; - return leTeam.players[1] - .destroy() - .then(() => { - return leTeam.players[0].destroy(); - }).return(leTeam); - }) - .then((leTeam) => leTeam.reload() as any) - .then((leTeam: Team) => { - expect(leTeam.players).to.be.empty; - }) - ) - ); + return leTeam.players[1].destroy().then(() => { + leTeam.players[0].destroy(); + return leTeam; // Destroy Return type is Void + }); + }) + .then((leTeam) => leTeam.reload() as any) + .then((leTeam: Team) => { + expect(leTeam.players).to.be.empty; + }) + )); it('should update the associations after one element deleted', () => - Team - .create({ + Team.create( + { name: 'the team', - players: [{ - name: 'the player1' - }, { - name: 'the player2' - }] - }, {include: [Player]}) - .then((team) => - Team - .findOne({ - where: {id: team.id}, - include: [Player] - }) - .then((leTeam: Team) => { - expect(leTeam.players).to.have.length(2); - return leTeam.players[0].destroy().then(() => leTeam as Team); - }) - .then((leTeam) => leTeam.reload() as any) - .then((leTeam: Team) => { - expect(leTeam.players).to.have.length(1); - }) - ) - ); + players: [ + { + name: 'the player1', + }, + { + name: 'the player2', + }, + ], + }, + { include: [Player] } + ).then((team) => + Team.findOne({ + where: { id: team.id }, + include: [Player], + }) + .then((leTeam: Team) => { + expect(leTeam.players).to.have.length(2); + leTeam.players[0].destroy(); // Since destroy return void now + return leTeam; + }) + .then((leTeam) => leTeam.reload()) + .then((leTeam: Team) => { + expect(leTeam.players).to.have.length(1); + }) + )); }); describe('default values', () => { - describe('uuid', () => { - it('should store a string in uuidv1 and uuidv4', () => { - const user = User.build({username: 'a user'}); + const user = User.build({ username: 'a user' }); expect(user.uuidv1).to.be.a('string'); expect(user.uuidv4).to.be.a('string'); }); it('should store a string of length 36 in uuidv1 and uuidv4', () => { - const user = User.build({username: 'a user'}); + const user = User.build({ username: 'a user' }); expect(user.uuidv1).to.have.length(36); expect(user.uuidv4).to.have.length(36); }); it('should store a valid uuid in uuidv1 and uuidv4 that conforms to the UUID v1 and v4 specifications', () => { - const user = User.build({username: 'a user'}); + const user = User.build({ username: 'a user' }); expect(validateUUID(user.uuidv1, 1)).to.be.true; expect(validateUUID(user.uuidv4, 4)).to.be.true; }); @@ -873,142 +718,119 @@ describe('instance', () => { expect(person.id).to.be.ok; expect(person.id).to.have.length(36); }); - }); describe('current date', () => { - it('should store a date in touchedAt', () => { - const user = User.build({username: 'a user'}); + const user = User.build({ username: 'a user' }); expect(user.touchedAt).to.be.instanceof(Date); }); it('should store the current date in touchedAt', () => { const clock = useFakeTimers(); clock.tick(5000); - const user = User.build({username: 'a user'}); + const user = User.build({ username: 'a user' }); clock.restore(); expect(+user.touchedAt).to.be.equal(5000); }); }); describe('allowNull date', () => { - it('should be just "null" and not Date with Invalid Date', () => - User - .build({username: 'a user'}) + User.build({ username: 'a user' }) .save() .then(() => - User - .findOne({where: {username: 'a user'}}) - .then((user) => { - expect(user.dateAllowNullTrue).to.be.null; - }) - ) - ); + User.findOne({ where: { username: 'a user' } }).then((user) => { + expect(user.dateAllowNullTrue).to.be.null; + }) + )); it('should be the same valid date when saving the date', () => { - const date = new Date(); - return User - .build({username: 'a user', dateAllowNullTrue: date}) + return User.build({ username: 'a user', dateAllowNullTrue: date }) .save() .then(() => - User - .findOne({where: {username: 'a user'}}) - .then((user) => { - expect(user.dateAllowNullTrue.toString()).to.equal(date.toString()); - }) + User.findOne({ where: { username: 'a user' } }).then((user) => { + expect(user.dateAllowNullTrue.toString()).to.equal(date.toString()); + }) ); }); }); describe('super user boolean', () => { - it('should default to false', () => - User - .build({ - username: 'a user' - }) + User.build({ + username: 'a user', + }) .save() .then(() => User.findOne({ where: { - username: 'a user' - } - })) + username: 'a user', + }, + }) + ) .then((user) => { expect(user.isSuperUser).to.be.false; - }) - ); + })); it('should override default when given truthy boolean', () => - User - .build({ - username: 'a user', - isSuperUser: true - }) + User.build({ + username: 'a user', + isSuperUser: true, + }) .save() .then(() => { User.findOne({ where: { - username: 'a user' - } - }) - .then((user) => { - expect(user.isSuperUser).to.be.true; - }); - }) - ); + username: 'a user', + }, + }).then((user) => { + expect(user.isSuperUser).to.be.true; + }); + })); it('should override default when given truthy boolean-string ("true")', () => - User - .build({ - username: 'a user', - isSuperUser: "true" as any // by intention - }) + User.build({ + username: 'a user', + isSuperUser: 'true' as any, // by intention + }) .save() .then(() => { User.findOne({ where: { - username: 'a user' - } - }) - .then((user) => { - expect(user.isSuperUser).to.be.true; - }); - }) - ); + username: 'a user', + }, + }).then((user) => { + expect(user.isSuperUser).to.be.true; + }); + })); it('should override default when given truthy boolean-int (1)', () => - User - .build({ - username: 'a user', - isSuperUser: 1 - }) + User.build({ + username: 'a user', + isSuperUser: 1, + }) .save() .then(() => { User.findOne({ where: { - username: 'a user' - } - }) - .then((user) => { - expect(user.isSuperUser).to.be.true; - }); - }) - ); + username: 'a user', + }, + }).then((user) => { + expect(user.isSuperUser).to.be.true; + }); + })); it('should throw error when given value of incorrect type', () => { let callCount = 0; - return User - .build({ - username: 'a user', - isSuperUser: "INCORRECT_VALUE_TYPE" as any // incorrect value by intention - }) + return User.build({ + username: 'a user', + isSuperUser: 'INCORRECT_VALUE_TYPE' as any, // incorrect value by intention + }) .save() - .then(() => callCount += 1) + .then(() => (callCount += 1)) .catch((err) => { expect(callCount).to.equal(0); expect(err).to.exist; @@ -1019,27 +841,19 @@ describe('instance', () => { }); describe('complete', () => { - it('gets triggered if an error occurs', () => - User - .findOne({where: ['asdasdasd'] as any}) - .catch((err) => { - expect(err).to.exist; - expect(err.message).to.exist; - }) - ); + User.findOne({ where: ['asdasdasd'] as any }).catch((err) => { + expect(err).to.exist; + expect(err.message).to.exist; + })); it('gets triggered if everything was ok', () => - User - .count() - .then((result) => { - expect(result).to.exist; - }) - ); + User.count().then((result) => { + expect(result).to.exist; + })); }); describe('save', () => { - // TODO transactions doesn't seem to work with sqlite3 // if (sequelize['dialect']['supports']['transactions']) { // @@ -1069,17 +883,16 @@ describe('instance', () => { it('only updates fields in passed array', () => { const date = new Date(1990, 1, 1); - return User - .create({ - username: 'foo', - touchedAt: new Date() - }) - .then((user) => { - user.username = 'fizz'; - user.touchedAt = date; + return User.create({ + username: 'foo', + touchedAt: new Date(), + }).then((user) => { + user.username = 'fizz'; + user.touchedAt = date; - return user - .save({fields: ['username']}) + return ( + user + .save({ fields: ['username'] }) // re-select user .then(() => User.findByPk(user.id)) .then((user2) => { @@ -1088,48 +901,40 @@ describe('instance', () => { // bio should be unchanged expect(user2).to.have.property('birthDate'); expect(user2.birthDate).not.to.equal(date); - }); - - }); + }) + ); + }); }); it('should work on a model with an attribute named length', () => - Box - .sync({force: true}) - .then(() => Box.create({length: 1, width: 2, height: 3})) - .then((box: Box) => box.update({length: 4, width: 5, height: 6})) + Box.sync({ force: true }) + .then(() => Box.create({ length: 1, width: 2, height: 3 })) + .then((box: Box) => box.update({ length: 4, width: 5, height: 6 })) .then(() => Box.findOne({})) .then((box: Box) => { expect(box.get('length')).to.equal(4); expect(box.get('width')).to.equal(5); expect(box.get('height')).to.equal(6); - }) - ); + })); // TODO Check test it('only validates fields in passed array', () => - User - .build({ - ['blabla' as any]: 'cake', // invalid, but not saved - username: '1' - }) - .save({ - fields: ['username'] - }) - ); + User.build({ + ['blabla' as any]: 'cake', // invalid, but not saved + username: '1', + }).save({ + fields: ['username'], + })); describe('hooks', () => { it('should update attributes added in hooks when default fields are used', () => { + User.beforeUpdate((instance) => { + instance.set('email', 'B'); + }); - User - .beforeUpdate((instance) => { - instance.set('email', 'B'); - }); - - return User - .sync({force: true}) - .then(() => User.create({name: 'A', bio: 'A', email: 'A'})) - .then((user) => user.set({name: 'B', bio: 'B'}).save()) + return User.sync({ force: true }) + .then(() => User.create({ name: 'A', bio: 'A', email: 'A' })) + .then((user) => user.set({ name: 'B', bio: 'B' }).save()) .then(() => User.findOne({})) .then((user) => { expect(user.get('name')).to.equal('B'); @@ -1139,15 +944,13 @@ describe('instance', () => { }); it('should update attributes changed in hooks when default fields are used', () => { - User.beforeUpdate((instance) => { instance.set('email', 'C'); }); - return User - .sync({force: true}) - .then(() => User.create({name: 'A', bio: 'A', email: 'A'})) - .then((user: User) => user.set({name: 'B', bio: 'B', email: 'B'}).save()) + return User.sync({ force: true }) + .then(() => User.create({ name: 'A', bio: 'A', email: 'A' })) + .then((user: User) => user.set({ name: 'B', bio: 'B', email: 'B' }).save()) .then(() => User.findOne({})) .then((user) => { expect(user.get('name')).to.equal('B'); @@ -1161,17 +964,22 @@ describe('instance', () => { instance.set('email', 'B'); }); - return UserWithValidation - .sync({force: true}) - .then(() => UserWithValidation.create({ - name: 'A', - bio: 'A', - email: 'valid.email@gmail.com' - })) + return UserWithValidation.sync({ force: true }) + .then(() => + UserWithValidation.create({ + name: 'A', + bio: 'A', + email: 'valid.email@gmail.com', + }) + ) .then((user) => - expect(user.set({ - name: 'B' - }).save()).to.be.rejectedWith(ValidationError) + expect( + user + .set({ + name: 'B', + }) + .save() + ).to.be.rejectedWith(ValidationError) ) .then(() => UserWithValidation.findOne({})) .then((user) => { @@ -1180,37 +988,40 @@ describe('instance', () => { }); it('should validate attributes changed in hooks when default fields are used', () => { - UserWithValidation.beforeUpdate((instance) => { instance.set('email', 'B'); }); - return UserWithValidation - .sync({force: true}) - .then(() => UserWithValidation.create({ - name: 'A', - bio: 'A', - email: 'valid.email@gmail.com' - })) + return UserWithValidation.sync({ force: true }) + .then(() => + UserWithValidation.create({ + name: 'A', + bio: 'A', + email: 'valid.email@gmail.com', + }) + ) .then((user) => - expect(user.set({ - name: 'B', - email: 'still.valid.email@gmail.com' - }).save()).to.be.rejectedWith(ValidationError) + expect( + user + .set({ + name: 'B', + email: 'still.valid.email@gmail.com', + }) + .save() + ).to.be.rejectedWith(ValidationError) ) .then(() => UserWithValidation.findOne({})) .then((user) => { expect(user.get('email')).to.equal('valid.email@gmail.com'); }); }); - }); it('stores an entry in the database', () => { const username = 'user'; const user = User.build({ username, - touchedAt: new Date(1984, 8, 23) + touchedAt: new Date(1984, 8, 23), }); return User.findAll() @@ -1221,37 +1032,32 @@ describe('instance', () => { }) .then(() => User.findAll()) .then((users) => { - expect(users).to.have.length(1); expect(users[0].username).to.equal(username); expect(users[0].touchedAt).to.be.instanceof(Date); expect(users[0].touchedAt.toString()).to.equal(new Date(1984, 8, 23).toString()); - }) - ; + }); }); it('handles an entry with primaryKey of zero', () => { const username = 'user'; const newUsername = 'newUser'; - return UserWithNoAutoIncrementation.create({id: 0, username}) + return UserWithNoAutoIncrementation.create({ id: 0, username }) .then((user) => { - expect(user).to.be.ok; expect(user.id).to.equal(0); expect(user.username).to.equal(username); }) .then(() => UserWithNoAutoIncrementation.findByPk(0)) .then((user) => { - expect(user).to.be.ok; expect(user.id).to.equal(0); expect(user.username).to.equal(username); - return user.update({username: newUsername}); + return user.update({ username: newUsername }); }) .then((user) => { - expect(user).to.be.ok; expect(user.id).to.equal(0); expect(user.username).to.equal(newUsername); @@ -1262,70 +1068,53 @@ describe('instance', () => { const clock = useFakeTimers(); const now = new Date(); - const user = TimeStampsUser.build({username: 'user'}); + const user = TimeStampsUser.build({ username: 'user' }); clock.tick(1000); - return user - .save() - .then(() => { - expect(user).to.have.property('updatedAt'); - expect(user.updatedAt).to.be.least(now as any); - }) - ; + return user.save().then(() => { + expect(user).to.have.property('updatedAt'); + expect(user.updatedAt).to.be.least(now as any); + }); }); it('does not update timestamps when passing silent=true', () => { - const clock = useFakeTimers(); - return TimeStampsUser - .create({username: 'user'}) - .then((user) => { - - const updatedAt = user.updatedAt; + return TimeStampsUser.create({ username: 'user' }).then((user) => { + const updatedAt = user.updatedAt; - clock.tick(1000); + clock.tick(1000); - return user - .update({username: 'userman'}, {silent: true}) - .then(() => { - expect(user).to.have.property('updatedAt').equalTime(updatedAt); - }) - ; - }) - ; + return user.update({ username: 'userman' }, { silent: true }).then(() => { + expect(user).to.have.property('updatedAt').equalTime(updatedAt); + }); + }); }); it('does not update timestamps when passing silent=true in a bulk update', () => { let updatedAtPeter; let updatedAtPaul; const clock = useFakeTimers(); - const data = [ - {username: 'Paul'}, - {username: 'Peter'} - ]; + const data = [{ username: 'Paul' }, { username: 'Peter' }]; - return TimeStampsUser - .bulkCreate(data) + return TimeStampsUser.bulkCreate(data) .then(() => TimeStampsUser.findAll()) .then((users) => { updatedAtPaul = users[0].updatedAt; updatedAtPeter = users[1].updatedAt; }) .then(() => { - clock.tick(150); - return TimeStampsUser - .update( - {aNumber: 1}, - { - where: {}, - // TODO silent options missing in UpdateOptions - ['silent' as any]: true - } - ); + return TimeStampsUser.update( + { aNumber: 1 }, + { + where: {}, + // TODO silent options missing in UpdateOptions + ['silent' as any]: true, + } + ); }) .then(() => TimeStampsUser.findAll()) .then((users) => { @@ -1335,37 +1124,29 @@ describe('instance', () => { }); describe('when nothing changed', () => { - let clock; - beforeEach(() => clock = useFakeTimers()); + beforeEach(() => (clock = useFakeTimers())); afterEach(() => clock.restore()); it('does not update timestamps', () => - TimeStampsUser - .create({username: 'John'}) - .then(() => TimeStampsUser.findOne({where: {username: 'John'}})) + TimeStampsUser.create({ username: 'John' }) + .then(() => TimeStampsUser.findOne({ where: { username: 'John' } })) .then((user) => { - const updatedAt = user.updatedAt; clock.tick(2000); - return user - .save() - .then((newlySavedUser) => { - - expect(newlySavedUser.updatedAt).to.equalTime(updatedAt); + return user.save().then((newlySavedUser) => { + expect(newlySavedUser.updatedAt).to.equalTime(updatedAt); - return TimeStampsUser - .findOne({where: {username: 'John'}}) - .then((_newlySavedUser) => { - - expect(_newlySavedUser.updatedAt).to.equalTime(updatedAt); - }); - }); - }) - ); + return TimeStampsUser.findOne({ where: { username: 'John' } }).then( + (_newlySavedUser) => { + expect(_newlySavedUser.updatedAt).to.equalTime(updatedAt); + } + ); + }); + })); // Does not create an empty query but a corrupted one; // Since "bio" is a virtual field, sequelize produces this @@ -1383,54 +1164,43 @@ describe('instance', () => { }); it('updates with function and column value', () => - User - .create({ - aNumber: 42 - }) - .then((user) => { - - user.bNumber = Sequelize.col('aNumber') as any; - user.username = Sequelize.fn('upper', 'sequelize') as any; + User.create({ + aNumber: 42, + }).then((user) => { + user.bNumber = Sequelize.col('aNumber') as any; + user.username = Sequelize.fn('upper', 'sequelize') as any; - return user - .save() - .then(() => User.findByPk(user.id)) - .then((user2) => { - expect(user2.username).to.equal('SEQUELIZE'); - expect(user2.bNumber).to.equal(42); - }); - }) - ); + return user + .save() + .then(() => User.findByPk(user.id)) + .then((user2) => { + expect(user2.username).to.equal('SEQUELIZE'); + expect(user2.bNumber).to.equal(42); + }); + })); describe('without timestamps option', () => { - it("doesn't update the updatedAt column", () => - UserWithCustomUpdatedAt - .sync() - .then(() => UserWithCustomUpdatedAt.create({name: 'john doe'})) + UserWithCustomUpdatedAt.sync() + .then(() => UserWithCustomUpdatedAt.create({ name: 'john doe' })) .then((johnDoe) => { // sqlite and mysql return undefined, whereas postgres returns null expect([undefined, null].indexOf(johnDoe.updatedAt)).not.to.be.equal(-1); - }) - ); + })); }); describe('with custom timestamp options', () => { - it('updates the createdAt column if updatedAt is disabled', () => { const now = new Date(); const clock = useFakeTimers(); clock.tick(1000); - UserWithCreatedAtButWithoutUpdatedAt - .sync() - .then(() => UserWithCreatedAtButWithoutUpdatedAt - .create({name: 'john doe'})) + UserWithCreatedAtButWithoutUpdatedAt.sync() + .then(() => UserWithCreatedAtButWithoutUpdatedAt.create({ name: 'john doe' })) .then((johnDoe) => { expect(johnDoe).not.to.have.property('updatedAt'); expect(now).to.be.beforeTime(johnDoe.createdAt); - }) - ; + }); }); it('updates the updatedAt column if createdAt is disabled', () => { @@ -1440,10 +1210,9 @@ describe('instance', () => { @Table({ timestamps: true, - createdAt: false + createdAt: false, }) - class User2 extends Model { - + class User2 extends Model { @Column username: string; } @@ -1451,22 +1220,18 @@ describe('instance', () => { sequelize.addModels([User2]); return User2.sync() - .then(() => User2.create({username: 'john doe'})) + .then(() => User2.create({ username: 'john doe' })) .then((johnDoe) => { - expect(johnDoe.createdAt).to.be.undefined; expect(now).to.be.beforeTime(johnDoe.updatedAt); }); - }); it('works with `allowNull: false` on createdAt and updatedAt columns', () => { - @Table({ - timestamps: true + timestamps: true, }) - class User3 extends Model { - + class User3 extends Model { @Column username: string; @@ -1481,9 +1246,8 @@ describe('instance', () => { sequelize.addModels([User3]); - return User3 - .sync() - .then(() => User3.create({username: 'john doe'})) + return User3.sync() + .then(() => User3.create({ username: 'john doe' })) .then((johnDoe) => { expect(johnDoe.createdAt).to.be.an.instanceof(Date); expect(!isNaN(johnDoe.createdAt.valueOf())).to.be.ok; @@ -1492,56 +1256,44 @@ describe('instance', () => { }); }); - describe('with version option', () => { - - it("version column is updated by sequelize", () => { - let version = undefined; - UserWithCustomUpdatedAt - .sync() - .then(() => UserWithVersion.create({name: 'john doe'})) - .then((johnDoe: UserWithVersion) => { - expect(johnDoe.version).not.to.be.undefined; - version = johnDoe.version; - return johnDoe.update({name: 'doe john'}); - }) - .then((johnDoe: UserWithVersion) => { - expect(johnDoe.name).not.equals('doe john'); - expect(johnDoe.version).not.equals(version); - return johnDoe.update({}); - }); - } - ); + it('version column is updated by sequelize', () => { + let version = undefined; + UserWithCustomUpdatedAt.sync() + .then(() => UserWithVersion.create({ name: 'john doe' })) + .then((johnDoe: UserWithVersion) => { + expect(johnDoe.version).not.to.be.undefined; + version = johnDoe.version; + return johnDoe.update({ name: 'doe john' }); + }) + .then((johnDoe: UserWithVersion) => { + expect(johnDoe.name).not.equals('doe john'); + expect(johnDoe.version).not.equals(version); + return johnDoe.update({}); + }); + }); }); - it('should fail a validation upon creating', () => - User - .create({aNumber: 'hello' as any}) - .catch((err) => { - expect(err).to.exist; - expect(err).to.be.instanceof(Object); - expect(err.get('aNumber')).to.be.instanceof(Array); - expect(err.get('aNumber')[0]).to.exist; - expect(err.get('aNumber')[0].message).to.equal('Validation isInt on aNumber failed'); - }) - ); + User.create({ aNumber: 'hello' as any }).catch((err) => { + expect(err).to.exist; + expect(err).to.be.instanceof(Object); + expect(err.get('aNumber')).to.be.instanceof(Array); + expect(err.get('aNumber')[0]).to.exist; + expect(err.get('aNumber')[0].message).to.equal('Validation isInt on aNumber failed'); + })); it('should fail a validation upon creating with hooks false', () => - User - .create({aNumber: 'hello' as any}, {hooks: false} as any) - .catch((err) => { - expect(err).to.exist; - expect(err).to.be.instanceof(Object); - expect(err.get('aNumber')).to.be.instanceof(Array); - expect(err.get('aNumber')[0]).to.exist; - expect(err.get('aNumber')[0].message).to.equal('Validation isInt on aNumber failed'); - }) - ); + User.create({ aNumber: 'hello' as any }, { hooks: false } as any).catch((err) => { + expect(err).to.exist; + expect(err).to.be.instanceof(Object); + expect(err.get('aNumber')).to.be.instanceof(Array); + expect(err.get('aNumber')[0]).to.exist; + expect(err.get('aNumber')[0].message).to.equal('Validation isInt on aNumber failed'); + })); it('should fail a validation upon building', () => - User - .build({aNumber: 0, username: 'aaaaaaaaaaaaaaaaaaaaaaaaaa'}) + User.build({ aNumber: 0, username: 'aaaaaaaaaaaaaaaaaaaaaaaaaa' }) .save() .catch((err) => { expect(err).to.exist; @@ -1550,13 +1302,11 @@ describe('instance', () => { expect(err.get('username')).to.be.instanceof(Array); expect(err.get('username')[0]).to.exist; expect(err.get('username')[0].message).to.equal('Validation len on username failed'); - }) - ); + })); it('should fail a validation when updating', () => - User - .create({aNumber: 0}) - .then((user) => user.update({aNumber: 'hello' as any})) + User.create({ aNumber: 0 }) + .then((user) => user.update({ aNumber: 'hello' as any })) .catch((err) => { expect(err).to.exist; expect(err).to.be.instanceof(Object); @@ -1564,22 +1314,18 @@ describe('instance', () => { expect(err.get('aNumber')).to.be.instanceof(Array); expect(err.get('aNumber')[0]).to.exist; expect(err.get('aNumber')[0].message).to.equal('Validation isInt on aNumber failed'); - }) - ); + })); it('takes zero into account', () => - User - .build({aNumber: 0}) - .save({fields: ['aNumber']}) + User.build({ aNumber: 0 }) + .save({ fields: ['aNumber'] }) .then((user) => { expect(user.aNumber).to.equal(0); - }) - ); + })); it('saves a record with no primary key', () => { @Table - class HistoryLog extends Model { - + class HistoryLog extends Model { @Column someText: string; @@ -1592,20 +1338,17 @@ describe('instance', () => { sequelize.addModels([HistoryLog]); - return HistoryLog - .sync() - .then(() => HistoryLog.create({someText: 'Some random text', aNumber: 3, aRandomId: 5})) - .then((log) => log.update({aNumber: 5})) + return HistoryLog.sync() + .then(() => HistoryLog.create({ someText: 'Some random text', aNumber: 3, aRandomId: 5 })) + .then((log) => log.update({ aNumber: 5 })) .then((newLog) => { expect(newLog.aNumber).to.equal(5); }); }); describe('eagerly loaded objects', () => { - @Table - class UserEager extends Model { - + class UserEager extends Model { @Column username: string; @@ -1617,8 +1360,7 @@ describe('instance', () => { } @Table - class ProjectEager extends Model { - + class ProjectEager extends Model { @Column title: string; @@ -1635,15 +1377,16 @@ describe('instance', () => { before(() => sequelize.addModels([UserEager, ProjectEager])); - beforeEach(() => UserEager.sync({force: true}).then(() => ProjectEager.sync({force: true}))); + beforeEach(() => + UserEager.sync({ force: true }).then(() => ProjectEager.sync({ force: true })) + ); it('saves one object that has a collection of eagerly loaded objects', () => - UserEager - .create({username: 'joe', age: 1}) - .then((user) => ProjectEager.create({title: 'project-joe1', overdueDays: 0}) - .then((project1) => ProjectEager.create({title: 'project-joe2', overdueDays: 0}) + UserEager.create({ username: 'joe', age: 1 }).then((user) => + ProjectEager.create({ title: 'project-joe1', overdueDays: 0 }).then((project1) => + ProjectEager.create({ title: 'project-joe2', overdueDays: 0 }) .then((project2) => user.$set('projects', [project1, project2])) - .then(() => UserEager.findOne({where: {age: 1}, include: [ProjectEager]})) + .then(() => UserEager.findOne({ where: { age: 1 }, include: [ProjectEager] })) .then((_user) => { expect(_user.username).to.equal('joe'); expect(_user.age).to.equal(1); @@ -1659,80 +1402,72 @@ describe('instance', () => { expect(_user.projects).to.exist; expect(_user.projects.length).to.equal(2); }) - ) ) - ); + )); it('saves many objects that each a have collection of eagerly loaded objects', () => - - Promise - .props({ - bart: UserEager.create({username: 'bart', age: 20}), - lisa: UserEager.create({username: 'lisa', age: 20}), - detention1: ProjectEager.create({title: 'detention1', overdueDays: 0}), - detention2: ProjectEager.create({title: 'detention2', overdueDays: 0}), - exam1: ProjectEager.create({title: 'exam1', overdueDays: 0}), - exam2: ProjectEager.create({title: 'exam2', overdueDays: 0}) - }) - .then(({bart, lisa, detention1, detention2, exam1, exam2}) => - Promise - .all([ - bart.$set('projects', [detention1, detention2]), - lisa.$set('projects', [exam1, exam2]) - ]) - .then(() => UserEager.findAll({ - where: {age: 20}, + Promise.all([ + // Converting to native es6 promises + UserEager.create({ username: 'bart', age: 20 }), + UserEager.create({ username: 'lisa', age: 20 }), + ProjectEager.create({ title: 'detention1', overdueDays: 0 }), + ProjectEager.create({ title: 'detention2', overdueDays: 0 }), + ProjectEager.create({ title: 'exam1', overdueDays: 0 }), + ProjectEager.create({ title: 'exam2', overdueDays: 0 }), + ]).then(([bart, lisa, detention1, detention2, exam1, exam2]) => + Promise.all([ + bart.$set('projects', [detention1, detention2]), + lisa.$set('projects', [exam1, exam2]), + ]) + .then(() => + UserEager.findAll({ + where: { age: 20 }, order: [['username', 'ASC']], - include: [ProjectEager] - })) - .then((simpsons) => { - let _bart; - let _lisa; - - expect(simpsons.length).to.equal(2); - - _bart = simpsons[0]; - _lisa = simpsons[1]; + include: [ProjectEager], + }) + ) + .then((simpsons) => { + expect(simpsons.length).to.equal(2); - expect(_bart.projects).to.exist; - expect(_lisa.projects).to.exist; - expect(_bart.projects.length).to.equal(2); - expect(_lisa.projects.length).to.equal(2); + const _bart = simpsons[0]; + const _lisa = simpsons[1]; - _bart.age = _bart.age + 1; // happy birthday bart - off to Moe's - _lisa.username = 'lsimpson'; + expect(_bart.projects).to.exist; + expect(_lisa.projects).to.exist; + expect(_bart.projects.length).to.equal(2); + expect(_lisa.projects.length).to.equal(2); - return Promise.all([ - _bart.save(), - _lisa.save() - ]); - }) - .then(([savedBart, savedLisa]) => { + _bart.age = _bart.age + 1; // happy birthday bart - off to Moe's + _lisa.username = 'lsimpson'; - expect(savedBart.username).to.equal('bart'); - expect(savedBart.age).to.equal(21); + return Promise.all([_bart.save(), _lisa.save()]); + }) + .then(([savedBart, savedLisa]) => { + expect(savedBart.username).to.equal('bart'); + expect(savedBart.age).to.equal(21); - expect(savedLisa.username).to.equal('lsimpson'); - expect(savedLisa.age).to.equal(20); - }) - ) - ); + expect(savedLisa.username).to.equal('lsimpson'); + expect(savedLisa.age).to.equal(20); + }) + )); it('saves many objects that each has one eagerly loaded object (to which they belong)', () => - - Promise - .all([ - UserEager.create({username: 'poobah', age: 18}), - ProjectEager.create({title: 'homework', overdueDays: 10}), - ProjectEager.create({title: 'party', overdueDays: 2}) - ]) + Promise.all([ + UserEager.create({ username: 'poobah', age: 18 }), + ProjectEager.create({ title: 'homework', overdueDays: 10 }), + ProjectEager.create({ title: 'party', overdueDays: 2 }), + ]) .then(([user, homework, party]) => user.$set('projects', [homework, party])) - .then(() => ProjectEager.findAll({ - include: [{ - model: UserEager, - as: 'poobah' - }] - })) + .then(() => + ProjectEager.findAll({ + include: [ + { + model: UserEager, + as: 'poobah', + }, + ], + }) + ) .then((projects) => { expect(projects.length).to.equal(2); expect(projects[0].poobah).to.exist; @@ -1745,32 +1480,27 @@ describe('instance', () => { projects[0].overdueDays = 0; projects[1].overdueDays = 0; - return Promise.all([ - projects[0].save(), - projects[1].save() - ]); + return Promise.all([projects[0].save(), projects[1].save()]); }) - .then(() => ProjectEager.findAll({ - where: {title: 'partymore', overdueDays: 0}, - include: [UserEager] - })) + .then(() => + ProjectEager.findAll({ + where: { title: 'partymore', overdueDays: 0 }, + include: [UserEager], + }) + ) .then((savedprojects) => { - expect(savedprojects.length).to.equal(2); expect(savedprojects[0].poobah).to.exist; expect(savedprojects[1].poobah).to.exist; expect(savedprojects[0].poobah).to.have.property('username', 'poobah'); expect(savedprojects[1].poobah).to.have.property('username', 'poobah'); - }) - ); + })); }); }); describe('toJSON', () => { - @Table - class NiceUser extends Model { - + class NiceUser extends Model { @Column username: string; @@ -1785,8 +1515,7 @@ describe('instance', () => { } @Table - class NiceProject extends Model { - + class NiceProject extends Model { @Column title: string; @@ -1800,98 +1529,102 @@ describe('instance', () => { before(() => sequelize.addModels([NiceUser, NiceProject])); - beforeEach(() => NiceUser.sync({force: true}).then(() => NiceProject.sync({force: true}))); + beforeEach(() => NiceUser.sync({ force: true }).then(() => NiceProject.sync({ force: true }))); it("dont return instance that isn't defined", () => - - NiceProject - .create({user: null}) + NiceProject.create({ user: null }) .then((project) => NiceProject.findOne({ where: { - id: project.id + id: project.id, }, - include: [ - {model: NiceUser, as: 'user'} - ] + include: [{ model: NiceUser, as: 'user' }], }) ) .then((project) => { const json = project.toJSON() as NiceProject; expect(json.user).to.be.equal(null); - }) - ); + })); it("dont return instances that aren't defined", () => - - NiceUser - .create({username: 'cuss'}) + NiceUser.create({ username: 'cuss' }) .then((user) => NiceUser.findOne({ where: { - id: user.id + id: user.id, }, - include: [NiceProject] + include: [NiceProject], }) ) .then((user) => { expect(user.projects).to.be.instanceof(Array); expect(user.projects).to.be.length(0); - }) - ); + })); it('returns an object containing all values', () => { - const user = NiceUser.build({username: 'test.user', age: 99, isAdmin: true}); - expect(user.toJSON()).to.deep.equal({username: 'test.user', age: 99, isAdmin: true, id: null}); + const user = NiceUser.build({ username: 'test.user', age: 99, isAdmin: true }); + expect(user.toJSON()).to.deep.equal({ + username: 'test.user', + age: 99, + isAdmin: true, + id: null, + }); }); it('returns an object containing all values (created with new)', () => { - const user = new NiceUser({username: 'test.user', age: 99, isAdmin: true}); - expect(user.toJSON()).to.deep.equal({username: 'test.user', age: 99, isAdmin: true, id: null}); + const user = new NiceUser({ username: 'test.user', age: 99, isAdmin: true }); + expect(user.toJSON()).to.deep.equal({ + username: 'test.user', + age: 99, + isAdmin: true, + id: null, + }); }); it('returns a response that can be stringified', () => { - const user = NiceUser.build({username: 'test.user', age: 99, isAdmin: true}); - expect(JSON.stringify(user)).to.deep.equal('{"id":null,"username":"test.user","age":99,"isAdmin":true}'); + const user = NiceUser.build({ username: 'test.user', age: 99, isAdmin: true }); + expect(JSON.stringify(user)).to.deep.equal( + '{"id":null,"username":"test.user","age":99,"isAdmin":true}' + ); }); it('returns a response that can be stringified (created with new)', () => { - const user = new NiceUser({username: 'test.user', age: 99, isAdmin: true}); - expect(JSON.stringify(user)).to.deep.equal('{"id":null,"username":"test.user","age":99,"isAdmin":true}'); + const user = new NiceUser({ username: 'test.user', age: 99, isAdmin: true }); + expect(JSON.stringify(user)).to.deep.equal( + '{"id":null,"username":"test.user","age":99,"isAdmin":true}' + ); }); it('returns a response that can be stringified and then parsed', () => { - const user = NiceUser.build({username: 'test.user', age: 99, isAdmin: true}); + const user = NiceUser.build({ username: 'test.user', age: 99, isAdmin: true }); expect(JSON.parse(JSON.stringify(user))).to.deep.equal({ username: 'test.user', age: 99, isAdmin: true, - id: null + id: null, }); }); it('returns a response that can be stringified and then parsed (created with new)', () => { - const user = new NiceUser({username: 'test.user', age: 99, isAdmin: true}); + const user = new NiceUser({ username: 'test.user', age: 99, isAdmin: true }); expect(JSON.parse(JSON.stringify(user))).to.deep.equal({ username: 'test.user', age: 99, isAdmin: true, - id: null + id: null, }); }); it('includes the eagerly loaded associations', () => - - Promise - .all([ - NiceUser.create({username: 'fnord', age: 1, isAdmin: true}), - NiceProject.create({title: 'fnord'}) - ]) + Promise.all([ + NiceUser.create({ username: 'fnord', age: 1, isAdmin: true }), + NiceProject.create({ title: 'fnord' }), + ]) .then(([user, project]) => user.$set('projects', [project])) .then(() => Promise.all([ - NiceUser.findAll({include: [NiceProject]}), - NiceProject.findAll({include: [NiceUser]}) + NiceUser.findAll({ include: [NiceProject] }), + NiceProject.findAll({ include: [NiceUser] }), ]) ) .then(([users, projects]) => { @@ -1903,15 +1636,12 @@ describe('instance', () => { expect(project.user).to.exist; expect(JSON.parse(JSON.stringify(project)).user).to.exist; - }) - ); + })); }); describe('findAll', () => { - - @Table({timestamps: true, paranoid: true}) - class ParanoidUser extends Model { - + @Table({ timestamps: true, paranoid: true }) + class ParanoidUser extends Model { @Column username: string; @@ -1925,11 +1655,10 @@ describe('instance', () => { before(() => sequelize.addModels([ParanoidUser])); - beforeEach(() => ParanoidUser.sync({force: true})); + beforeEach(() => ParanoidUser.sync({ force: true })); it('sql should have paranoid condition', () => - - ParanoidUser.create({username: 'cuss'}) + ParanoidUser.create({ username: 'cuss' }) .then(() => ParanoidUser.findAll()) .then((users) => { expect(users).to.have.length(1); @@ -1938,15 +1667,13 @@ describe('instance', () => { .then(() => ParanoidUser.findAll()) .then((users) => { expect(users).to.have.length(0); - }) - ); + })); it('sequelize.and as where should include paranoid condition', () => - - ParanoidUser.create({username: 'cuss'}) + ParanoidUser.create({ username: 'cuss' }) .then(() => ParanoidUser.findAll({ - where: Sequelize.and({username: 'cuss'}) + where: Sequelize.and({ username: 'cuss' }), }) ) .then((users) => { @@ -1955,20 +1682,18 @@ describe('instance', () => { }) .then(() => ParanoidUser.findAll({ - where: Sequelize.and({username: 'cuss'}) + where: Sequelize.and({ username: 'cuss' }), }) ) .then((users) => { expect(users).to.have.length(0); - }) - ); + })); it('sequelize.or as where should include paranoid condition', () => - - ParanoidUser.create({username: 'cuss'}) + ParanoidUser.create({ username: 'cuss' }) .then(() => ParanoidUser.findAll({ - where: Sequelize.or({username: 'cuss'}) + where: Sequelize.or({ username: 'cuss' }), }) ) .then((users) => { @@ -1977,69 +1702,54 @@ describe('instance', () => { }) .then(() => ParanoidUser.findAll({ - where: Sequelize.or({username: 'cuss'}) + where: Sequelize.or({ username: 'cuss' }), }) ) .then((users) => { expect(users).to.have.length(0); - }) - ); + })); it('escapes a single single quotes properly in where clauses', () => - - User - .create({username: "user'name"}) - .then(() => User.findAll({where: {username: "user'name"}})) + User.create({ username: "user'name" }) + .then(() => User.findAll({ where: { username: "user'name" } })) .then((users) => { expect(users.length).to.equal(1); expect(users[0].username).to.equal("user'name"); - }) - ); + })); it('escapes two single quotes properly in where clauses', () => - - User - .create({username: "user''name"}) - .then(() => User.findAll({where: {username: "user''name"}})) + User.create({ username: "user''name" }) + .then(() => User.findAll({ where: { username: "user''name" } })) .then((users) => { expect(users.length).to.equal(1); expect(users[0].username).to.equal("user''name"); - }) - ); + })); it('returns the timestamps if no attributes have been specified', () => - - TimeStampsUser.create({username: 'fnord'}) + TimeStampsUser.create({ username: 'fnord' }) .then(() => TimeStampsUser.findAll()) .then((users) => { expect(users[0].createdAt).to.exist; - }) - ); + })); it('does not return the timestamps if the username attribute has been specified', () => - - User.create({username: 'fnord'}) - .then(() => User.findAll({attributes: ['username']})) + User.create({ username: 'fnord' }) + .then(() => User.findAll({ attributes: ['username'] })) .then((users) => { expect(users[0].createdAt).not.to.exist; expect(users[0].username).to.exist; - }) - ); + })); it('creates the deletedAt property, when defining paranoid as true', () => - - ParanoidUser.create({username: 'fnord'}) + ParanoidUser.create({ username: 'fnord' }) .then(() => ParanoidUser.findAll()) .then((users) => { expect(users[0].deletedAt).to.be.null; - }) - ); + })); it('destroys a record with a primary key of something other than id', () => { - @Table - class UserDestroy extends Model { - + class UserDestroy extends Model { @PrimaryKey @Column newId: string; @@ -2051,8 +1761,8 @@ describe('instance', () => { sequelize.addModels([UserDestroy]); return UserDestroy.sync().then(() => { - return UserDestroy.create({newId: '123ABC', email: 'hello'}).then(() => { - return UserDestroy.findOne({where: {email: 'hello'}}).then((user) => { + return UserDestroy.create({ newId: '123ABC', email: 'hello' }).then(() => { + return UserDestroy.findOne({ where: { email: 'hello' } }).then((user) => { return user.destroy(); }); }); @@ -2060,78 +1770,65 @@ describe('instance', () => { }); it('sets deletedAt property to a specific date when deleting an instance', () => - - ParanoidUser.create({username: 'fnord'}).then(() => { + ParanoidUser.create({ username: 'fnord' }).then(() => { return ParanoidUser.findAll().then((users) => { return users[0].destroy().then(() => { expect(users[0].deletedAt.getMonth).to.exist; - return users[0].reload({paranoid: false}).then((user) => { + return users[0].reload({ paranoid: false }).then((user) => { expect(user.deletedAt.getMonth).to.exist; }); }); }); - }) - ); + })); it('keeps the deletedAt-attribute with value null, when running update', () => - - ParanoidUser.create({username: 'fnord'}).then(() => { + ParanoidUser.create({ username: 'fnord' }).then(() => { return ParanoidUser.findAll().then((users) => { - return users[0].update({username: 'newFnord'}).then((user) => { + return users[0].update({ username: 'newFnord' }).then((user) => { expect(user.deletedAt).not.to.exist; }); }); - }) - ); + })); it('keeps the deletedAt-attribute with value null, when updating associations', () => - - ParanoidUser.create({username: 'fnord'}).then(() => { + ParanoidUser.create({ username: 'fnord' }).then(() => { return ParanoidUser.findAll().then((users) => { - return ParanoidUser.create({username: 'linkedFnord'}).then((linkedUser) => { + return ParanoidUser.create({ username: 'linkedFnord' }).then((linkedUser) => { return users[0].$set('paranoidUser', linkedUser).then((user: ParanoidUser) => { expect(user.deletedAt).not.to.exist; }); }); }); - }) - ); + })); it('can reuse query option objects', () => - - User.create({username: 'fnord'}).then(() => { - const query = {where: {username: 'fnord'}}; + User.create({ username: 'fnord' }).then(() => { + const query = { where: { username: 'fnord' } }; return User.findAll(query).then((users) => { expect(users[0].username).to.equal('fnord'); return User.findAll(query).then((_users) => { expect(_users[0].username).to.equal('fnord'); }); }); - }) - ); + })); }); describe('find', () => { - it('can reuse query option objects', () => - - User.create({username: 'fnord'}).then(() => { - const query = {where: {username: 'fnord'}}; + User.create({ username: 'fnord' }).then(() => { + const query = { where: { username: 'fnord' } }; return User.findOne(query).then((user) => { expect(user.username).to.equal('fnord'); return User.findOne(query).then((_user) => { expect(_user.username).to.equal('fnord'); }); }); - }) - ); + })); it('returns null for null, undefined, and unset boolean values', () => { - - @Table({logging: true} as TableOptions) - class Setting extends Model { - + @Table({ logging: true } as TableOptions) + class Setting extends Model { @Column settingKey: string; @@ -2150,45 +1847,40 @@ describe('instance', () => { sequelize.addModels([Setting]); - return Setting.sync({force: true}).then(() => { - return Setting.create({settingKey: 'test', boolValue: null, boolValue2: undefined}).then(() => { - return Setting.findOne({where: {settingKey: 'test'}}).then((setting) => { - expect(setting.boolValue).to.equal(null); - expect(setting.boolValue2).to.equal(null); - expect(setting.boolValue3).to.equal(null); - }); - }); + return Setting.sync({ force: true }).then(() => { + return Setting.create({ settingKey: 'test', boolValue: null, boolValue2: undefined }).then( + () => { + return Setting.findOne({ where: { settingKey: 'test' } }).then((setting) => { + expect(setting.boolValue).to.equal(null); + expect(setting.boolValue2).to.equal(null); + expect(setting.boolValue3).to.equal(null); + }); + } + ); }); }); }); describe('equals', () => { - it('can compare records with Date field', () => - - User.create({username: 'fnord'}).then((user1) => - User.findOne({where: {username: 'fnord'}}).then((user2) => { + User.create({ username: 'fnord' }).then((user1) => + User.findOne({ where: { username: 'fnord' } }).then((user2) => { expect(user1.equals(user2)).to.be.true; }) - ) - ); + )); it('does not compare the existence of associations', () => { - @Table - class UserAssociationEqual extends Model { - + class UserAssociationEqual extends Model { @Column username: string; @HasMany(() => ProjectAssociationEqual) projects: ProjectAssociationEqual[]; - } @Table - class ProjectAssociationEqual extends Model { - + class ProjectAssociationEqual extends Model { @Column title: string; @@ -2205,42 +1897,42 @@ describe('instance', () => { sequelize.addModels([UserAssociationEqual, ProjectAssociationEqual]); - return UserAssociationEqual.sync({force: true}) - .then(() => ProjectAssociationEqual.sync({force: true})) - .then(() => Promise.all([ - UserAssociationEqual.create({username: 'jimhalpert'}), - ProjectAssociationEqual.create({title: 'A Cool Project'}) - ])) - .then(([user1, project1]) => user1.$set('projects', [project1]) - .then(() => - Promise.all([ - UserAssociationEqual.findOne({ - where: {username: 'jimhalpert'}, - include: [ProjectAssociationEqual] - }), - UserAssociationEqual.create({username: 'pambeesly'}) - ]) - ) - .then(([user2, user3]) => { - - expect(user1.get('projects')).to.not.exist; - expect(user2.get('projects')).to.exist; - expect(user1.equals(user2)).to.be.true; - // expect(user2.equals(user1)).to.be.true; TODO@robin does not work with classic define either - so whats wrong? - expect(user1.equals(user3)).to.not.be.true; - expect(user3.equals(user1)).to.not.be.true; - }) + return UserAssociationEqual.sync({ force: true }) + .then(() => ProjectAssociationEqual.sync({ force: true })) + .then(() => + Promise.all([ + UserAssociationEqual.create({ username: 'jimhalpert' }), + ProjectAssociationEqual.create({ title: 'A Cool Project' }), + ]) + ) + .then(([user1, project1]) => + user1 + .$set('projects', [project1]) + .then(() => + Promise.all([ + UserAssociationEqual.findOne({ + where: { username: 'jimhalpert' }, + include: [ProjectAssociationEqual], + }), + UserAssociationEqual.create({ username: 'pambeesly' }), + ]) + ) + .then(([user2, user3]) => { + expect(user1.get('projects')).to.not.exist; + expect(user2.get('projects')).to.exist; + expect(user1.equals(user2)).to.be.true; + // expect(user2.equals(user1)).to.be.true; TODO@robin does not work with classic define either - so whats wrong? + expect(user1.equals(user3)).to.not.be.true; + expect(user3.equals(user1)).to.not.be.true; + }) ); }); }); describe('values', () => { - it('returns all values', () => { - - @Table({logging: false} as TableOptions) - class UserHelper extends Model { - + @Table({ logging: false } as TableOptions) + class UserHelper extends Model { @Column username: string; @@ -2251,8 +1943,8 @@ describe('instance', () => { sequelize.addModels([UserHelper]); return UserHelper.sync().then(() => { - const user = UserHelper.build({username: 'foo'}); - expect(user.get({plain: true})).to.deep.equal({username: 'foo', id: null}); + const user = UserHelper.build({ username: 'foo' }); + expect(user.get({ plain: true })).to.deep.equal({ username: 'foo', id: null }); }); }); }); @@ -2284,10 +1976,8 @@ describe('instance', () => { // } it('does not set the deletedAt date in subsequent destroys if dao is paranoid', () => { - - @Table({timestamps: true, paranoid: true}) - class UserDestroy extends Model { - + @Table({ timestamps: true, paranoid: true }) + class UserDestroy extends Model { @Column name: string; @@ -2297,14 +1987,14 @@ describe('instance', () => { sequelize.addModels([UserDestroy]); - return UserDestroy.sync({force: true}).then(() => { - return UserDestroy.create({name: 'hallo', bio: 'welt'}).then((user) => { + return UserDestroy.sync({ force: true }).then(() => { + return UserDestroy.create({ name: 'hallo', bio: 'welt' }).then((user) => { return user.destroy().then(() => { - return user.reload({paranoid: false}).then(() => { + return user.reload({ paranoid: false }).then(() => { const deletedAt = user.deletedAt; return user.destroy().then(() => { - return user.reload({paranoid: false}).then(() => { + return user.reload({ paranoid: false }).then(() => { expect(user.deletedAt).to.eql(deletedAt); }); }); @@ -2316,8 +2006,7 @@ describe('instance', () => { it('deletes a record from the database if dao is not paranoid', () => { @Table - class UserDestroy extends Model { - + class UserDestroy extends Model { @Column name: string; @@ -2327,8 +2016,8 @@ describe('instance', () => { sequelize.addModels([UserDestroy]); - return UserDestroy.sync({force: true}).then(() => { - return UserDestroy.create({name: 'hallo', bio: 'welt'}).then((u) => { + return UserDestroy.sync({ force: true }).then(() => { + return UserDestroy.create({ name: 'hallo', bio: 'welt' }).then((u) => { return UserDestroy.findAll().then((users) => { expect(users.length).to.equal(1); return u.destroy().then(() => { @@ -2342,9 +2031,8 @@ describe('instance', () => { }); it('allows sql logging of delete statements', () => { - @Table({paranoid: true}) - class UserDelete extends Model { - + @Table({ paranoid: true }) + class UserDelete extends Model { @Column name: string; @@ -2354,15 +2042,15 @@ describe('instance', () => { sequelize.addModels([UserDelete]); - return UserDelete.sync({force: true}).then(() => { - return UserDelete.create({name: 'hallo', bio: 'welt'}).then((u) => { + return UserDelete.sync({ force: true }).then(() => { + return UserDelete.create({ name: 'hallo', bio: 'welt' }).then((u) => { return UserDelete.findAll().then((users) => { expect(users.length).to.equal(1); return u.destroy({ logging(sql: string): void { expect(sql).to.exist; expect(sql.toUpperCase().indexOf('DELETE')).to.be.above(-1); - } + }, }); }); }); @@ -2371,8 +2059,7 @@ describe('instance', () => { it('delete a record of multiple primary keys table', () => { @Table - class MultiPrimary extends Model { - + class MultiPrimary extends Model { @PrimaryKey @Column(DataType.CHAR(2)) bilibili: string; @@ -2384,25 +2071,27 @@ describe('instance', () => { sequelize.addModels([MultiPrimary]); - return MultiPrimary.sync({force: true}).then(() => { - return MultiPrimary.create({bilibili: 'bl', guruguru: 'gu'}).then(() => { - return MultiPrimary.create({bilibili: 'bl', guruguru: 'ru'}).then((m2) => { + return MultiPrimary.sync({ force: true }).then(() => { + return MultiPrimary.create({ bilibili: 'bl', guruguru: 'gu' }).then(() => { + return MultiPrimary.create({ bilibili: 'bl', guruguru: 'ru' }).then((m2) => { return MultiPrimary.findAll().then((ms) => { expect(ms.length).to.equal(2); - return m2.destroy({ - logging: (sql) => { - expect(sql).to.exist; - expect(sql.toUpperCase().indexOf('DELETE')).to.be.above(-1); - expect(sql.indexOf('ru')).to.be.above(-1); - expect(sql.indexOf('bl')).to.be.above(-1); - } - }).then(() => { - return MultiPrimary.findAll().then((ms3) => { - expect(ms3.length).to.equal(1); - expect(ms3[0].bilibili).to.equal('bl'); - expect(ms3[0].guruguru).to.equal('gu'); + return m2 + .destroy({ + logging: (sql) => { + expect(sql).to.exist; + expect(sql.toUpperCase().indexOf('DELETE')).to.be.above(-1); + expect(sql.indexOf('ru')).to.be.above(-1); + expect(sql.indexOf('bl')).to.be.above(-1); + }, + }) + .then(() => { + return MultiPrimary.findAll().then((ms3) => { + expect(ms3.length).to.equal(1); + expect(ms3[0].bilibili).to.equal('bl'); + expect(ms3[0].guruguru).to.equal('gu'); + }); }); - }); }); }); }); @@ -2411,19 +2100,14 @@ describe('instance', () => { }); describe('restore', () => { - it('returns an error if the model is not paranoid', () => - - User.create({username: 'Peter'}).then((user) => - expect(() => user.restore()).to.throw(Error, 'Model is not paranoid') - ) - ); + User.create({ username: 'Peter' }) + .then((user) => user.restore()) + .catch((error) => expect(error.message).to.equal('Model is not paranoid'))); // Native Promises it('restores a previously deleted model', () => { - - @Table({timestamps: true, paranoid: true}) - class ParanoidUser2 extends Model { - + @Table({ timestamps: true, paranoid: true }) + class ParanoidUser2 extends Model { @Column username: string; @@ -2440,26 +2124,31 @@ describe('instance', () => { sequelize.addModels([ParanoidUser2]); - const data = [{username: 'Peter', secretValue: '42'}, - {username: 'Paul', secretValue: '43'}, - {username: 'Bob', secretValue: '44'}]; + const data = [ + { username: 'Peter', secretValue: '42' }, + { username: 'Paul', secretValue: '43' }, + { username: 'Bob', secretValue: '44' }, + ]; - return ParanoidUser2.sync({force: true}).then(() => { - return ParanoidUser2.bulkCreate(data); - }).then(() => { - return ParanoidUser2.findOne({where: {secretValue: '42'}}); - }).then((user) => { - return user.destroy().then(() => { - return user.restore(); + return ParanoidUser2.sync({ force: true }) + .then(() => { + return ParanoidUser2.bulkCreate(data); + }) + .then(() => { + return ParanoidUser2.findOne({ where: { secretValue: '42' } }); + }) + .then((user) => { + return user.destroy().then(() => { + return user.restore(); + }); + }) + .then(() => { + return ParanoidUser2.findOne({ where: { secretValue: '42' } }); + }) + .then((user) => { + expect(user).to.be.ok; + expect(user.username).to.equal('Peter'); }); - }).then(() => { - return ParanoidUser2.findOne({where: {secretValue: '42'}}); - }).then((user) => { - expect(user).to.be.ok; - expect(user.username).to.equal('Peter'); - }); }); }); - -}) -; +}); diff --git a/test/specs/model-methods.spec.ts b/test/specs/model-methods.spec.ts index e1f55376..55ea26fe 100644 --- a/test/specs/model-methods.spec.ts +++ b/test/specs/model-methods.spec.ts @@ -1,15 +1,12 @@ -import {expect} from 'chai'; -import * as Promise from 'bluebird'; -import {Model, Table, Column} from "../../src"; -import {createSequelize} from "../utils/sequelize"; +import { expect } from 'chai'; +import { Model, Table, Column } from '../../src'; +import { createSequelize } from '../utils/sequelize'; describe('model-methods', () => { - let sequelize; @Table - class User extends Model { - + class User extends Model { @Column firstName: string; @@ -17,26 +14,22 @@ describe('model-methods', () => { lastName: string; static createDemoUser(): User { - - return new User({firstName: 'Peter', lastName: 'Parker'}); + return new User({ firstName: 'Peter', lastName: 'Parker' }); } static findDemoUser(): Promise { - - return this.findOne({where: {firstName: 'Peter', lastName: 'Parker'}}); + return this.findOne({ where: { firstName: 'Peter', lastName: 'Parker' } }); } } - before(() => { sequelize = createSequelize(); sequelize.addModels([User]); }); - beforeEach(() => sequelize.sync({force: true})); + beforeEach(() => sequelize.sync({ force: true })); it('should work as expected', () => { - const user = User.createDemoUser(); expect(user).to.be.an.instanceOf(User); @@ -44,8 +37,6 @@ describe('model-methods', () => { return user .save() .then(() => User.findDemoUser()) - .then(_user => expect(_user.equals(user)).to.be.true) - ; + .then((_user) => expect(_user.equals(user)).to.be.true); }); - }); diff --git a/test/specs/model.spec.ts b/test/specs/model.spec.ts index 32f3fa1b..b517bd7e 100644 --- a/test/specs/model.spec.ts +++ b/test/specs/model.spec.ts @@ -1,22 +1,29 @@ -/* tslint:disable:max-classes-per-file */ - -import {expect, use} from 'chai'; -import {useFakeTimers, stub, spy} from 'sinon'; +import { expect, use } from 'chai'; +import { useFakeTimers, stub, spy } from 'sinon'; import * as sinonChai from 'sinon-chai'; import * as _ from 'lodash'; import * as moment from 'moment'; -import * as Promise from 'bluebird'; -import {Op, UniqueConstraintError} from 'sequelize'; +import { Op } from 'sequelize'; import * as chaiAsPromised from 'chai-as-promised'; -import {createSequelize} from "../utils/sequelize"; +import { createSequelize } from '../utils/sequelize'; import { - Model, Table, Column, PrimaryKey, - ForeignKey, HasMany, BelongsTo, DataType, Default, - AutoIncrement, CreatedAt, DeletedAt, UpdatedAt, - BelongsToMany -} from "../../src"; + Model, + Table, + Column, + PrimaryKey, + ForeignKey, + HasMany, + BelongsTo, + DataType, + Default, + AutoIncrement, + CreatedAt, + DeletedAt, + UpdatedAt, + BelongsToMany, +} from '../../src'; import chaiDatetime = require('chai-datetime'); -import {TableOptions} from "../../src/model/table/table-options"; +import { TableOptions } from '../../src/model/table/table-options'; use(sinonChai); use(chaiAsPromised); @@ -25,12 +32,10 @@ use(chaiDatetime); let clock; describe('model', () => { - let sequelize; @Table - class MainUser extends Model { - + class MainUser extends Model { @Column username: string; @@ -61,40 +66,35 @@ describe('model', () => { beforeEach(() => { sequelize = createSequelize(); sequelize.addModels([MainUser]); - return MainUser.sync({force: true}); + return MainUser.sync({ force: true }); }); describe('instantiation when not initialized', () => { - it('should throw an error', () => { @Table - class Test extends Model { - } + class Test extends Model {} expect(() => new Test()).to.throw(/^Model not initialized/); }); - }); describe('static functions when not initialized', () => { - it('should throw an error', () => { @Table - class Test extends Model { - } + class Test extends Model {} - expect(() => Test.beforeCreate(() => { - })).to.throw(/^Model not initialized/); + expect(() => + Test.beforeCreate(() => { + // beforeCreate + }) + ).to.throw(/^Model not initialized/); }); - }); describe('constructor', () => { it('uses the passed dao name as tablename if freezeTableName', () => { - - @Table({freezeTableName: true, tableName: 'FrozenUser'}) - class User extends Model { - } + @Table({ freezeTableName: true, tableName: 'FrozenUser' }) + class User extends Model {} sequelize.addModels([User]); @@ -102,9 +102,8 @@ describe('model', () => { }); it('uses the pluralized dao name as tablename unless freezeTableName', () => { - @Table({freezeTableName: false, tableName: 'SuperUser'}) - class User extends Model { - } + @Table({ freezeTableName: false, tableName: 'SuperUser' }) + class User extends Model {} sequelize.addModels([User]); @@ -112,11 +111,9 @@ describe('model', () => { }); it('uses checks to make sure dao factory isnt leaking on multiple define', () => { - (() => { - @Table({freezeTableName: false, tableName: 'SuperUser'}) - class User extends Model { - } + @Table({ freezeTableName: false, tableName: 'SuperUser' }) + class User extends Model {} sequelize.addModels([User]); })(); @@ -124,9 +121,8 @@ describe('model', () => { const factorySize = sequelize['modelManager'].all.length; (() => { - @Table({freezeTableName: false, tableName: 'SuperUser'}) - class User extends Model { - } + @Table({ freezeTableName: false, tableName: 'SuperUser' }) + class User extends Model {} sequelize.addModels([User]); })(); @@ -137,7 +133,7 @@ describe('model', () => { it('allows us us to predefine the ID column with our own specs', () => { @Table - class User extends Model { + class User extends Model { @PrimaryKey @Default('User') @Column @@ -146,15 +142,18 @@ describe('model', () => { sequelize.addModels([User]); - return User.sync({force: true}).then(() => { - return expect(User.create({id: 'My own ID!'})).to.eventually.have.property('id', 'My own ID!'); + return User.sync({ force: true }).then(() => { + return expect(User.create({ id: 'My own ID!' })).to.eventually.have.property( + 'id', + 'My own ID!' + ); }); }); it('throws an error if 2 autoIncrements are passed', () => { expect(() => { @Table - class User extends Model { + class User extends Model { @PrimaryKey @AutoIncrement @Column @@ -174,7 +173,7 @@ describe('model', () => { // it('throws an error if a custom model-wide validation is not a function', () => { // expect(() => { // @Table - // class User extends Model { + // class User extends Model { // @Column({ // validate: { // notFunction: 33 @@ -189,7 +188,7 @@ describe('model', () => { // it('throws an error if a custom model-wide validation has the same name as a field', () => { // expect(() => { // @Table - // class User extends Model { + // class User extends Model { // @Column({ // validate: { // field: () => null @@ -204,8 +203,8 @@ describe('model', () => { it('should allow me to set a default value for createdAt and updatedAt', () => { clock.restore(); - @Table({timestamps: true}) - class User extends Model { + @Table({ timestamps: true }) + class User extends Model { @Column aNumber: number; @@ -220,14 +219,11 @@ describe('model', () => { sequelize.addModels([User]); - return User.sync({force: true}).then(() => { - return User.create({aNumber: 5}).then((user) => { + return User.sync({ force: true }).then(() => { + return User.create({ aNumber: 5 }).then((user) => { clock.restore(); - return User.bulkCreate([ - {aNumber: 10}, - {aNumber: 12} - ]).then(() => { - return User.findAll({where: {aNumber: {[Op.gte]: 10}}}).then((users) => { + return User.bulkCreate([{ aNumber: 10 }, { aNumber: 12 }]).then(() => { + return User.findAll({ where: { aNumber: { [Op.gte]: 10 } } }).then((users) => { expect(moment(user.createdAt).format('YYYY-MM-DD')).to.equal('2012-01-01'); expect(moment(user.updatedAt).format('YYYY-MM-DD')).to.equal('2012-01-02'); users.forEach((u) => { @@ -243,8 +239,8 @@ describe('model', () => { it('should allow me to set a function as default value', () => { const defaultFunction = stub().returns(5); - @Table({timestamps: true}) - class User extends Model { + @Table({ timestamps: true }) + class User extends Model { @Default(defaultFunction) @Column aNumber: number; @@ -252,7 +248,7 @@ describe('model', () => { sequelize.addModels([User]); - return User.sync({force: true}).then(() => { + return User.sync({ force: true }).then(() => { return User.create().then((user) => { return User.create().then((user2) => { expect(user.aNumber).to.equal(5); @@ -265,7 +261,7 @@ describe('model', () => { it('should allow me to override updatedAt, createdAt, and deletedAt fields', () => { @Table - class User extends Model { + class User extends Model { @Column aNumber: number; @@ -281,12 +277,12 @@ describe('model', () => { sequelize.addModels([User]); - return User.sync({force: true}).then(() => { - return User.create({aNumber: 4}).then((user) => { + return User.sync({ force: true }).then(() => { + return User.create({ aNumber: 4 }).then((user) => { expect(user.updatedOn).to.exist; expect(user.dateCreated).to.exist; return user.destroy().then(() => { - return user.reload({paranoid: false}).then(() => { + return user.reload({ paranoid: false }).then(() => { expect(user.deletedAtThisTime).to.exist; }); }); @@ -295,8 +291,8 @@ describe('model', () => { }); it('should allow me to disable some of the timestamp fields', () => { - @Table({updatedAt: false, createdAt: false}) - class User extends Model { + @Table({ updatedAt: false, createdAt: false }) + class User extends Model { @Column name: string; @@ -306,9 +302,9 @@ describe('model', () => { sequelize.addModels([User]); - return User.sync({force: true}).then(() => { + return User.sync({ force: true }).then(() => { return User.create({ - name: 'heyo' + name: 'heyo', }).then((user) => { expect(user.createdAt).not.to.exist; expect(user['false']).not.to.exist; // because, you know we might accidentally add a field named 'false' @@ -317,7 +313,7 @@ describe('model', () => { return user.save().then((_user) => { expect(_user.updatedAt).not.to.exist; return _user.destroy().then(() => { - return _user.reload({paranoid: false}).then(() => { + return _user.reload({ paranoid: false }).then(() => { expect(_user.deletedAtThisTime).to.exist; }); }); @@ -329,13 +325,13 @@ describe('model', () => { it('returns proper defaultValues after save when setter is set', () => { const titleSetter = spy(); - @Table({updatedAt: false, createdAt: false}) - class Task extends Model { + @Table({ updatedAt: false, createdAt: false }) + class Task extends Model { @Column({ type: DataType.STRING(50), allowNull: false, defaultValue: '', - set: titleSetter + set: titleSetter, }) title: string; @@ -345,26 +341,28 @@ describe('model', () => { sequelize.addModels([Task]); - return Task.sync({force: true}).then(() => { - return Task.build().save().then((record) => { - expect(record.title).to.be.a('string'); - expect(record.title).to.equal(''); - expect(titleSetter.notCalled).to.be.ok; // The setter method should not be invoked for default values - }); + return Task.sync({ force: true }).then(() => { + return Task.build() + .save() + .then((record) => { + expect(record.title).to.be.a('string'); + expect(record.title).to.equal(''); + expect(titleSetter.notCalled).to.be.ok; // The setter method should not be invoked for default values + }); }); }); it('should work with both paranoid and underscored being true', () => { - @Table({paranoid: true, underscored: true}) - class User extends Model { + @Table({ paranoid: true, underscored: true }) + class User extends Model { @Column aNumber: number; } sequelize.addModels([User]); - return User.sync({force: true}).then(() => { - return User.create({aNumber: 30}).then(() => { + return User.sync({ force: true }).then(() => { + return User.create({ aNumber: 30 }).then(() => { return User.count().then((c) => { expect(c).to.equal(1); }); @@ -374,25 +372,24 @@ describe('model', () => { it('allows multiple column unique keys to be defined', () => { @Table - class User extends Model { - + class User extends Model { @Column({ - unique: 'user_and_email' + unique: 'user_and_email', }) username: string; @Column({ - unique: 'user_and_email' + unique: 'user_and_email', }) email: string; @Column({ - unique: 'a_and_b' + unique: 'a_and_b', }) aCol: string; @Column({ - unique: 'a_and_b' + unique: 'a_and_b', }) bCol: string; } @@ -400,62 +397,72 @@ describe('model', () => { sequelize.addModels([User]); return User.sync({ - force: true, logging: _.after(2, _.once((sql) => { - expect(sql).to.match(/UNIQUE\s*([`"]?user_and_email[`"]?)?\s*\([`"]?username[`"]?, [`"]?email[`"]?\)/); - expect(sql).to.match(/UNIQUE\s*([`"]?a_and_b[`"]?)?\s*\([`"]?aCol[`"]?, [`"]?bCol[`"]?\)/); - })) + force: true, + logging: _.after( + 2, + _.once((sql) => { + expect(sql).to.match( + /UNIQUE\s*([`"]?user_and_email[`"]?)?\s*\([`"]?username[`"]?, [`"]?email[`"]?\)/ + ); + expect(sql).to.match( + /UNIQUE\s*([`"]?a_and_b[`"]?)?\s*\([`"]?aCol[`"]?, [`"]?bCol[`"]?\)/ + ); + }) + ), }); }); it('allows unique on column with field aliases', () => { @Table - class User extends Model { - + class User extends Model { @Column({ field: 'user_name', - unique: 'user_name_unique' + unique: 'user_name_unique', }) username: string; } sequelize.addModels([User]); - return User.sync({force: true}).then(() => { + return User.sync({ force: true }).then(() => { return sequelize['queryInterface'].showIndex(User['tableName']).then((indexes) => { expect(indexes).to.have.length(1); const idxUnique = indexes[0]; expect(idxUnique.primary).to.equal(false); expect(idxUnique.unique).to.equal(true); - expect(idxUnique.fields).to.deep.equal([{attribute: 'user_name', length: undefined, order: undefined}]); + expect(idxUnique.fields).to.deep.equal([ + { attribute: 'user_name', length: undefined, order: undefined }, + ]); }); }); }); it('allows us to customize the error message for unique constraint', () => { - @Table - class User extends Model { - + class User extends Model { @Column({ - unique: {name: 'user_and_email', msg: 'User and email must be unique'} + unique: { name: 'user_and_email', msg: 'User and email must be unique' }, }) username: string; @Column({ - unique: 'user_and_email' + unique: 'user_and_email', }) email: string; } sequelize.addModels([User]); - return User.sync({force: true}).then(() => { - return Promise.all([ - User.create({username: 'tobi', email: 'tobi@tobi.me'}), - User.create({username: 'tobi', email: 'tobi@tobi.me'})]); - }).catch(UniqueConstraintError, (err) => { - expect(err.message).to.equal('User and email must be unique'); - }); + return User.sync({ force: true }) + .then(() => { + return Promise.all([ + User.create({ username: 'tobi', email: 'tobi@tobi.me' }), + User.create({ username: 'tobi', email: 'tobi@tobi.me' }), + ]); + }) + .catch((err) => { + expect(err.message).to.equal('User and email must be unique'); + }); // Native Catch expect one parameter only }); // If you use migrations to create unique indexes that have explicit names and/or contain fields @@ -468,17 +475,19 @@ describe('model', () => { { name: 'user_and_email_index', unique: true, - fields: ['userId', { - name: 'email', - collate: 'RTRIM', - order: 'DESC', - length: 5, - }] - } - ] + fields: [ + 'userId', + { + name: 'email', + collate: 'RTRIM', + order: 'DESC', + length: 5, + }, + ], + }, + ], }) - class User extends Model { - + class User extends Model { @Column userId: number; @@ -488,56 +497,64 @@ describe('model', () => { sequelize.addModels([User]); - return User.sync({force: true}).then(() => { - // Redefine the model to use the index in database and override error message - @Table({timestamps: true}) - class User extends Model { - - @Column({ - unique: {name: 'user_and_email_index', msg: 'User and email must be unique'} - }) - userId: number; - - @Column({ - unique: 'user_and_email_index' - }) - email: string; - } + return User.sync({ force: true }) + .then(() => { + // Redefine the model to use the index in database and override error message + @Table({ timestamps: true }) + class User extends Model { + @Column({ + unique: { name: 'user_and_email_index', msg: 'User and email must be unique' }, + }) + userId: number; + + @Column({ + unique: 'user_and_email_index', + }) + email: string; + } - sequelize.addModels([User]); + sequelize.addModels([User]); - return Promise.all([ - User.create({userId: 1, email: 'tobi@tobi.me'}), - User.create({userId: 1, email: 'tobi@tobi.me'})]); - }).catch(UniqueConstraintError, (err) => { - expect(err.message).to.equal('User and email must be unique'); - }); + return Promise.all([ + User.create({ userId: 1, email: 'tobi@tobi.me' }), + User.create({ userId: 1, email: 'tobi@tobi.me' }), + ]); + }) + .catch((err) => { + expect(err.message).to.equal('User and email must be unique'); + }); // Native Catch expect one parameter only }); it('should allow the user to specify indexes in options', () => { - @Table({ - indexes: [{ - name: 'a_b_uniq', - unique: true, - method: 'BTREE', - fields: ['fieldB', { - attribute: 'fieldA', - collate: 'RTRIM', - order: 'DESC', - length: 5 - }] - }, { - type: 'FULLTEXT', - fields: ['fieldC'], - concurrently: true - }, { - type: 'FULLTEXT', - fields: ['fieldD'] - }], - engine: 'MyISAM' + indexes: [ + { + name: 'a_b_uniq', + unique: true, + method: 'BTREE', + fields: [ + 'fieldB', + { + attribute: 'fieldA', + collate: 'RTRIM', + order: 'DESC', + length: 5, + }, + ], + }, + { + type: 'FULLTEXT', + fields: ['fieldC'], + concurrently: true, + }, + { + type: 'FULLTEXT', + fields: ['fieldD'], + }, + ], + engine: 'MyISAM', } as TableOptions) - class ModelA extends Model { + class ModelA extends Model { @Column fieldA: string; @Column @@ -550,63 +567,61 @@ describe('model', () => { sequelize.addModels([ModelA]); - return sequelize.sync().then(() => { - return sequelize.sync(); // The second call should not try to create the indices again - }).then(() => { - return sequelize['queryInterface'].showIndex(ModelA['tableName']); - }).then(([idx1, idx2]) => { - - expect(idx1.fields).to.deep.equal([ - {attribute: 'fieldB', length: undefined, order: undefined}, - {attribute: 'fieldA', length: undefined, order: undefined} - ]); - - expect(idx2.fields).to.deep.equal([ - {attribute: 'fieldC', length: undefined, order: undefined} - ]); - - expect(idx1.name).to.equal('a_b_uniq'); - expect(idx1.unique).to.be.ok; + return sequelize + .sync() + .then(() => { + return sequelize.sync(); // The second call should not try to create the indices again + }) + .then(() => { + return sequelize['queryInterface'].showIndex(ModelA['tableName']); + }) + .then(([idx1, idx2]) => { + expect(idx1.fields).to.deep.equal([ + { attribute: 'fieldB', length: undefined, order: undefined }, + { attribute: 'fieldA', length: undefined, order: undefined }, + ]); + expect(idx2.fields).to.deep.equal([ + { attribute: 'fieldC', length: undefined, order: undefined }, + ]); - expect(idx2.name).to.equal('model_as_field_c'); - expect(idx2.unique).not.to.be.ok; + expect(idx1.name).to.equal('a_b_uniq'); + expect(idx1.unique).to.be.ok; - }); + expect(idx2.name).to.equal('model_as_field_c'); + expect(idx2.unique).not.to.be.ok; + }); }); }); describe('build using new', () => { - it('should create an instance of defined model', () => { const name = 'test'; @Table - class User extends Model { + class User extends Model { @Column name: string; } sequelize.addModels([User]); - const user = new User({name}); + const user = new User({ name }); expect(user).to.be.an.instanceOf(User); expect(user).to.have.property('name', name); }); - }); describe('build', () => { it("doesn't create database entries", () => { - MainUser.build({username: 'John Wayne'}); + MainUser.build({ username: 'John Wayne' }); return MainUser.findAll().then((users) => { expect(users).to.have.length(0); }); }); it('fills the objects with default values (timestamps=true)', () => { - @Table({timestamps: true}) - class Task extends Model { - + @Table({ timestamps: true }) + class Task extends Model { @Default('a task!') @Column title: string; @@ -638,8 +653,7 @@ describe('model', () => { it('fills the objects with default values', () => { @Table - class Task extends Model { - + class Task extends Model { @Default('a task!') @Column title: string; @@ -671,24 +685,23 @@ describe('model', () => { it('attaches getter and setter methods from attribute definition', () => { @Table - class Product extends Model { - + class Product extends Model { @Column({ get(this: Product): string { return 'answer = ' + this.getDataValue('price'); }, set(this: Product, value: number): any { return this.setDataValue('price', value + 42); - } + }, }) price: number; } sequelize.addModels([Product]); - expect(Product.build({price: 42}).price).to.equal('answer = 84'); + expect(Product.build({ price: 42 }).price).to.equal('answer = 84'); - const p = Product.build({price: 1}); + const p = Product.build({ price: 1 }); expect(p.price).to.equal('answer = 43'); p.price = 0; @@ -697,8 +710,7 @@ describe('model', () => { it('uses get/set accessors', () => { @Table - class Product extends Model { - + class Product extends Model { @Column(DataType.INTEGER) get priceInCents() { return this.getDataValue('priceInCents'); @@ -710,22 +722,20 @@ describe('model', () => { } get price() { - return '$' + (this.getDataValue('priceInCents') / 100); + return '$' + this.getDataValue('priceInCents') / 100; } } sequelize.addModels([Product]); - expect(Product.build({price: 20}).priceInCents).to.equal(20 * 100); - expect(Product.build({priceInCents: 30 * 100}).price).to.equal('$' + 30); + expect(Product.build({ price: 20 }).priceInCents).to.equal(20 * 100); + expect(Product.build({ priceInCents: 30 * 100 }).price).to.equal('$' + 30); }); describe('include', () => { - it('should support basic includes', () => { @Table - class Product extends Model { - + class Product extends Model { @Column title: string; @@ -746,8 +756,7 @@ describe('model', () => { } @Table - class Tag extends Model { - + class Tag extends Model { id: number; @Column @@ -758,8 +767,7 @@ describe('model', () => { } @Table - class User extends Model { - + class User extends Model { @Column firstName: string; @@ -772,24 +780,24 @@ describe('model', () => { sequelize.addModels([Product, Tag, User]); - const product = Product.build({ - id: 1, - title: 'Chair', - tags: [ - {id: 1, name: 'Alpha'}, - {id: 2, name: 'Beta'} - ], - user: { + const product = Product.build( + { id: 1, - firstName: 'Mick', - lastName: 'Hansen' + title: 'Chair', + tags: [ + { id: 1, name: 'Alpha' }, + { id: 2, name: 'Beta' }, + ], + user: { + id: 1, + firstName: 'Mick', + lastName: 'Hansen', + }, + }, + { + include: [User, Tag], } - }, { - include: [ - User, - Tag - ] - }); + ); expect(product.tags).to.be.ok; expect(product.tags.length).to.equal(2); @@ -800,8 +808,7 @@ describe('model', () => { it('should support includes with aliases', () => { @Table - class Product extends Model { - + class Product extends Model { @Column title: string; @@ -816,8 +823,7 @@ describe('model', () => { } @Table - class Tag extends Model { - + class Tag extends Model { id: number; @Column @@ -828,8 +834,7 @@ describe('model', () => { } @Table - class User extends Model { - + class User extends Model { id: number; @Column @@ -844,33 +849,36 @@ describe('model', () => { sequelize.addModels([Product, Tag, User]); - const product = Product.build({ - id: 1, - title: 'Chair', - categories: [ - {id: 1, name: 'Alpha'}, - {id: 2, name: 'Beta'}, - {id: 3, name: 'Charlie'}, - {id: 4, name: 'Delta'} - ], - followers: [ - { - id: 1, - firstName: 'Mick', - lastName: 'Hansen' - }, - { - id: 2, - firstName: 'Jan', - lastName: 'Meier' - } - ] - }, { - include: [ - {model: User, as: 'followers'}, - {model: Tag, as: 'categories'} - ] - }); + const product = Product.build( + { + id: 1, + title: 'Chair', + categories: [ + { id: 1, name: 'Alpha' }, + { id: 2, name: 'Beta' }, + { id: 3, name: 'Charlie' }, + { id: 4, name: 'Delta' }, + ], + followers: [ + { + id: 1, + firstName: 'Mick', + lastName: 'Hansen', + }, + { + id: 2, + firstName: 'Jan', + lastName: 'Meier', + }, + ], + }, + { + include: [ + { model: User, as: 'followers' }, + { model: Tag, as: 'categories' }, + ], + } + ); expect(product.categories).to.be.ok; expect(product.categories.length).to.equal(4); @@ -903,21 +911,20 @@ describe('model', () => { // } it('should not fail if model is paranoid and where is an empty array', () => { - @Table({paranoid: true, timestamps: true}) - class User extends Model { - + @Table({ paranoid: true, timestamps: true }) + class User extends Model { @Column username: string; } sequelize.addModels([User]); - return User.sync({force: true}) + return User.sync({ force: true }) .then(() => { - return User.create({username: 'A fancy name'}); + return User.create({ username: 'A fancy name' }); }) .then(() => { - return User.findOne({where: {}}); + return User.findOne({ where: {} }); }) .then((u) => { expect(u.username).to.equal('A fancy name'); @@ -925,30 +932,29 @@ describe('model', () => { }); it('should filter based on the where clause even if IFindOptions.include is []', () => { - @Table({paranoid: true, timestamps: true}) - class User extends Model { - + @Table({ paranoid: true, timestamps: true }) + class User extends Model { @Column username: string; } sequelize.addModels([User]); - return User.sync({force: true}) + return User.sync({ force: true }) .then(() => { - return User.create({username: 'a1'}); + return User.create({ username: 'a1' }); }) .then(() => { - return User.create({username: 'a2'}); + return User.create({ username: 'a2' }); }) .then(() => { - return User.findOne({where: {username: 'a2'}, include: []}); + return User.findOne({ where: { username: 'a2' }, include: [] }); }) .then((u) => { expect(u.username).to.equal('a2'); }) .then(() => { - return User.findOne({where: {username: 'a1'}, include: []}); + return User.findOne({ where: { username: 'a1' }, include: [] }); }) .then((u) => { expect(u.username).to.equal('a1'); @@ -994,10 +1000,9 @@ describe('model', () => { describe('returns an instance if it already exists', () => { it('with a single find field', () => { - - return MainUser.create({username: 'Username'}).then((user) => { + return MainUser.create({ username: 'Username' }).then((user) => { return MainUser.findOrBuild({ - where: {username: user.username} + where: { username: user.username }, }).then(([_user, initialized]) => { expect(_user.id).to.equal(user.id); expect(_user.username).to.equal('Username'); @@ -1007,13 +1012,12 @@ describe('model', () => { }); it('with multiple find fields', () => { - - return MainUser.create({username: 'Username', data: 'data'}).then((user) => { + return MainUser.create({ username: 'Username', data: 'data' }).then((user) => { return MainUser.findOrBuild({ where: { username: user.username, - data: user.data - } + data: user.data, + }, }).then(([_user, initialized]) => { expect(_user.id).to.equal(user.id); expect(_user.username).to.equal('Username'); @@ -1025,15 +1029,15 @@ describe('model', () => { it('builds a new instance with default value.', () => { const data = { - username: 'Username' + username: 'Username', }; const defaultValues = { - data: 'ThisIsData' + data: 'ThisIsData', }; return MainUser.findOrBuild({ where: data, - defaults: defaultValues + defaults: defaultValues, }).then(([user, initialized]) => { expect(user.id).to.be.null; expect(user.username).to.equal('Username'); @@ -1048,22 +1052,27 @@ describe('model', () => { describe('update', () => { it('throws an error if no where clause is given', () => { @Table - class User extends Model { - + class User extends Model { @Column username: string; } sequelize.addModels([User]); - return sequelize.sync({force: true}).then(() => { - return (User as any).update(); - }).then(() => { - throw new Error('Update should throw an error if no where clause is given.'); - }, (err) => { - expect(err).to.be.an.instanceof(Error); - expect(err.message).to.match(/^Missing where attribute in the options parameter/); - }); + return sequelize + .sync({ force: true }) + .then(() => { + return (User as any).update(); + }) + .then( + () => { + throw new Error('Update should throw an error if no where clause is given.'); + }, + (err) => { + expect(err).to.be.an.instanceof(Error); + expect(err.message).to.match(/^Missing where attribute in the options parameter/); + } + ); }); // TODO@robin sqlite3 transaction issue @@ -1092,9 +1101,8 @@ describe('model', () => { // } it('updates the attributes that we select only without updating createdAt', () => { - @Table({timestamps: true, paranoid: true}) - class User extends Model { - + @Table({ timestamps: true, paranoid: true }) + class User extends Model { @Column username: string; @@ -1105,19 +1113,26 @@ describe('model', () => { sequelize.addModels([User]); let test = false; - return User.sync({force: true}).then(() => { - return User.create({username: 'Peter', secretValue: '42'}).then((user) => { - return user.update({secretValue: '43'}, { - fields: ['secretValue'], logging: (sql) => { - test = true; - // tslint:disable:max-line-length - expect(sql).to.match(/UPDATE\s+[`"]+Users[`"]+\s+SET\s+[`"]+secretValue[`"]=(\$1|\?),[`"]+updatedAt[`"]+=(\$2|\?)\s+WHERE [`"]+id[`"]+\s=\s(\$3|\?)/); - } + return User.sync({ force: true }) + .then(() => { + return User.create({ username: 'Peter', secretValue: '42' }).then((user) => { + return user.update( + { secretValue: '43' }, + { + fields: ['secretValue'], + logging: (sql) => { + test = true; + expect(sql).to.match( + /UPDATE\s+[`"]+Users[`"]+\s+SET\s+[`"]+secretValue[`"]=(\$1|\?),[`"]+updatedAt[`"]+=(\$2|\?)\s+WHERE [`"]+id[`"]+\s=\s(\$3|\?)/ + ); + }, + } + ); }); + }) + .then(() => { + expect(test).to.be.true; }); - }).then(() => { - expect(test).to.be.true; - }); }); // // it('allows sql logging of updated statements', () => { @@ -1370,7 +1385,6 @@ describe('model', () => { // }); // }); // }); - }); // // describe('destroy', () => { diff --git a/test/specs/models/model.spec.ts b/test/specs/models/model.spec.ts index 2acfea27..7b313b77 100644 --- a/test/specs/models/model.spec.ts +++ b/test/specs/models/model.spec.ts @@ -1,14 +1,10 @@ -import {expect} from 'chai'; -import {Model} from "../../../src/model/model/model"; +import { expect } from 'chai'; +import { Model } from '../../../src/model/model/model'; describe('model', () => { - describe('constructor', () => { - it('should equal Model class', () => { expect(Model.prototype.constructor).to.equal(Model); }); - }); - }); diff --git a/test/specs/models/sequelize.spec.ts b/test/specs/models/sequelize.spec.ts index 092ce299..f673a737 100644 --- a/test/specs/models/sequelize.spec.ts +++ b/test/specs/models/sequelize.spec.ts @@ -1,29 +1,21 @@ -/* tslint:disable:max-classes-per-file */ - -import {expect} from 'chai'; -import { - createSequelize, - createSequelizeFromUri, - createSequelizeFromUriObject -} from '../../utils/sequelize'; -import {Game} from "../../models/exports/Game"; -import Gamer from "../../models/exports/gamer.model"; -import PlayerGlob from "../../models/globs/match-sub-dir-files/players/player.model"; -import ShoeGlob from "../../models/globs/match-sub-dir-files/shoes/shoe.model"; -import TeamGlob from "../../models/globs/match-sub-dir-files/teams/team.model"; -import PlayerDir from "../../models/globs/match-dir-only/PlayerDir"; -import TeamDir from "../../models/globs/match-dir-only/TeamDir"; -import ShoeDir from "../../models/globs/match-dir-only/ShoeDir"; -import {Table} from '../../../src/model/table/table'; -import {Match} from '../../models/exports/custom-match/match.model'; -import {Model, Sequelize} from "../../../src"; -import {Op} from "sequelize"; -import {join} from 'path'; -import {AddressDir} from "../../models/globs/match-files/AddressDir"; -import {UserDir} from "../../models/globs/match-files/UserDir"; +import { expect } from 'chai'; +import { createSequelize } from '../../utils/sequelize'; +import { Game } from '../../models/exports/Game'; +import Gamer from '../../models/exports/gamer.model'; +import PlayerGlob from '../../models/globs/match-sub-dir-files/players/player.model'; +import ShoeGlob from '../../models/globs/match-sub-dir-files/shoes/shoe.model'; +import TeamGlob from '../../models/globs/match-sub-dir-files/teams/team.model'; +import PlayerDir from '../../models/globs/match-dir-only/PlayerDir'; +import TeamDir from '../../models/globs/match-dir-only/TeamDir'; +import ShoeDir from '../../models/globs/match-dir-only/ShoeDir'; +import { Table } from '../../../src/model/table/table'; +import { Match } from '../../models/exports/custom-match/match.model'; +import { Model, Sequelize } from '../../../src'; +import { join } from 'path'; +import { AddressDir } from '../../models/globs/match-files/AddressDir'; +import { UserDir } from '../../models/globs/match-files/UserDir'; describe('sequelize', () => { - let sequelize: Sequelize; beforeEach(() => { @@ -34,7 +26,7 @@ describe('sequelize', () => { sequelize.close(); }); - const connectionUri = "sqlite://root@localhost/__"; + const connectionUri = 'sqlite://root@localhost/__'; function testOptionsProp(instance: Sequelize): void { expect(instance).to.have.property('options').that.have.property('dialect').that.eqls('sqlite'); @@ -44,24 +36,20 @@ describe('sequelize', () => { } describe('constructor', () => { - it('should equal Sequelize class', () => { expect(sequelize.constructor).to.equal(Sequelize); }); - }); describe('constructor: using "name" property as a db name', () => { - const db = '__'; const sequelizeDbName = new Sequelize({ - operatorsAliases: Op, database: db, dialect: 'sqlite', username: 'root', password: '', storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), + logging: !('DISABLE_LOGGING' in process.env), }); it('should equal Sequelize class', () => { @@ -74,16 +62,13 @@ describe('sequelize', () => { .that.have.property('database') .that.eqls(db); }); - }); describe('constructor using uri in options object', () => { - const sequelizeUri = new Sequelize(connectionUri, { - operatorsAliases: Op, storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), - pool: {max: 8, min: 0}, + logging: !('DISABLE_LOGGING' in process.env), + pool: { max: 8, min: 0 }, }); it('should equal Sequelize class', () => { @@ -101,11 +86,9 @@ describe('sequelize', () => { .that.have.property('max') .that.eqls(8); }); - }); describe('constructor using uri string', () => { - const sequelizeUri = new Sequelize(connectionUri); it('should equal Sequelize class', () => { @@ -115,11 +98,9 @@ describe('sequelize', () => { it('should contain valid options extracted from connection string', () => { testOptionsProp(sequelizeUri); }); - }); describe('global define options', () => { - describe('when created with config object', () => { const DEFINE_OPTIONS = { timestamps: true, @@ -134,85 +115,68 @@ describe('sequelize', () => { expect(sequelizeFromUriObject) .to.have.property('options') .that.has.property('define') - .that.eqls(DEFINE_OPTIONS) - ; + .that.eqls(DEFINE_OPTIONS); }); it('should set define options for models', () => { @Table - class User extends Model { - } + class User extends Model {} sequelizeFromUriObject.addModels([User]); - Object - .keys(DEFINE_OPTIONS) - .forEach(key => { - expect(User) - .to.have.property('options') - .that.have.property(key, DEFINE_OPTIONS[key]); - }); + Object.keys(DEFINE_OPTIONS).forEach((key) => { + expect(User).to.have.property('options').that.have.property(key, DEFINE_OPTIONS[key]); + }); }); }); }); describe('addModels', () => { - it('should not throw', () => { - expect(() => sequelize.addModels([__dirname + '/../../models/exports/'])).not.to.throw(); }); it('should throw', () => { - expect(() => sequelize.addModels([__dirname + '/../../models/exports/throws'])).to.throw(); }); describe('default exported models', () => { - it('should work as expected', () => { - sequelize.addModels([__dirname + '/../../models/exports/']); expect(() => Gamer.build({})).not.to.throw; - const gamer = Gamer.build({nickname: 'the_gamer'}); + const gamer = Gamer.build({ nickname: 'the_gamer' }); expect(gamer.nickname).to.equal('the_gamer'); }); - }); describe('named exported models', () => { - it('should work as expected', () => { - sequelize.addModels([__dirname + '/../../models/exports/']); expect(() => Game.build({})).not.to.throw; - const game = Game.build({title: 'Commander Keen'}); + const game = Game.build({ title: 'Commander Keen' }); expect(game.title).to.equal('Commander Keen'); }); - }); describe('custom model-path matching', () => { - it('should work as expected', () => { - sequelize.addModels( [__dirname + '/../../models/exports/custom-match'], (filename, member) => { const modelStripped = filename.substring(0, filename.indexOf('.model')); return modelStripped === member.toLowerCase(); - }, + } ); expect(() => Match.build({})).not.to.throw; - const custom = Match.build({title: 'Commander Keen'}); + const custom = Match.build({ title: 'Commander Keen' }); expect(custom.title).to.equal('Commander Keen'); }); @@ -227,19 +191,15 @@ describe('sequelize', () => { expect(Object.keys(sequelize['models']).length).to.equal(2); }); }); - }); describe('model', () => { - it('should make class references of loaded models available', () => { - sequelize.addModels([__dirname + '/../../models/exports/']); expect(sequelize['models']).to.have.property('Game', Game); expect(sequelize['models']).to.have.property('Gamer', Gamer); }); - }); describe('modelMatch', () => { @@ -259,29 +219,27 @@ describe('sequelize', () => { describe('Add model references', () => { it('should load models from constructor references', () => { @Table - class Test extends Model { - } + class Test extends Model {} const sequelize1 = new Sequelize({ database: '__', dialect: 'sqlite', storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), - models: [Test] + logging: !('DISABLE_LOGGING' in process.env), + models: [Test], }); expect(sequelize1['models']).to.have.property('Test', Test); }); it('should load models from references passed to addModels', () => { @Table - class Test extends Model { - } + class Test extends Model {} const sequelize1 = new Sequelize({ database: '__', dialect: 'sqlite', storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), + logging: !('DISABLE_LOGGING' in process.env), }); sequelize1.addModels([Test]); @@ -293,70 +251,68 @@ describe('sequelize', () => { it('should load classes from subfolders matching glob criteria', () => { const db = '__'; const sequelizeGlob = new Sequelize({ - operatorsAliases: Op, database: db, dialect: 'sqlite', username: 'root', password: '', storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), - models: [__dirname + '/../../models/globs/match-sub-dir-files/**/*.model.ts'] + logging: !('DISABLE_LOGGING' in process.env), + models: [__dirname + '/../../models/globs/match-sub-dir-files/**/*.model.ts'], }); expect(sequelizeGlob['models']).to.have.property('PlayerGlob', PlayerGlob); expect(sequelizeGlob['models']).to.have.property('TeamGlob', TeamGlob); expect(sequelizeGlob['models']).to.have.property('ShoeGlob', ShoeGlob); - }); it('should load classes from folders', () => { const db = '__'; const sequelizeFolder = new Sequelize({ - operatorsAliases: Op, database: db, dialect: 'sqlite', username: 'root', password: '', storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), - models: [__dirname + '/../../models/globs/match-dir-only'] + logging: !('DISABLE_LOGGING' in process.env), + models: [__dirname + '/../../models/globs/match-dir-only'], }); expect(sequelizeFolder['models']).to.have.property('PlayerDir', PlayerDir); expect(sequelizeFolder['models']).to.have.property('TeamDir', TeamDir); expect(sequelizeFolder['models']).to.have.property('ShoeDir', ShoeDir); - }); it('should load exact files', () => { const db = '__'; const sequelizeFolder = new Sequelize({ - operatorsAliases: Op, database: db, dialect: 'sqlite', username: 'root', password: '', storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), - models: ['AddressDir.ts', 'UserDir.ts'].map(file => join(__dirname, '/../../models/globs/match-files', file)) + logging: !('DISABLE_LOGGING' in process.env), + models: ['AddressDir.ts', 'UserDir.ts'].map((file) => + join(__dirname, '/../../models/globs/match-files', file) + ), }); expect(sequelizeFolder['models']).to.have.property('AddressDir', AddressDir); expect(sequelizeFolder['models']).to.have.property('UserDir', UserDir); - }); it('should load classes from folders and from glob', () => { const db = '__'; const sequelizeGlobFolder = new Sequelize({ - operatorsAliases: Op, database: db, dialect: 'sqlite', username: 'root', password: '', storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), - modelPaths: [__dirname + '/../../models/globs/match-dir-only', __dirname + '/../../models/globs/match-sub-dir-files/**/*.model.ts'] + logging: !('DISABLE_LOGGING' in process.env), + modelPaths: [ + __dirname + '/../../models/globs/match-dir-only', + __dirname + '/../../models/globs/match-sub-dir-files/**/*.model.ts', + ], }); expect(sequelizeGlobFolder['models']).to.have.property('PlayerDir', PlayerDir); @@ -365,7 +321,6 @@ describe('sequelize', () => { expect(sequelizeGlobFolder['models']).to.have.property('PlayerGlob', PlayerGlob); expect(sequelizeGlobFolder['models']).to.have.property('TeamGlob', TeamGlob); expect(sequelizeGlobFolder['models']).to.have.property('ShoeGlob', ShoeGlob); - }); }); }); diff --git a/test/specs/repository-mode.spec.ts b/test/specs/repository-mode.spec.ts index 7236af76..5c546a67 100644 --- a/test/specs/repository-mode.spec.ts +++ b/test/specs/repository-mode.spec.ts @@ -1,31 +1,28 @@ -import {expect} from 'chai'; -import {Op} from 'sequelize'; - -import {BelongsToMany} from "../../src/associations/belongs-to-many/belongs-to-many"; -import {Table} from "../../src/model/table/table"; -import {Sequelize} from "../../src/sequelize/sequelize/sequelize"; -import {Column} from "../../src/model/column/column"; -import {Model} from "../../src/model/model/model"; -import {HasMany} from "../../src/associations/has/has-many"; -import {HasOne} from "../../src/associations/has/has-one"; -import {ForeignKey} from "../../src/associations/foreign-key/foreign-key"; -import {BelongsTo} from "../../src/associations/belongs-to/belongs-to"; +import { expect } from 'chai'; + +import { BelongsToMany } from '../../src/associations/belongs-to-many/belongs-to-many'; +import { Table } from '../../src/model/table/table'; +import { Sequelize } from '../../src/sequelize/sequelize/sequelize'; +import { Column } from '../../src/model/column/column'; +import { Model } from '../../src/model/model/model'; +import { HasMany } from '../../src/associations/has/has-many'; +import { HasOne } from '../../src/associations/has/has-one'; +import { ForeignKey } from '../../src/associations/foreign-key/foreign-key'; +import { BelongsTo } from '../../src/associations/belongs-to/belongs-to'; import { SequelizeOptions } from '../../src'; describe('repository-mode', () => { - const defaultOptions: Partial = { dialect: 'sqlite', username: 'root', password: '', - logging: !!process.env.SEQ_SILENT, + logging: !!process.env.DISABLE_LOGGING, repositoryMode: true, }; describe('simple setup', () => { - @Table - class User extends Model { + class User extends Model { @Column name: string; @Column birthday: Date; } @@ -35,13 +32,11 @@ describe('repository-mode', () => { before(async () => { sequelizeA = new Sequelize({ - operatorsAliases: Op, ...defaultOptions, database: 'a', models: [User], }); sequelizeB = new Sequelize({ - operatorsAliases: Op, ...defaultOptions, database: 'b', models: [User], @@ -49,15 +44,15 @@ describe('repository-mode', () => { }); beforeEach(async () => { - await sequelizeA.sync({force: true}); - await sequelizeB.sync({force: true}); + await sequelizeA.sync({ force: true }); + await sequelizeB.sync({ force: true }); }); it('should successfully retrieve repository', () => { let UserRepositoryA; let UserRepositoryB; - expect(() => UserRepositoryA = sequelizeA.getRepository(User)).to.not.throw(); - expect(() => UserRepositoryB = sequelizeB.getRepository(User)).to.not.throw(); + expect(() => (UserRepositoryA = sequelizeA.getRepository(User))).to.not.throw(); + expect(() => (UserRepositoryB = sequelizeB.getRepository(User))).to.not.throw(); expect(UserRepositoryA).to.be.ok; expect(UserRepositoryB).to.be.ok; }); @@ -68,36 +63,33 @@ describe('repository-mode', () => { it('should be able to create instance of model via repository', async () => { const UserRepository = sequelizeA.getRepository(User); - const user = await UserRepository.create({name: 'Han Solo'}); + const user = await UserRepository.create({ name: 'Han Solo' }); expect(user).to.be.an.instanceOf(User); expect(user.name).to.eql('Han Solo'); }); it('should not affect sequelize instance B if an instance is stored via sequelize instance A', async () => { - const userA = await sequelizeA.getRepository(User).create({name: 'Han Solo'}); + const userA = await sequelizeA.getRepository(User).create({ name: 'Han Solo' }); const userB = await sequelizeB.getRepository(User).findByPk(userA.id); expect(userB).to.be.null; }); - }); describe('associations', () => { - describe('one-to-one', () => { - type _Address = Partial
; @Table - class User extends Model { + class User extends Model { @Column name: string; @Column birthday: Date; @HasOne(() => Address) address: _Address; } @Table - class Address extends Model
{ + class Address extends Model { @Column street: string; @Column city: string; @ForeignKey(() => User) userId: number; @@ -108,7 +100,6 @@ describe('repository-mode', () => { before(async () => { sequelize = new Sequelize({ - operatorsAliases: Op, ...defaultOptions, database: 'a', models: [User, Address], @@ -116,7 +107,7 @@ describe('repository-mode', () => { }); beforeEach(async () => { - await sequelize.sync({force: true}); + await sequelize.sync({ force: true }); }); it('should not initialize actual model class', () => { @@ -125,22 +116,23 @@ describe('repository-mode', () => { }); it('should create user with associated model', async () => { - const user = await sequelize.getRepository(User).create({ - name: 'Sherlock Holmes', - birthday: new Date(), - address: {street: 'Bakerstreet', city: 'London'}, - }, {include: [sequelize.getRepository(Address) as any]}); + const user = await sequelize.getRepository(User).create( + { + name: 'Sherlock Holmes', + birthday: new Date(), + address: { street: 'Bakerstreet', city: 'London' }, + }, + { include: [sequelize.getRepository(Address) as any] } + ); expect(user.address).to.have.property('street', 'Bakerstreet'); expect(user.address).to.have.property('city', 'London'); }); - }); describe('one-to-many', () => { - @Table - class User extends Model { + class User extends Model { @Column name: string; @Column birthday: Date; @@ -149,7 +141,7 @@ describe('repository-mode', () => { } @Table - class Comment extends Model { + class Comment extends Model { @Column text: string; @ForeignKey(() => User) @@ -164,26 +156,24 @@ describe('repository-mode', () => { before(async () => { sequelizeA = new Sequelize({ - operatorsAliases: Op, ...defaultOptions, database: 'a', repositoryMode: true, - logging: !!process.env.SEQ_SILENT, + logging: !!process.env.DISABLE_LOGGING, models: [User, Comment], }); sequelizeB = new Sequelize({ - operatorsAliases: Op, ...defaultOptions, database: 'b', repositoryMode: true, - logging: !!process.env.SEQ_SILENT, + logging: !!process.env.DISABLE_LOGGING, models: [User, Comment], }); }); beforeEach(async () => { - await sequelizeA.sync({force: true}); - await sequelizeB.sync({force: true}); + await sequelizeA.sync({ force: true }); + await sequelizeB.sync({ force: true }); }); it('should not initialize actual model classes', () => { @@ -194,8 +184,8 @@ describe('repository-mode', () => { it('should be able to create instance of each model via repository', async () => { const userRepository = sequelizeA.getRepository(User); const commentRepository = sequelizeA.getRepository(Comment); - const user = await userRepository.create({name: 'Han Solo'}); - const comment = await commentRepository.create({text: 'I shot first!'}); + const user = await userRepository.create({ name: 'Han Solo' }); + const comment = await commentRepository.create({ text: 'I shot first!' }); expect(user).to.be.an.instanceOf(User); expect(comment).to.be.an.instanceOf(Comment); @@ -204,35 +194,38 @@ describe('repository-mode', () => { it('should be able to create instance of model using "include" via repository', async () => { const userRepository = sequelizeA.getRepository(User); const commentRepository = sequelizeA.getRepository(Comment); - const user = await userRepository.create({ - name: 'Han Solo', - comments: [{ - text: 'I shot first!', - }], - }, {include: [commentRepository]}); + const user = await userRepository.create( + { + name: 'Han Solo', + comments: [ + { + text: 'I shot first!', + }, + ], + }, + { include: [commentRepository] } + ); expect(user).to.be.an.instanceOf(User); expect(user).to.have.property('comments'); }); - }); describe('many-to-many', () => { - @Table - class UserEvent extends Model { + class UserEvent extends Model { @ForeignKey(() => User) @Column userId: number; @ForeignKey(() => Event) @Column eventId: number; } @Table - class Event extends Model { + class Event extends Model { @Column name: string; @BelongsToMany(() => User, () => UserEvent) users: any[]; } @Table - class User extends Model { + class User extends Model { @Column name: string; @BelongsToMany(() => Event, () => UserEvent) events: Event[]; } @@ -242,26 +235,24 @@ describe('repository-mode', () => { before(async () => { sequelizeA = new Sequelize({ - operatorsAliases: Op, ...defaultOptions, database: 'a', repositoryMode: true, - logging: !!process.env.SEQ_SILENT, + logging: !!process.env.DISABLE_LOGGING, models: [User, Event, UserEvent], }); sequelizeB = new Sequelize({ - operatorsAliases: Op, ...defaultOptions, database: 'b', repositoryMode: true, - logging: !!process.env.SEQ_SILENT, + logging: !!process.env.DISABLE_LOGGING, models: [User, Event, UserEvent], }); }); beforeEach(async () => { - await sequelizeA.sync({force: true}); - await sequelizeB.sync({force: true}); + await sequelizeA.sync({ force: true }); + await sequelizeB.sync({ force: true }); }); it('should not initialize actual model classes', () => { @@ -273,20 +264,21 @@ describe('repository-mode', () => { it('should be able to create instance of model using "include" via repository', async () => { const userRepository = sequelizeA.getRepository(User); const eventRepository = sequelizeA.getRepository(Event); - const user = await userRepository.create({ - name: 'Han Solo', - events: [{ - name: 'Defeat the Empire', - }], - }, {include: [eventRepository]}); + const user = await userRepository.create( + { + name: 'Han Solo', + events: [ + { + name: 'Defeat the Empire', + }, + ], + }, + { include: [eventRepository] } + ); expect(user).to.be.an.instanceOf(User); expect(user).to.have.property('events'); }); - }); - }); - - }); diff --git a/test/specs/scopes.spec.ts b/test/specs/scopes.spec.ts index f9256b33..6196c2e0 100644 --- a/test/specs/scopes.spec.ts +++ b/test/specs/scopes.spec.ts @@ -1,33 +1,35 @@ -import {expect, use} from 'chai'; +import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {useFakeTimers} from 'sinon'; -import {Op} from 'sequelize'; -import {createSequelize} from "../utils/sequelize"; -import {getScopeOptions} from "../../src/scopes/scope-service"; -import {ShoeWithDeprecatedScopes, SHOE_DEFAULT_SCOPE, SHOE_SCOPES} from "../models/ShoeWithDeprecatedScopes"; -import {Manufacturer} from "../models/Manufacturer"; -import {Person} from "../models/Person"; -import {Model} from '../../src/model/model/model'; -import {Table} from '../../src/model/table/table'; -import {Scopes} from '../../src/scopes/scopes'; -import {Column} from '../../src/model/column/column'; -import {UpdatedAt} from '../../src/model/column/timestamps/updated-at'; +import { useFakeTimers } from 'sinon'; +import { Op } from 'sequelize'; +import { createSequelize } from '../utils/sequelize'; +import { getScopeOptions } from '../../src/scopes/scope-service'; +import { + ShoeWithDeprecatedScopes, + SHOE_DEFAULT_SCOPE, + SHOE_SCOPES, +} from '../models/ShoeWithDeprecatedScopes'; +import { Manufacturer } from '../models/Manufacturer'; +import { Person } from '../models/Person'; +import { Model } from '../../src/model/model/model'; +import { Table } from '../../src/model/table/table'; +import { Scopes } from '../../src/scopes/scopes'; +import { Column } from '../../src/model/column/column'; +import { UpdatedAt } from '../../src/model/column/timestamps/updated-at'; import chaiDatetime = require('chai-datetime'); -import {ShoeWithScopes} from "../models/ShoeWithScopes"; +import { ShoeWithScopes } from '../models/ShoeWithScopes'; use(chaiAsPromised); use(chaiDatetime); describe('scopes', () => { - let sequelize; - before(() => sequelize = createSequelize()); + before(() => (sequelize = createSequelize())); - beforeEach(() => sequelize.sync({force: true})); + beforeEach(() => sequelize.sync({ force: true })); describe('options', () => { - it('should be retrievable from class prototype', () => { const showScopeOptions = getScopeOptions(ShoeWithDeprecatedScopes.prototype); expect(showScopeOptions).not.to.be.undefined; @@ -42,20 +44,17 @@ describe('scopes', () => { }); describe('find', () => { - const BRAND = 'adiwas'; const OWNER = 'bob'; [ ['option getters', ShoeWithDeprecatedScopes], - ['deprecated', ShoeWithScopes] - ] - .forEach(([descr, Shoe]: [string, typeof ShoeWithScopes]) => { - - describe(descr, () => { - - beforeEach(() => Shoe - .create({ + ['deprecated', ShoeWithScopes], + ].forEach(([descr, Shoe]: [string, typeof ShoeWithScopes]) => { + describe(descr, () => { + beforeEach(() => + Shoe.create( + { secretKey: 'j435njk3', primaryColor: 'red', secondaryColor: 'blue', @@ -65,198 +64,168 @@ describe('scopes', () => { notInScopeBrandOnly: 'invisible :)', }, owner: { - name: OWNER - } - }, {include: [Manufacturer, Person]})); - - it('should consider default scope', () => - - Shoe.findOne() - .then(shoe => { - - expect(Object.keys(shoe['dataValues'])).to.eql(SHOE_DEFAULT_SCOPE.attributes); - }) - ); - - it('should consider other scopes', () => - - Shoe.scope('full').findOne() - .then(shoe => { - - expect(shoe).to.have.property('manufacturer').which.is.not.null; - expect(shoe).to.have.property('manufacturer').which.have.property('brand', BRAND); - }) - .then(() => (Shoe.scope('yellow') as typeof Shoe).findAll()) - .then(yellowShoes => { - - expect(yellowShoes).to.be.empty; - }) - .then(() => (Shoe.scope('noImg') as typeof Shoe).findAll()) - .then(noImgShoes => { - - expect(noImgShoes).to.be.not.empty; - }) - ); - - it('should not consider default scope due to unscoped call', () => - Shoe - .unscoped() - .findOne() - .then(shoe => { - expect(shoe).to.have.property('secretKey').which.is.a('string'); - }) - ); - - describe('with include options', () => { - - it('should consider scopes and additional included model (object)', () => - expect( - Shoe.scope('full') - .findOne({ - include: [{ - model: Person, - }] - }) - .then(shoe => { - expect(shoe).to.have.property('manufacturer').which.is.not.null; - expect(shoe).to.have.property('manufacturer').which.have.property('brand', BRAND); - expect(shoe).to.have.property('owner').which.is.not.null; - }) - ).not.to.be.rejected - ); - - it('should consider scopes and additional included model (model)', () => - expect( - Shoe.scope('full') - .findOne({ - include: [Person] - }) - .then(shoe => { - expect(shoe).to.have.property('manufacturer').which.is.not.null; - expect(shoe).to.have.property('manufacturer').which.have.property('brand', BRAND); - expect(shoe).to.have.property('owner').which.is.not.null; - }) - ).not.to.be.rejected - ); - - it('should not consider default scope due to unscoped call, but additonal includes (object)', () => - - Shoe.unscoped() + name: OWNER, + }, + }, + { include: [Manufacturer, Person] } + ) + ); + + it('should consider default scope', () => + Shoe.findOne().then((shoe) => { + expect(Object.keys(shoe['dataValues'])).to.eql(SHOE_DEFAULT_SCOPE.attributes); + })); + + it('should consider other scopes', () => + Shoe.scope('full') + .findOne() + .then((shoe) => { + expect(shoe).to.have.property('manufacturer').which.is.not.null; + expect(shoe).to.have.property('manufacturer').which.have.property('brand', BRAND); + }) + .then(() => (Shoe.scope('yellow') as typeof Shoe).findAll()) + .then((yellowShoes) => { + expect(yellowShoes).to.be.empty; + }) + .then(() => (Shoe.scope('noImg') as typeof Shoe).findAll()) + .then((noImgShoes) => { + expect(noImgShoes).to.be.not.empty; + })); + + it('should not consider default scope due to unscoped call', () => + Shoe.unscoped() + .findOne() + .then((shoe) => { + expect(shoe).to.have.property('secretKey').which.is.a('string'); + })); + + describe('with include options', () => { + it('should consider scopes and additional included model (object)', () => + expect( + Shoe.scope('full') .findOne({ - include: [{model: Person}] + include: [ + { + model: Person, + }, + ], }) - .then(shoe => { - expect(shoe).to.have.property('secretKey').which.is.not.null; + .then((shoe) => { + expect(shoe).to.have.property('manufacturer').which.is.not.null; + expect(shoe).to.have.property('manufacturer').which.have.property('brand', BRAND); expect(shoe).to.have.property('owner').which.is.not.null; }) - ); - - it('should not consider default scope due to unscoped call, but additonal includes (model)', () => + ).not.to.be.rejected); - Shoe - .unscoped() + it('should consider scopes and additional included model (model)', () => + expect( + Shoe.scope('full') .findOne({ - include: [Person] + include: [Person], }) - .then(shoe => { - expect(shoe).to.have.property('secretKey').which.is.not.null; + .then((shoe) => { + expect(shoe).to.have.property('manufacturer').which.is.not.null; + expect(shoe).to.have.property('manufacturer').which.have.property('brand', BRAND); expect(shoe).to.have.property('owner').which.is.not.null; }) - ); + ).not.to.be.rejected); - describe('with using scoped included model', () => { - - // TODO deactivated due to: https://github.com/sequelize/sequelize/issues/10399 - - it.skip('should consider scope of included model (without own scope)', () => - Shoe - .findOne({ - include: [Manufacturer.scope('brandOnly')] - }) - .then(shoe => { - expect(shoe).to.have.property('manufacturer') - .that.have.property('notInScopeBrandOnly') - .which.is.undefined; - }) - ); - - it.skip('should consider scope of included model (with own scope)', () => - Shoe.scope('red') - .findOne({ - include: [Manufacturer.scope('brandOnly') as typeof Manufacturer] - }) - .then(shoe => { - expect(shoe).to.have.property('manufacturer') - .that.have.property('notInScopeBrandOnly') - .which.is.undefined; - }) - ); - - }); - - }); - - describe('with nested scope', () => { + it('should not consider default scope due to unscoped call, but additonal includes (object)', () => + Shoe.unscoped() + .findOne({ + include: [{ model: Person }], + }) + .then((shoe) => { + expect(shoe).to.have.property('secretKey').which.is.not.null; + expect(shoe).to.have.property('owner').which.is.not.null; + })); + + it('should not consider default scope due to unscoped call, but additonal includes (model)', () => + Shoe.unscoped() + .findOne({ + include: [Person], + }) + .then((shoe) => { + expect(shoe).to.have.property('secretKey').which.is.not.null; + expect(shoe).to.have.property('owner').which.is.not.null; + })); + describe('with using scoped included model', () => { // TODO deactivated due to: https://github.com/sequelize/sequelize/issues/10399 - it.skip('should consider nested scope', () => - Shoe.scope('manufacturerWithScope') - .findOne() - .then(shoe => { - expect(shoe).to.have.property('manufacturer') - .that.have.property('notInScopeBrandOnly') - .which.is.undefined; - }) - ); - - it('should not consider nested scope', () => - Shoe.scope('full') - .findOne() - .then(shoe => { - expect(shoe).to.have.property('manufacturer') - .that.have.property('notInScopeBrandOnly') - .which.is.a('string'); + it.skip('should consider scope of included model (without own scope)', () => + Shoe.findOne({ + include: [Manufacturer.scope('brandOnly')], + }).then((shoe) => { + expect(shoe) + .to.have.property('manufacturer') + .that.have.property('notInScopeBrandOnly').which.is.undefined; + })); + + it.skip('should consider scope of included model (with own scope)', () => + Shoe.scope('red') + .findOne({ + include: [Manufacturer.scope('brandOnly') as typeof Manufacturer], }) - ); - + .then((shoe) => { + expect(shoe) + .to.have.property('manufacturer') + .that.have.property('notInScopeBrandOnly').which.is.undefined; + })); }); + }); - describe('with scope function', () => { - - it('should find appropriate shoe due to correctly passed scope function param', () => - Shoe.scope({method: ['primaryColor', 'red']}) - .findOne() - .then(shoe => { - expect(shoe).to.have.property('primaryColor', 'red'); - }) - ); + describe('with nested scope', () => { + // TODO deactivated due to: https://github.com/sequelize/sequelize/issues/10399 - it('should find appropriate shoe due to correctly passed scope function param including associated model', () => - Shoe.scope({method: ['primaryColorWithManufacturer', 'red']}) - .findOne() - .then(shoe => { - expect(shoe).to.have.property('primaryColor', 'red'); - expect(shoe).to.have.property('manufacturer').that.is.an('object'); - }) - ); + it.skip('should consider nested scope', () => + Shoe.scope('manufacturerWithScope') + .findOne() + .then((shoe) => { + expect(shoe) + .to.have.property('manufacturer') + .that.have.property('notInScopeBrandOnly').which.is.undefined; + })); + + it('should not consider nested scope', () => + Shoe.scope('full') + .findOne() + .then((shoe) => { + expect(shoe) + .to.have.property('manufacturer') + .that.have.property('notInScopeBrandOnly') + .which.is.a('string'); + })); + }); - }); + describe('with scope function', () => { + it('should find appropriate shoe due to correctly passed scope function param', () => + Shoe.scope({ method: ['primaryColor', 'red'] }) + .findOne() + .then((shoe) => { + expect(shoe).to.have.property('primaryColor', 'red'); + })); + it('should find appropriate shoe due to correctly passed scope function param including associated model', () => + Shoe.scope({ method: ['primaryColorWithManufacturer', 'red'] }) + .findOne() + .then((shoe) => { + expect(shoe).to.have.property('primaryColor', 'red'); + expect(shoe).to.have.property('manufacturer').that.is.an('object'); + })); }); - }); + }); describe('with symbols', () => { let _sequelize; @Scopes({ - bob: {where: {name: {[Op.like]: '%bob%'}}}, - updated: {where: {updated: {[Op.gt]: new Date(2000, 1)}}}, + bob: { where: { name: { [Op.like]: '%bob%' } } }, + updated: { where: { updated: { [Op.gt]: new Date(2000, 1) } } }, }) @Table - class _Person extends Model<_Person> { - + class _Person extends Model { @Column name: string; @@ -269,32 +238,27 @@ describe('scopes', () => { _sequelize.addModels([_Person]); }); - beforeEach(() => _sequelize.sync({force: true})); + beforeEach(() => _sequelize.sync({ force: true })); it('should consider symbols while finding elements', () => { return _Person - .create({name: '1bob2'}) - .then(() => _Person.create({name: 'bob'})) - .then(() => _Person.create({name: 'bobby'})) - .then(() => _Person.create({name: 'robert'})) + .create({ name: '1bob2' }) + .then(() => _Person.create({ name: 'bob' })) + .then(() => _Person.create({ name: 'bobby' })) + .then(() => _Person.create({ name: 'robert' })) .then(() => (_Person.scope('bob') as typeof _Person).findAll()) - .then(persons => expect(persons).to.have.property('length', 3)) - ; + .then((persons) => expect(persons).to.have.property('length', 3)); }); it('should consider symbols on timestamp column while finding elements', () => { const clock = useFakeTimers(+new Date()); return _Person - .create({name: 'test'}) + .create({ name: 'test' }) .then(() => (_Person.scope('updated') as typeof _Person).findAll()) .then(() => _Person.findAll()) - .then(persons => expect(persons).to.have.property('length', 1)) - .then(() => clock.restore()) - ; + .then((persons) => expect(persons).to.have.property('length', 1)) + .then(() => clock.restore()); }); - }); - }); - }); diff --git a/test/specs/services/association.spec.ts b/test/specs/services/association.spec.ts index de4d5145..e406da46 100644 --- a/test/specs/services/association.spec.ts +++ b/test/specs/services/association.spec.ts @@ -1,17 +1,14 @@ -/* tslint:disable:max-classes-per-file */ -import {expect} from 'chai'; -import {addForeignKey} from "../../../src/associations/foreign-key/foreign-key-service"; -import {Model} from "../../../src/model/model/model"; -import {getForeignKeys} from '../../../src/associations/foreign-key/foreign-key-service'; +import { expect } from 'chai'; +import { addForeignKey } from '../../../src/associations/foreign-key/foreign-key-service'; +import { Model } from '../../../src/model/model/model'; +import { getForeignKeys } from '../../../src/associations/foreign-key/foreign-key-service'; describe('service.association', () => { - describe('addForeignKey', () => { - it('should add foreign key to target metadata', () => { const target = {}; const FOREIGN_KEY = 'testId'; - const RELATED_CLASS_GETTER = () => class T extends Model {}; + const RELATED_CLASS_GETTER = () => class T extends Model {}; addForeignKey(target, RELATED_CLASS_GETTER, FOREIGN_KEY); const foreignKeys = getForeignKeys(target); @@ -27,7 +24,7 @@ describe('service.association', () => { const target = Object.create(parent); const FOREIGN_KEY = 'testId'; const PARENT_FOREIGN_KEY = 'parentTestId'; - const RELATED_CLASS_GETTER = () => class T extends Model {}; + const RELATED_CLASS_GETTER = () => class T extends Model {}; addForeignKey(parent, RELATED_CLASS_GETTER, PARENT_FOREIGN_KEY); addForeignKey(target, RELATED_CLASS_GETTER, FOREIGN_KEY); @@ -49,7 +46,5 @@ describe('service.association', () => { relatedClassGetter: RELATED_CLASS_GETTER, }); }); - }); - }); diff --git a/test/specs/services/models.spec.ts b/test/specs/services/models.spec.ts index 2e7dd9cd..ae566ebc 100644 --- a/test/specs/services/models.spec.ts +++ b/test/specs/services/models.spec.ts @@ -1,40 +1,35 @@ -import {expect} from 'chai'; +import { expect } from 'chai'; +import { resolveModelGetter } from '../../../src/model/shared/model-service'; +import { Book } from '../../models/Book'; +import { DataType } from '../../../src/sequelize/data-type/data-type'; import { - resolveModelGetter} from '../../../src/model/shared/model-service'; -import {Book} from "../../models/Book"; -import {DataType} from "../../../src/sequelize/data-type/data-type"; -import {addAttribute, addAttributeOptions, getAttributes, setAttributes} from '../../../src/model/column/attribute-service'; - -/* tslint:disable:max-classes-per-file */ + addAttribute, + addAttributeOptions, + getAttributes, + setAttributes, +} from '../../../src/model/column/attribute-service'; describe('services.models', () => { - describe('resolveModelGetter', () => { - const options = { a: () => Book, b: () => null, c: { c1: () => Book, - c2: () => null + c2: () => null, }, - include: [ - () => Book, - () => null, - ] + include: [() => Book, () => null], }; const resolvedOptions = resolveModelGetter(options); it('should resolve getter', () => { - expect(resolvedOptions.a).to.be.equal(Book); expect(resolvedOptions.c.c1).to.be.equal(Book); expect(resolvedOptions.include[0]).to.be.equal(Book); }); it('should not resolve other functions', () => { - expect(resolvedOptions.b).to.be.a('function'); expect(resolvedOptions.c.c2).to.be.a('function'); expect(resolvedOptions.include[1]).to.be.a('function'); @@ -42,38 +37,36 @@ describe('services.models', () => { }); describe('addAttribute', () => { - it('should not throw', () => { expect(() => addAttribute({}, 'test', {})).to.not.throw(); }); - }); describe('getAttributes', () => { - const target = {}; - const ATTRIBUTES = {name: {primaryKey: true}, age: {type: DataType.NUMBER}}; + const ATTRIBUTES = { name: { primaryKey: true }, age: { type: DataType.NUMBER } }; setAttributes(target, ATTRIBUTES); it('should not return reference but copy of attributes', () => { const attributes = getAttributes(target); expect(attributes).to.not.equal(ATTRIBUTES); }); - }); describe('addAttributeOptions', () => { - const target = {}; const PROPERTY_NAME = 'test'; - const OPTIONS = {allowNull: true}; + const OPTIONS = { allowNull: true }; addAttribute(target, PROPERTY_NAME, {}); addAttributeOptions(target, PROPERTY_NAME, OPTIONS); it('should be able to retrieve added attribute options', () => { const attributes = getAttributes(target); expect(Object.keys(attributes)).to.have.property('length', 1); - expect(Object.keys(attributes[PROPERTY_NAME])).to.have.property('length', Object.keys(OPTIONS).length); + expect(Object.keys(attributes[PROPERTY_NAME])).to.have.property( + 'length', + Object.keys(OPTIONS).length + ); expect(attributes).to.have.property(PROPERTY_NAME).that.eqls(OPTIONS); }); @@ -81,32 +74,37 @@ describe('services.models', () => { const child = Object.create(target); const attributes = getAttributes(child); expect(Object.keys(attributes)).to.have.property('length', 1); - expect(Object.keys(attributes[PROPERTY_NAME])).to.have.property('length', Object.keys(OPTIONS).length); + expect(Object.keys(attributes[PROPERTY_NAME])).to.have.property( + 'length', + Object.keys(OPTIONS).length + ); expect(attributes).to.have.property(PROPERTY_NAME).that.eqls(OPTIONS); }); it('should add new options to child prototype but not parent one', () => { const child = Object.create(target); - const NEW_OPTIONS = {primaryKey: true}; + const NEW_OPTIONS = { primaryKey: true }; addAttributeOptions(child, PROPERTY_NAME, NEW_OPTIONS); // for child const attributes = getAttributes(child); expect(Object.keys(attributes)).to.have.property('length', 1); - expect(Object.keys(attributes[PROPERTY_NAME])) - .to.have.property( + expect(Object.keys(attributes[PROPERTY_NAME])).to.have.property( 'length', Object.keys(OPTIONS).length + Object.keys(NEW_OPTIONS).length ); - expect(attributes).to.have.property(PROPERTY_NAME).that.eqls({...OPTIONS, ...NEW_OPTIONS}); + expect(attributes) + .to.have.property(PROPERTY_NAME) + .that.eqls({ ...OPTIONS, ...NEW_OPTIONS }); // for parent const parentAttributes = getAttributes(target); expect(Object.keys(parentAttributes)).to.have.property('length', 1); - expect(Object.keys(parentAttributes[PROPERTY_NAME])).to.have.property('length', Object.keys(OPTIONS).length); + expect(Object.keys(parentAttributes[PROPERTY_NAME])).to.have.property( + 'length', + Object.keys(OPTIONS).length + ); expect(parentAttributes).to.have.property(PROPERTY_NAME).that.eqls(OPTIONS); }); - }); - }); diff --git a/test/specs/table_column.spec.ts b/test/specs/table_column.spec.ts index d2f8a5b2..f4363472 100644 --- a/test/specs/table_column.spec.ts +++ b/test/specs/table_column.spec.ts @@ -1,85 +1,81 @@ -import {expect, use} from 'chai'; +import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {ModelAttributes} from 'sequelize'; -import {Model, Table, Column, DataType} from "../../src"; -import {createSequelize} from "../utils/sequelize"; -import {User} from "../models/User"; -import {getOptions} from "../../src/model/shared/model-service"; -import {Shoe, SHOE_TABLE_NAME} from "../models/Shoe"; +import { ModelAttributes } from 'sequelize'; +import { Model, Table, Column, DataType, AutoIncrement, PrimaryKey } from '../../src'; +import { createSequelize } from '../utils/sequelize'; +import { User } from '../models/User'; +import { getOptions } from '../../src/model/shared/model-service'; +import { Shoe, SHOE_TABLE_NAME } from '../models/Shoe'; import * as _ from 'lodash'; -import {getAttributes} from '../../src/model/column/attribute-service'; +import { getAttributes } from '../../src/model/column/attribute-service'; use(chaiAsPromised); -/* tslint:disable:max-classes-per-file */ - describe('table_column', () => { - let sequelize; const expectedUserAttributes: ModelAttributes = { id: { primaryKey: true, autoIncrement: true, - type: DataType.INTEGER + type: DataType.INTEGER, }, uuidv1: { type: DataType.UUID, - defaultValue: DataType.UUIDV1 + defaultValue: DataType.UUIDV1, }, uuidv4: { type: DataType.UUID, unique: true, - defaultValue: DataType.UUIDV4 + defaultValue: DataType.UUIDV4, }, username: { - type: DataType.STRING + type: DataType.STRING, }, username2: { - type: DataType.STRING(5) + type: DataType.STRING(5), }, aNumber: { - type: DataType.INTEGER + type: DataType.INTEGER, }, bNumber: { - type: DataType.INTEGER + type: DataType.INTEGER, }, isAdmin: { - type: DataType.BOOLEAN + type: DataType.BOOLEAN, }, isSuperUser: { type: DataType.BOOLEAN, defaultValue: false, - allowNull: false + allowNull: false, }, touchedAt: { type: DataType.DATE, - defaultValue: DataType.NOW + defaultValue: DataType.NOW, }, birthDate: { - type: DataType.DATE + type: DataType.DATE, }, dateAllowNullTrue: { allowNull: true, - type: DataType.DATE + type: DataType.DATE, }, name: { - type: DataType.STRING + type: DataType.STRING, }, bio: { - type: DataType.TEXT + type: DataType.TEXT, }, email: { - type: DataType.STRING - } + type: DataType.STRING, + }, }; - before(() => sequelize = createSequelize()); + before(() => (sequelize = createSequelize())); - beforeEach(() => sequelize.sync({force: true})); + beforeEach(() => sequelize.sync({ force: true })); describe('define options', () => { - it('should be retrievable from class prototype', () => { const userDefineOptions = getOptions(User.prototype); expect(userDefineOptions).not.to.be.undefined; @@ -109,11 +105,9 @@ describe('table_column', () => { expect(shoeDefineOptions).to.have.property('tableName', SHOE_TABLE_NAME); }); - }); describe('attribute options', () => { - it('should be retrievable from class prototype', () => { const attributes = getAttributes(User.prototype); @@ -128,56 +122,43 @@ describe('table_column', () => { }); it('should have annotated attributes', () => { - const attributes = getAttributes(User.prototype); - Object - .keys(expectedUserAttributes) - .forEach(key => { - - expect(attributes).to.have.property(key); - - Object - .keys(expectedUserAttributes[key]) - .forEach(attrOptionKey => { - - try { - - expect(attributes[key]).to.have.property(attrOptionKey).that.eql(expectedUserAttributes[key][attrOptionKey]); - } catch (e) { - - e.message += ` for property "${key}"`; - throw e; - } - }); + Object.keys(expectedUserAttributes).forEach((key) => { + expect(attributes).to.have.property(key); + + Object.keys(expectedUserAttributes[key]).forEach((attrOptionKey) => { + try { + expect(attributes[key]) + .to.have.property(attrOptionKey) + .that.eql(expectedUserAttributes[key][attrOptionKey]); + } catch (e) { + e.message += ` for property "${key}"`; + throw e; + } }); + }); }); }); describe('rawAttributes', () => { - let rawAttributes; - before(() => rawAttributes = User['rawAttributes']); + before(() => (rawAttributes = User['rawAttributes'])); it('should have annotated attributes', () => { - - Object - .keys(expectedUserAttributes) - .forEach(key => { - expect(rawAttributes).to.have.property(key); - }); + Object.keys(expectedUserAttributes).forEach((key) => { + expect(rawAttributes).to.have.property(key); + }); }); it('should not have attributes, that are note annotated by column decorator', () => { - expect(rawAttributes).not.to.have.property('extraField'); expect(rawAttributes).not.to.have.property('extraField2'); expect(rawAttributes).not.to.have.property('extraField3'); }); it('should have passed attribute options', () => { - const uidv1SeqRawAttrOptions = rawAttributes.uuidv1; expect(uidv1SeqRawAttrOptions).to.have.property('type'); @@ -192,18 +173,30 @@ describe('table_column', () => { expect(uidv4SeqRawAttrOptions).to.have.property('defaultValue'); expect(uidv4SeqRawAttrOptions.defaultValue).to.be.an.instanceof(DataType.UUIDV4); }); - }); describe('column', () => { + it('should infer the correct data type for bigint', () => { + @Table + class BigIntModel extends Model { + @PrimaryKey + @AutoIncrement + @Column + id: bigint; + } - it('should create appropriate sql query', () => { + sequelize.addModels([BigIntModel]); - const seq = createSequelize(false); + const attributes = getAttributes(BigIntModel.prototype); - @Table({timestamps: false}) - class Bottle extends Model { + expect(attributes.id.type).to.equal(DataType.BIGINT); + }); + + it('should create appropriate sql query', () => { + const seq = createSequelize(false); + @Table({ timestamps: false }) + class Bottle extends Model { @Column(DataType.STRING(5)) brand: string; @@ -218,23 +211,23 @@ describe('table_column', () => { seq.addModels([Bottle]); return Bottle.sync({ - force: true, logging: _.after(2, _.once((sql) => { - - // tslint:disable:max-line-length - expect(sql).to.match(/CREATE TABLE IF NOT EXISTS `Bottles` \(`id` INTEGER PRIMARY KEY AUTOINCREMENT, `brand` VARCHAR\(5\), `key` CHAR\(2\), `num` INTEGER\(100\)\)/); - })) + force: true, + logging: _.after( + 2, + _.once((sql) => { + expect(sql).to.match( + /CREATE TABLE IF NOT EXISTS `Bottles` \(`id` INTEGER PRIMARY KEY AUTOINCREMENT, `brand` VARCHAR\(5\), `key` CHAR\(2\), `num` INTEGER\(100\)\)/ + ); + }) + ), }); }); - }); describe('accessors', () => { - describe('get', () => { - @Table - class User extends Model { - + class User extends Model { @Column get name(): string { return 'My name is ' + this.getDataValue('name'); @@ -248,15 +241,13 @@ describe('table_column', () => { before(() => sequelize.addModels([User])); it('should consider getter', () => { - const user = new User({}); user.name = 'Peter'; expect(user.name).to.equal('My name is Peter'); }); - it('shouldn\'t store value from getter into db', () => { - + it("shouldn't store value from getter into db", () => { const user = new User({}); user.name = 'elli'; @@ -264,19 +255,15 @@ describe('table_column', () => { return user .save() .then(() => User.findByPk(user.id)) - .then(_user => { - + .then((_user) => { expect(_user.getDataValue('name')).to.equal('elli'); }); }); - }); describe('set', () => { - @Table - class User extends Model { - + class User extends Model { @Column get name(): string { return this.getDataValue('name'); @@ -290,7 +277,6 @@ describe('table_column', () => { before(() => sequelize.addModels([User])); it('should consider setter', () => { - const name = 'Peter'; const user = new User({}); @@ -300,7 +286,6 @@ describe('table_column', () => { }); it('should store value from setter into db', () => { - const name = 'elli'; const user = new User({}); @@ -309,14 +294,10 @@ describe('table_column', () => { return user .save() .then(() => User.findByPk(user.id)) - .then(_user => { - + .then((_user) => { expect(_user.getDataValue('name')).to.equal(name.toUpperCase()); }); }); - }); - }); - }); diff --git a/test/specs/unique.spec.ts b/test/specs/unique.spec.ts index 6849ff9f..da148b5a 100644 --- a/test/specs/unique.spec.ts +++ b/test/specs/unique.spec.ts @@ -1,42 +1,35 @@ -import {getAttributes, Model, Sequelize} from "../../src"; -import {Op} from "sequelize"; -import {expect} from "chai"; -import {Table} from "../../src/model/table/table"; -import {Column} from "../../src/model/column/column"; -import {Unique} from "../../src/model/column/column-options/unique"; +import { getAttributes, Model, Sequelize } from '../../src'; +import { expect } from 'chai'; +import { Table } from '../../src/model/table/table'; +import { Column } from '../../src/model/column/column'; +import { Unique } from '../../src/model/column/column-options/unique'; describe('unique decorator', () => { - - let sequelize; let User; before(() => { @Table - class UserModel extends Model { + class UserModel extends Model { @Unique('test') @Column name: string; @Unique @Column key: string; } User = UserModel; - sequelize = new Sequelize({ - operatorsAliases: Op, + new Sequelize({ dialect: 'sqlite', storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), + logging: !('DISABLE_LOGGING' in process.env), models: [User], }); }); it('should set advanced unique options', () => { const attributes = getAttributes(User.prototype); - expect(attributes).to.have.property('name') - .which.has.property('unique', 'test'); + expect(attributes).to.have.property('name').which.has.property('unique', 'test'); }); it('should enable unique options', () => { const attributes = getAttributes(User.prototype); - expect(attributes).to.have.property('key') - .which.has.property('unique', true); + expect(attributes).to.have.property('key').which.has.property('unique', true); }); - }); diff --git a/test/specs/utils/array.spec.ts b/test/specs/utils/array.spec.ts index 3e585b7d..fad2f8ba 100644 --- a/test/specs/utils/array.spec.ts +++ b/test/specs/utils/array.spec.ts @@ -1,29 +1,20 @@ -import {expect} from 'chai'; -import {unique} from '../../../src/shared/array'; - -/* tslint:disable:max-classes-per-file */ +import { expect } from 'chai'; +import { unique } from '../../../src/shared/array'; describe('utils', () => { - describe('array', () => { - describe('unique', () => { - const duplicates = [1, 'a', 'b', 1, 'a', 'c', 2, 'd', 'b', 2, 3, 'd', 'b']; it('should not throw', () => { - expect(() => unique(duplicates)).not.to.throw(); }); it('should remove duplicates from array', () => { - const unified = unique(duplicates); expect(unified).to.have.property('length', 7); }); - }); - }); }); diff --git a/test/specs/utils/data-type.spec.ts b/test/specs/utils/data-type.spec.ts index 6b70bc3e..756448de 100644 --- a/test/specs/utils/data-type.spec.ts +++ b/test/specs/utils/data-type.spec.ts @@ -1,26 +1,16 @@ -import {expect} from 'chai'; -import {DataType} from "../../../src/sequelize/data-type/data-type"; -import {inferDataType, isDataType} from '../../../src/sequelize/data-type/data-type-service'; - -/* tslint:disable:max-classes-per-file */ +import { expect } from 'chai'; +import { DataType } from '../../../src/sequelize/data-type/data-type'; +import { inferDataType, isDataType } from '../../../src/sequelize/data-type/data-type-service'; describe('utils', () => { - describe('data-type', () => { - describe('isDataType', () => { - it('should return true', () => { - - Object - .keys(DataType) - .forEach(key => { - - if (key.toUpperCase() === key) { - - expect(isDataType(DataType[key])).to.be.true; - } - }); + Object.keys(DataType).forEach((key) => { + if (key.toUpperCase() === key) { + expect(isDataType(DataType[key])).to.be.true; + } + }); expect(isDataType(DataType.STRING(55))).to.be.true; expect(isDataType(DataType.ENUM('a', 'b'))).to.be.true; @@ -29,17 +19,18 @@ describe('utils', () => { }); it('should return false', () => { - - expect(isDataType(function(): void {})).to.be.false; + expect( + isDataType(function (): void { + //function + }) + ).to.be.false; expect(isDataType(() => null)).to.be.false; expect(isDataType({})).to.be.false; }); }); describe('inferDataType', () => { - it('should return appropriate sequelize data type', () => { - expect(inferDataType(Number)).to.equal(DataType.INTEGER); expect(inferDataType(Boolean)).to.equal(DataType.BOOLEAN); expect(inferDataType(Date)).to.equal(DataType.DATE); @@ -47,9 +38,12 @@ describe('utils', () => { }); it('should return undefined', () => { - expect(inferDataType('abc')).to.be.undefined; - expect(inferDataType(function(): void {})).to.be.undefined; + expect( + inferDataType(function (): void { + // function + }) + ).to.be.undefined; expect(inferDataType(() => null)).to.be.undefined; expect(inferDataType({})).to.be.undefined; expect(inferDataType(class hey {})).to.be.undefined; diff --git a/test/specs/utils/object.spec.ts b/test/specs/utils/object.spec.ts index f20f1039..7e8f475a 100644 --- a/test/specs/utils/object.spec.ts +++ b/test/specs/utils/object.spec.ts @@ -1,84 +1,72 @@ -import {expect} from 'chai'; -import {deepAssign} from '../../../src/shared/object'; - -/* tslint:disable:max-classes-per-file */ +import { expect } from 'chai'; +import { deepAssign } from '../../../src/shared/object'; +import { addScopeOptions } from '../../../src/scopes/scope-service'; describe('utils', () => { - describe('object', () => { - describe('deepAssign', () => { - const childSourceF = {}; - const childSourceA = {f: childSourceF}; + const childSourceA = { f: childSourceF }; const childSourceB = {}; - const source1 = {a: childSourceA, b: childSourceB, c: 1, d: 'd', over: 'ride', regex: /reg/gim, notNull: null}; + const source1 = { + a: childSourceA, + b: childSourceB, + c: 1, + d: 'd', + over: 'ride', + regex: /reg/gim, + notNull: null, + }; const source2 = { e: 'für elisa', g: () => null, - arr: [{h: 1}, {}, 'e'], + arr: [{ h: 1 }, {}, 'e'], over: 'ridden', nullable: null, - notNull: 'notNull' + notNull: 'notNull', }; const sourceKeys = [].concat(Object.keys(source1), Object.keys(source2)); it('should not be undefined', () => { - const copy = deepAssign({}, source1, source2); expect(copy).not.to.be.undefined; }); it('should have all keys of sources', () => { - const copy = deepAssign({}, source1, source2); - sourceKeys - .forEach(key => expect(copy).to.have.property(key)) - ; + sourceKeys.forEach((key) => expect(copy).to.have.property(key)); }); it('should override previous properties', () => { - const copy = deepAssign({}, source1, source2); expect(copy).to.have.property('over', 'ridden'); }); it('should have all primitive & function values of sources', () => { - const copy = deepAssign({}, source1, source2); - sourceKeys - .forEach(key => { - - if (typeof copy[key] !== 'object') { - - expect(copy[key]).to.equal(source2[key] || source1[key]); - } - }) - ; + sourceKeys.forEach((key) => { + if (typeof copy[key] !== 'object') { + expect(copy[key]).to.equal(source2[key] || source1[key]); + } + }); }); it('should have copies of all non-primitive values of sources', () => { - const copy = deepAssign({}, source1, source2); - sourceKeys - .forEach(key => { - - if (typeof copy[key] === 'object' && copy[key] !== null) { - - expect(copy[key]).not.to.equal(source1[key] || source2[key]); - expect(copy[key]).to.eql(source1[key] || source2[key]); - } - }) - ; + sourceKeys.forEach((key) => { + if (typeof copy[key] === 'object' && copy[key] !== null) { + expect(copy[key]).not.to.equal(source1[key] || source2[key]); + expect(copy[key]).to.eql(source1[key] || source2[key]); + } + }); }); it('should have copies of child source', () => { - const copy = deepAssign({}, source1, source2); expect(copy.a).to.have.property('f'); @@ -87,21 +75,17 @@ describe('utils', () => { }); it('should have copy of array items', () => { - const copy = deepAssign({}, source1, source2); expect(copy.arr).to.be.an('array'); copy.arr.forEach((value, index) => { - const isObject = typeof value === 'object'; if (isObject) { expect(value).not.to.equal(source2.arr[index]); expect(value).to.eql(source2.arr[index]); - } else { - expect(value).to.equal(source2.arr[index]); } }); @@ -112,33 +96,37 @@ describe('utils', () => { expect(copy.nullable).to.equals(null); expect(copy.notNull).to.not.equals(null); - }); it('should keep prototype chain', () => { class Test { protoFn(): any { + // protoFn } } - const copy = deepAssign({}, {test: new Test()}); + const copy = deepAssign({}, { test: new Test() }); - expect(copy.test) - .to.have.property('protoFn') - .that.is.a('function'); + expect(copy.test).to.have.property('protoFn').that.is.a('function'); + }); + + it('ignore prototype property', () => { + const BAD_JSON = JSON.parse('{"__proto__":{"polluted":true}}'); + const empty_scope = {}; + + addScopeOptions(empty_scope, BAD_JSON); + expect(empty_scope).not.to.have.property('polluted'); }); if (Object.getOwnPropertySymbols) { it('should copy symbol based objects', () => { const symbol = Symbol('test'); const value = 'test'; - const copy = deepAssign({}, {[symbol]: value}); + const copy = deepAssign({}, { [symbol]: value }); expect(copy[symbol]).to.equal(value); }); } - }); - }); }); diff --git a/test/specs/utils/string.spec.ts b/test/specs/utils/string.spec.ts index fe4bfd65..4799574e 100644 --- a/test/specs/utils/string.spec.ts +++ b/test/specs/utils/string.spec.ts @@ -1,29 +1,20 @@ -import {expect} from 'chai'; -import {capitalize} from '../../../src/shared/string'; - -/* tslint:disable:max-classes-per-file */ +import { expect } from 'chai'; +import { capitalize } from '../../../src/shared/string'; describe('utils', () => { - describe('string', () => { - describe('capitalize', () => { - it('should not throw', () => { - const value = 'abc'; expect(() => capitalize(value)).not.to.throw(); }); it('should capitalize specified value', () => { - const value = 'abc'; expect(capitalize(value)).to.equal('Abc'); }); - }); - }); }); diff --git a/test/specs/validation.spec.ts b/test/specs/validation.spec.ts index 0408d7c2..92bfe1f0 100644 --- a/test/specs/validation.spec.ts +++ b/test/specs/validation.spec.ts @@ -1,58 +1,66 @@ -/* tslint:disable:max-classes-per-file */ - -import {expect, use} from 'chai'; +import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {ModelValidateOptions} from "sequelize"; -import {createSequelize, createSequelizeValidationOnly} from "../utils/sequelize"; +import { ModelValidateOptions } from 'sequelize'; +import { createSequelize, createSequelizeValidationOnly } from '../utils/sequelize'; import { - ShoeWithValidation, KEY_VALUE, PARTIAL_SPECIAL_VALUE, BRAND_LENGTH, - hexColor, HEX_REGEX, PRODUCED_AT_IS_AFTER, PRODUCED_AT_IS_BEFORE, UUID_VERSION, MAX, MIN, NOT, IS_IN, NOT_CONTAINS -} from "../models/ShoeWithValidation"; -import {Is} from "../../src/validation/is"; -import {Model} from "../../src/model/model/model"; -import {Table} from "../../src/model/table/table"; -import {Column} from "../../src/model/column/column"; -import {Length} from "../../src/validation/length"; -import {NotEmpty} from "../../src/validation/not-empty"; -import {Validator} from '../../src/validation/validator'; + ShoeWithValidation, + KEY_VALUE, + PARTIAL_SPECIAL_VALUE, + BRAND_LENGTH, + hexColor, + HEX_REGEX, + PRODUCED_AT_IS_AFTER, + PRODUCED_AT_IS_BEFORE, + UUID_VERSION, + MAX, + MIN, + NOT, + IS_IN, + NOT_CONTAINS, +} from '../models/ShoeWithValidation'; +import { Is } from '../../src/validation/is'; +import { Model } from '../../src/model/model/model'; +import { Table } from '../../src/model/table/table'; +import { Column } from '../../src/model/column/column'; +import { Length } from '../../src/validation/length'; +import { NotEmpty } from '../../src/validation/not-empty'; +import { Validator } from '../../src/validation/validator'; use(chaiAsPromised); describe('validation', () => { - let sequelize; - before(() => sequelize = createSequelize()); + before(() => (sequelize = createSequelize())); - beforeEach(() => sequelize.sync({force: true})); + beforeEach(() => sequelize.sync({ force: true })); describe(`rawAttributes of ${ShoeWithValidation.name}`, () => { - let rawAttributes; const shoeAttributes: { [key: string]: ModelValidateOptions } = { id: { - isUUID: UUID_VERSION + isUUID: UUID_VERSION, }, key: { - equals: KEY_VALUE + equals: KEY_VALUE, }, special: { - contains: PARTIAL_SPECIAL_VALUE + contains: PARTIAL_SPECIAL_VALUE, }, brand: { - len: [BRAND_LENGTH.min, BRAND_LENGTH.max] + len: [BRAND_LENGTH.min, BRAND_LENGTH.max], }, brandUrl: { - isUrl: true + isUrl: true, }, primaryColor: { - isHexColor: hexColor + isHexColor: hexColor, }, secondaryColor: { - isHexColor: hexColor + isHexColor: hexColor, }, tertiaryColor: { - is: HEX_REGEX + is: HEX_REGEX, }, producedAt: { isDate: true, @@ -79,35 +87,26 @@ describe('validation', () => { notIn: IS_IN, notContains: NOT_CONTAINS, isArray: true, - } + }, }; - before(() => rawAttributes = ShoeWithValidation['rawAttributes']); + before(() => (rawAttributes = ShoeWithValidation['rawAttributes'])); it(`should have properties with defined validations`, () => { - Object - .keys(shoeAttributes) - .forEach(key => { - - - expect(rawAttributes[key]).to.have.property('validate'); - const validations = shoeAttributes[key]; - - Object - .keys(validations) - .forEach(validateKey => { - - expect(rawAttributes[key].validate).to.have.property(validateKey) - .that.eqls(validations[validateKey]); - }); - + Object.keys(shoeAttributes).forEach((key) => { + expect(rawAttributes[key]).to.have.property('validate'); + const validations = shoeAttributes[key]; + + Object.keys(validations).forEach((validateKey) => { + expect(rawAttributes[key].validate) + .to.have.property(validateKey) + .that.eqls(validations[validateKey]); }); + }); }); - }); describe('validation', () => { - const data: { [key: string]: { valid: any[]; invalid: any[] } } = { id: { valid: ['903830b8-4dcc-4f10-a5aa-35afa8445691', null, undefined], @@ -122,7 +121,7 @@ describe('validation', () => { `abc${PARTIAL_SPECIAL_VALUE}`, `abc${PARTIAL_SPECIAL_VALUE}def`, `${PARTIAL_SPECIAL_VALUE}def`, - `_${PARTIAL_SPECIAL_VALUE}_` + `_${PARTIAL_SPECIAL_VALUE}_`, ], invalid: ['', 'ad', '1234567891234567', 2], }, @@ -156,205 +155,198 @@ describe('validation', () => { const invalidPromises: Array> = []; before(() => { - Object - .keys(data) - .forEach(key => { - - const valid = data[key].valid; - const invalid = data[key].invalid; - - validPromises.push(Promise.all(valid.map(value => { - - const shoe = new ShoeWithValidation({[key]: value}); - - return expect(shoe.validate()).to.be.fulfilled; - }))); - - invalidPromises.push(Promise.all(invalid.map(value => { - - const shoe = new ShoeWithValidation({[key]: value}); - - return expect(shoe.validate()).to.be.rejected; - }))); - - }); + Object.keys(data).forEach((key) => { + const valid = data[key].valid; + const invalid = data[key].invalid; + + validPromises.push( + Promise.all( + valid.map((value) => { + const shoe = new ShoeWithValidation({ [key]: value }); + + return expect(shoe.validate()).to.be.fulfilled; + }) + ) + ); + + invalidPromises.push( + Promise.all( + invalid.map((value) => { + const shoe = new ShoeWithValidation({ [key]: value }); + + return expect(shoe.validate()).to.be.rejected; + }) + ) + ); + }); }); it(`should not throw due to valid values`, () => Promise.all(validPromises)); it(`should throw due to invalid values`, () => Promise.all(invalidPromises)); - }); describe('decorators', () => { - describe('Is', () => { - it('Should throw due to missing name of function', () => { expect(() => Is(() => null)).to.throw(/Passed validator function must have a name/); }); - }); describe('Length', () => { - it('should not produce an error', () => { @Table - class User extends Model { - @Length({min: 0, max: 5}) @Column name: string; + class User extends Model { + @Length({ min: 0, max: 5 }) @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: 'elisa'}); + const user = new User({ name: 'elisa' }); return expect(user.validate()).to.be.not.rejected; }); it('should produce an error due to unfulfilled max', () => { @Table - class User extends Model { - @Length({min: 0, max: 5}) @Column name: string; + class User extends Model { + @Length({ min: 0, max: 5 }) @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: 'elisa tree'}); + const user = new User({ name: 'elisa tree' }); return expect(user.validate()).to.be.rejected; }); it('should produce an error due to unfulfilled min', () => { @Table - class User extends Model { - @Length({min: 5, max: 5}) @Column name: string; + class User extends Model { + @Length({ min: 5, max: 5 }) @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: 'elli'}); + const user = new User({ name: 'elli' }); return expect(user.validate()).to.be.rejected; }); it('should not produce an error (max only)', () => { @Table - class User extends Model { - @Length({max: 5}) @Column name: string; + class User extends Model { + @Length({ max: 5 }) @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: 'elisa'}); + const user = new User({ name: 'elisa' }); return expect(user.validate()).to.be.not.rejected; }); it('should produce an error (max only)', () => { @Table - class User extends Model { - @Length({max: 5}) @Column name: string; + class User extends Model { + @Length({ max: 5 }) @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: 'elisa tree'}); + const user = new User({ name: 'elisa tree' }); return expect(user.validate()).to.be.rejected; }); it('should not produce an error (min only)', () => { @Table - class User extends Model { - @Length({min: 4}) @Column name: string; + class User extends Model { + @Length({ min: 4 }) @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: 'elisa'}); + const user = new User({ name: 'elisa' }); return expect(user.validate()).to.be.not.rejected; }); it('should produce an error (min only)', () => { @Table - class User extends Model { - @Length({min: 5}) @Column name: string; + class User extends Model { + @Length({ min: 5 }) @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: 'elli'}); + const user = new User({ name: 'elli' }); return expect(user.validate()).to.be.rejected; }); - }); describe('NotEmpty', () => { - it('should not produce an error', () => { @Table - class User extends Model { + class User extends Model { @NotEmpty @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: 'elisa'}); + const user = new User({ name: 'elisa' }); return expect(user.validate()).to.be.not.rejected; }); it('should produce an error', () => { @Table - class User extends Model { + class User extends Model { @NotEmpty @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: ''}); + const user = new User({ name: '' }); return expect(user.validate()).to.be.rejected; }); it('should not produce an error (with msg)', () => { @Table - class User extends Model { - @NotEmpty({msg: 'NotEmpty'}) @Column name: string; + class User extends Model { + @NotEmpty({ msg: 'NotEmpty' }) @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: 'elisa'}); + const user = new User({ name: 'elisa' }); return expect(user.validate()).to.be.not.rejected; }); it('should produce an error (with msg)', () => { @Table - class User extends Model { - @NotEmpty({msg: 'NotEmpty'}) @Column name: string; + class User extends Model { + @NotEmpty({ msg: 'NotEmpty' }) @Column name: string; } const sequelizeValidationOnly = createSequelizeValidationOnly(false); sequelizeValidationOnly.addModels([User]); - const user = new User({name: ''}); + const user = new User({ name: '' }); return expect(user.validate()).to.be.rejected; }); }); describe('Validator', () => { - describe('simple model, one validator', () => { - const VALID_NAME = 'bob'; const ERROR_MESSAGE = `Invalid name: Only '${VALID_NAME}' is valid`; let _sequelize; @Table - class User extends Model { + class User extends Model { @Column name: string; @Validator userValidator(): void { @@ -365,26 +357,24 @@ describe('validation', () => { } before(() => { - _sequelize = createSequelize({modelPaths: []}); + _sequelize = createSequelize({ modelPaths: [] }); _sequelize.addModels([User]); }); it('should throw', () => { - const user = new User({name: 'will'}); + const user = new User({ name: 'will' }); return expect(user.validate()).to.be.rejected; }); it('should not throw', () => { - const user = new User({name: VALID_NAME}); + const user = new User({ name: VALID_NAME }); return expect(user.validate()).to.be.fulfilled; }); - }); describe('simple model, multiple validators', () => { - const VALID_NAME = 'bob'; const NAME_ERROR_MESSAGE = `Invalid name: Only '${VALID_NAME}' is valid`; const VALID_AGE = 99; @@ -392,7 +382,7 @@ describe('validation', () => { let _sequelize; @Table - class User extends Model { + class User extends Model { @Column name: string; @Column age: number; @@ -410,41 +400,34 @@ describe('validation', () => { } before(() => { - _sequelize = createSequelize({modelPaths: []}); + _sequelize = createSequelize({ modelPaths: [] }); _sequelize.addModels([User]); }); it('should have metadata for multiple validators', () => { - const {validate} = Reflect.getMetadata('sequelize:options', User.prototype); + const { validate } = Reflect.getMetadata('sequelize:options', User.prototype); expect(validate).to.have.property('nameValidator'); expect(validate).to.have.property('ageValidator'); }); it('should throw due to wrong name', () => { - const user = new User({name: 'will', age: VALID_AGE}); + const user = new User({ name: 'will', age: VALID_AGE }); return expect(user.validate()).to.be.rejectedWith(NAME_ERROR_MESSAGE); }); it('should throw due to wrong age', () => { - const user = new User({name: VALID_NAME, age: 1}); + const user = new User({ name: VALID_NAME, age: 1 }); return expect(user.validate()).to.be.rejectedWith(AGE_ERROR_MESSAGE); }); - }); - }); - }); describe('only', () => { - it('should not throw', () => { - expect(() => createSequelizeValidationOnly()).not.to.throw(); }); - }); - }); diff --git a/test/types/attributes.spec.ts b/test/types/attributes.spec.ts new file mode 100644 index 00000000..2bda40de --- /dev/null +++ b/test/types/attributes.spec.ts @@ -0,0 +1,83 @@ +// Types only test. This should compile successfully. + +import { Optional } from 'sequelize'; +import { + AutoIncrement, + BelongsTo, + BelongsToMany, + ForeignKey, + PrimaryKey, + Sequelize, +} from '../../src/index'; +import { Column } from '../../src/model/column/column'; +import { Model } from '../../src/model/model/model'; +import { Table } from '../../src/model/table/table'; +import { DataType } from '../../src/sequelize/data-type/data-type'; + +interface PetPersonAttributes { + petId: number; + personId: number; +} + +@Table +class PetPerson extends Model { + @ForeignKey(() => Pet) + @Column + petId: number; + + @ForeignKey(() => Person) + @Column + personId: number; +} + +interface PersonAttributes { + id: number; + name: string; +} +type PersonCreationAttributes = Optional; + +@Table +export class Person extends Model { + @PrimaryKey + @AutoIncrement + @Column(DataType.INTEGER) + id: number; + + @Column(DataType.STRING) + name: string; +} + +@Table +export class Pet extends Model { + @PrimaryKey + @AutoIncrement + @Column(DataType.INTEGER) + petId: number; + + @Column(DataType.STRING) + name: string; + + // model with attributes + @BelongsToMany(() => Person, () => PetPerson) + owners: Person[]; +} + +@Table +export class Toy extends Model { + @ForeignKey(() => Pet) + @Column(DataType.INTEGER) + petId: number; + + @Column(DataType.STRING) + name: string; + + // model without attributes + @BelongsTo(() => Pet) + pet: Pet; +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +function testTypes() { + // all models should be accepted + new Sequelize().addModels([Person, Pet, PetPerson]); +} diff --git a/test/types/model.spec.ts b/test/types/model.spec.ts index 14bbf90b..8de88b3e 100644 --- a/test/types/model.spec.ts +++ b/test/types/model.spec.ts @@ -1,12 +1,25 @@ // Types only test. This should compile successfully. -import {Column} from '../../src/model/column/column'; -import {Model} from '../../src/model/model/model'; -import {Table} from '../../src/model/table/table'; -import {DataType} from '../../src/sequelize/data-type/data-type'; +import { Column } from '../../src/model/column/column'; +import { Model } from '../../src/model/model/model'; +import { Table } from '../../src/model/table/table'; +import { DataType } from '../../src/sequelize/data-type/data-type'; @Table -export class User extends Model { +export class User extends Model { @Column(DataType.ARRAY(DataType.STRING)) myCol: string[]; } + +@Table({ + hooks: { + beforeUpdate: (instance) => { + // without generic random will result in error + instance.random = 4; + }, + }, +}) +export class Post extends Model { + @Column(DataType.INTEGER) + random: number; +} diff --git a/test/types/scopes.spec.ts b/test/types/scopes.spec.ts index 7c035d63..67dfe994 100644 --- a/test/types/scopes.spec.ts +++ b/test/types/scopes.spec.ts @@ -1,11 +1,11 @@ // Types only test. This should compile successfully. -import {Column} from '../../src/model/column/column'; -import {Model} from '../../src/model/model/model'; -import {Table} from '../../src/model/table/table'; -import {DataType} from '../../src/sequelize/data-type/data-type'; -import {Scopes} from "../../src/scopes/scopes"; -import {DefaultScope} from "../../src/scopes/default-scope"; +import { Column } from '../../src/model/column/column'; +import { Model } from '../../src/model/model/model'; +import { Table } from '../../src/model/table/table'; +import { DataType } from '../../src/sequelize/data-type/data-type'; +import { Scopes } from '../../src/scopes/scopes'; +import { DefaultScope } from '../../src/scopes/default-scope'; @DefaultScope(() => ({ order: [['myCol', 'ASC']], @@ -13,10 +13,10 @@ import {DefaultScope} from "../../src/scopes/default-scope"; @Scopes(() => ({ desc: { order: [['myCol', 'DESC']], - } + }, })) @Table -export class User extends Model { +export class User extends Model { @Column(DataType.ARRAY(DataType.STRING)) myCol: string[]; } diff --git a/test/utils/association.ts b/test/utils/association.ts index d4924fac..959250bc 100644 --- a/test/utils/association.ts +++ b/test/utils/association.ts @@ -1,34 +1,31 @@ -import {expect} from 'chai'; -import {capitalize} from '../../src/shared/string'; +import { expect } from 'chai'; +import { capitalize } from '../../src/shared/string'; /** * Checks auto generated functions on targets prototype */ -export function expectAutoGeneratedFunctions(target: any, - keys: {singular: string; plural?: string}): void { - - const prefixes: {[type: string]: {singular: string[], plural: string[]}} = { +export function expectAutoGeneratedFunctions( + target: any, + keys: { singular: string; plural?: string } +): void { + const prefixes: { [type: string]: { singular: string[]; plural: string[] } } = { toMany: { singular: ['create', 'remove', 'has'], - plural: ['add', 'count', 'get', 'set', 'remove', 'has'] + plural: ['add', 'count', 'get', 'set', 'remove', 'has'], }, toOne: { singular: ['create', 'get', 'set'], - plural: [] - } + plural: [], + }, }; const finalPrefixes = prefixes[keys.plural ? 'toMany' : 'toOne']; - Object - .keys(keys) - .forEach(key => { - - finalPrefixes[key].forEach(prefix => { - - expect(target.prototype) - .to.have.property(prefix + capitalize(keys[key])) - .that.is.a('function'); - }); + Object.keys(keys).forEach((key) => { + finalPrefixes[key].forEach((prefix) => { + expect(target.prototype) + .to.have.property(prefix + capitalize(keys[key])) + .that.is.a('function'); }); + }); } diff --git a/test/utils/common.ts b/test/utils/common.ts index 0bf92c70..2868d1f0 100644 --- a/test/utils/common.ts +++ b/test/utils/common.ts @@ -1,38 +1,27 @@ -import {expect} from 'chai'; +import { expect } from 'chai'; /** * Compares instance with expected values */ -export function assertInstance(instance: any|any[], expectedValues: any|any[]): void { - +export function assertInstance(instance: any | any[], expectedValues: any | any[]): void { if (Array.isArray(expectedValues)) { - expect(instance).to.have.property('length', expectedValues.length); return instance.forEach((_instance, i) => assertInstance(_instance, expectedValues[i])); } - expect(instance) - .to.have.property('id') - .that.is.not.null; - - Object - .keys(expectedValues) - .forEach(key => { - - const value = instance[key]; - const expectedValue = expectedValues[key]; - - expect(instance).to.have.property(key) - .that.is.not.null.and.not.undefined; - - if (typeof expectedValue === 'object') { + expect(instance).to.have.property('id').that.is.not.null; - assertInstance(value, expectedValue); - } else { + Object.keys(expectedValues).forEach((key) => { + const value = instance[key]; + const expectedValue = expectedValues[key]; - expect(instance).to.have.property(key, expectedValue); - } + expect(instance).to.have.property(key).that.is.not.null.and.not.undefined; - }); + if (typeof expectedValue === 'object') { + assertInstance(value, expectedValue); + } else { + expect(instance).to.have.property(key, expectedValue); + } + }); } diff --git a/test/utils/sequelize.ts b/test/utils/sequelize.ts index 9e8a2213..7c9eb3d4 100644 --- a/test/utils/sequelize.ts +++ b/test/utils/sequelize.ts @@ -1,13 +1,13 @@ -import {Sequelize} from "../../src/sequelize/sequelize/sequelize"; -import {ModelOptions, Op} from "sequelize"; -import {SequelizeOptions} from '../../src/sequelize/sequelize/sequelize-options'; +import { Sequelize } from '../../src/sequelize/sequelize/sequelize'; +import { ModelOptions } from 'sequelize'; +import { SequelizeOptions } from '../../src/sequelize/sequelize/sequelize-options'; export function createSequelize(partialOptions: Partial): Sequelize; -export function createSequelize(useModelsInPath?: boolean, - define?: ModelOptions): Sequelize; -export function createSequelize(useModelsInPathOrPartialOptions?: boolean | Partial, - define: ModelOptions = {}): Sequelize { - +export function createSequelize(useModelsInPath?: boolean, define?: ModelOptions): Sequelize; +export function createSequelize( + useModelsInPathOrPartialOptions?: boolean | Partial, + define: ModelOptions = {} +): Sequelize { let useModelsInPath = true; let partialOptions = {}; if (typeof useModelsInPathOrPartialOptions === 'object') { @@ -17,39 +17,35 @@ export function createSequelize(useModelsInPathOrPartialOptions?: boolean | Part } return new Sequelize({ - operatorsAliases: Op, database: '__', - dialect: 'sqlite' as 'sqlite', + dialect: 'sqlite' as const, username: 'root', password: '', define, storage: ':memory:', - logging: !('SEQ_SILENT' in process.env), + logging: !('DISABLE_LOGGING' in process.env), modelPaths: useModelsInPath ? [__dirname + '/../models'] : [], ...partialOptions, }); } -export function createSequelizeValidationOnly(useModelsInPath: boolean = true): Sequelize { - +export function createSequelizeValidationOnly(useModelsInPath = true): Sequelize { return new Sequelize({ - operatorsAliases: Op, validateOnly: true, - logging: !('SEQ_SILENT' in process.env), - models: useModelsInPath ? [__dirname + '/../models'] : [] + logging: !('DISABLE_LOGGING' in process.env), + models: useModelsInPath ? [__dirname + '/../models'] : [], }); } -export function createSequelizeFromUri(useModelsInPath: boolean = true): Sequelize { +export function createSequelizeFromUri(useModelsInPath = true): Sequelize { const sequelize = new Sequelize('sqlite://'); sequelize.addModels(useModelsInPath ? [__dirname + '/../models'] : []); return sequelize; } -export function createSequelizeFromUriObject(useModelsInPath: boolean = true): Sequelize { +export function createSequelizeFromUriObject(useModelsInPath = true): Sequelize { return new Sequelize('sqlite://', { - operatorsAliases: Op, - modelPaths: useModelsInPath ? [__dirname + '/../models'] : [] + modelPaths: useModelsInPath ? [__dirname + '/../models'] : [], }); } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 79d76e6c..00000000 --- a/tslint.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "extends": "tslint:latest", - "rules": { - "arrow-parens": false, - "class-name": false, - "ban-types": false, - "no-empty": false, - "unified-signatures": false, - "no-trailing-whitespace": false, - "object-literal-sort-keys": false, - "interface-name": false, - "no-consecutive-blank-lines": false, - "no-submodule-imports": false, - "no-unused-expression": false, - "no-implicit-dependencies": [true, "dev"], - "trailing-comma": false, - "ordered-imports": false, - "max-classes-per-file": false, - "space-before-function-paren": false, - "max-line-length": false, - "member-access": false, - "no-string-literal": false, - "curly": false, - "only-arrow-functions": false, - "typedef": [ - true, - "parameter" - ], - "no-var-requires": false, - "quotemark": [ - "single" - ], - "triple-equals": true, - "member-ordering": false, - "variable-name": [ - true, - "ban-keywords", - "check-format", - "allow-leading-underscore", - "allow-pascal-case" - ] - } -}