diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..b169531c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{js,ts}] +indent_size = 2 +indent_style = space +block_comment_start = /* +block_comment = * +block_comment_end = */ + +[*.{yml,yaml}] +indent_size = 2 +indent_style = space + +[*.{md,rmd,mkd,mkdn,mdwn,mdown,markdown,litcoffee}] +tab_width = 4 +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..04c01ba7 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..1f2c029b --- /dev/null +++ b/.eslintrc @@ -0,0 +1,33 @@ +{ + "extends": "@sapphire", + "rules": { + "no-tabs": "error", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/class-literal-property-style": "off", + "padding-line-between-statements": [ + "error", + { "blankLine": "always", "prev": "*", "next": "return" }, + + { "blankLine": "always", "prev": ["const", "let", "var"], "next": "*" }, + { "blankLine": "any", "prev": ["const", "let", "var"], "next": ["const", "let", "var"] }, + + { "blankLine": "always", "prev": "directive", "next": "*" }, + { "blankLine": "any", "prev": "directive", "next": "directive" }, + + { "blankLine": "always", "prev": ["case", "default"], "next": "*" }, + + { "blankLine": "always", "prev": "block", "next": "*" }, + + { "blankLine": "always", "prev": "block-like", "next": "*" }, + + { "blankLine": "always", "prev": "for", "next": "*" }, + { "blankLine": "any", "prev": "for", "next": "for" }, + + { "blankLine": "always", "prev": "if", "next": "*" }, + { "blankLine": "any", "prev": "if", "next": "if" }, + + { "blankLine": "always", "prev": "expression", "next": "*" }, + { "blankLine": "any", "prev": "expression", "next": "expression" } + ] + } +} diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index b6d1f3d0..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "extends": "eslint:recommended", - "env": { - "node": true, - "es6": true - }, - "parserOptions": { - "ecmaVersion": 2020 - }, - "plugins": ["jest"], - "rules": { - "no-extra-parens": ["warn", "all", { - "nestedBinaryExpressions": false - }], - "valid-jsdoc": ["warn", { - "requireReturn": false, - "requireReturnDescription": false, - "preferType": { - "String": "string", - "Number": "number", - "Boolean": "boolean", - "Symbol": "symbol", - "function": "Function", - "object": "Object", - "date": "Date", - "error": "Error" - } - }], - "array-callback-return": "error", - "complexity": "off", - "curly": ["error", "multi-line", "consistent"], - "dot-location": ["error", "property"], - "dot-notation": "error", - "eqeqeq": "off", - "no-console": ["off", { "allow": ["warn", "error"] }], - "no-multi-spaces": "error", - "callback-return": "error", - "handle-callback-err": "error", - "no-path-concat": "error", - "array-bracket-spacing": "error", - "block-spacing": "error", - "brace-style": ["error", "1tbs", { "allowSingleLine": true }], - "camelcase": "error", - "comma-dangle": ["error", "always-multiline"], - "comma-spacing": "error", - "comma-style": "error", - "computed-property-spacing": "error", - "eol-last": "error", - "func-style": ["error", "declaration", { "allowArrowFunctions": true }], - "id-length": ["off"], - "indent": ["error", 2], - "key-spacing": "error", - "keyword-spacing": ["error", { - "overrides": { - "if": { "after": true }, - "for": { "after": true }, - "while": { "after": true }, - "catch": { "after": true }, - "switch": { "after": true } - } - }], - "max-depth": "error", - "max-len": ["error", 200, 2], - "max-nested-callbacks": ["error", { "max": 4 }], - "new-cap": "error", - "newline-per-chained-call": ["error", { "ignoreChainWithDepth": 6 }], - "no-lonely-if": "error", - "no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }], - "no-trailing-spaces": "error", - "no-whitespace-before-property": "error", - "object-curly-newline": "error", - "object-curly-spacing": ["error", "always"], - "operator-assignment": "error", - "operator-linebreak": ["error", "after"], - "quote-props": ["error", "as-needed"], - "quotes": ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": true }], - "semi": "error", - "space-before-blocks": "error", - "space-before-function-paren": ["error", {"anonymous": "always", "named": "never", "asyncArrow": "always"}], - "space-in-parens": "error", - "space-infix-ops": "error", - "unicode-bom": "error", - - "arrow-body-style": ["error", "as-needed"], - "arrow-spacing": "error", - "no-duplicate-imports": "error", - "prefer-arrow-callback": "warn", - "prefer-const": "error", - "prefer-destructuring": ["error", { - "VariableDeclarator": { - "array": false, - "object": true - }, - "AssignmentExpression": { - "array": true, - "object": true - } - }, { - "enforceForRenamedProperties": false - }], - "prefer-rest-params": "error", - "prefer-spread": "error", - "prefer-template": "error", - "rest-spread-spacing": "error", - "template-curly-spacing": "error" - } -} \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..74caf416 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,6 @@ +/.github/ @RealShadowNova +/.husky/ @RealShadowNova +/.vscode/ @RealShadowNova +/docs/ @RealShadowNova +/src/ @RealShadowNova +/tests/ @RealShadowNova diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..e07e7bae --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,25 @@ +# Contributing + +## Workflow + +1. Fork and clone this repository. +2. Create a new branch in your fork based off the **main** branch. +3. Make your changes, and push them. +4. Submit a Pull Request [here](https://github.com/josh-development/core/pulls)! + +## Contributing to the code + +**The issue tracker is only for issue reporting or proposals/suggestions. If you have a question, you can find us in our [Discord Server](https://discord.gg/N7ZKH3P)**. + +To contribute to this repository, feel free to create a new fork of the repository and submit a pull request. We highly suggest [ESLint](https://eslint.org) to be installed in your text editor or IDE of your choice to ensure builds from GitHub Actions do not fail. + +**_Before committing and pushing your changes, please ensure that you do not have any linting errors by running `yarn lint`!_** + +### Josh Concept Guidelines + +There are a number of guidelines considered when reviewing Pull Requests to be merged. _This is by no means an exhaustive list, but here are some things to consider before/while submitting your ideas._ + +- Everything in Josh should be generally useful for the majority of users. Don't let that stop you if you've got a good concept though, as your idea still might be a great addition. +- Everything should follow [OOP paradigms](https://en.wikipedia.org/wiki/Object-oriented_programming) and generally rely on behavior over state where possible. This abstraction, and leads to efficiency and therefore scalability. +- Everything should follow our ESLint rules as closely as possible, and should pass lint tests even if you must disable a rule for a single line. +- Scripts that are to be ran outside of the scope source files should be added to [scripts](/scripts) directory and should be in the `mjs` file format. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..7440a1df --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'weekly' + day: 'sunday' + time: '12:00' + labels: + - 'Meta: Dependencies' diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 00000000..697ad6d4 --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,177 @@ +- name: 'Bug: Already Fixed' + description: Issues that report already fixed bugs. + color: B3E88C +- name: 'Bug: Cannot Reproduce' + description: Issues that report bugs that cannot be reproduced. + color: f9d0c4 +- name: 'Bug: Confirmed' + description: Issues that report confirmed bugs. + color: f9d0c4 +- name: 'Bug: Fixed' + description: Issues that report bugs and have been fixed. + color: 00fa9a +- name: 'Bug: Fixed in main' + description: Issues that report bugs from stable, but that are fixed in main. + color: b3e88c +- name: 'Bug: Pending Response' + description: Issues that report bugs and are pending of a response from the author. + color: f9d0c4 +- name: 'Bug: Unverified' + description: Issues that report unverified bugs. Pending for inspection. + color: f9d0c4 +- name: 'hacktoberfest-accepted' + description: Issues and PRs related to Hacktoberfest. + color: EE4700 +- name: 'Meta: Bike-Shedding' + description: Issues and PRs that nit pick + color: f9253a +- name: 'Meta: BugFix' + description: PRs that fix bugs or issues. + color: 4cce4a +- name: 'Meta: Cleanup' + description: Issues and PRs related to code cleanup. + color: ffff00 +- name: 'Meta: Dependencies' + description: Issues and PRs related to dependencies. + color: ffff00 +- name: 'Meta: Documentation' + description: Issues and PRs related to documentation. + color: ffff00 +- name: 'Meta: Error Handling' + description: Issues and PRs related to error handling. + color: ffff00 +- name: 'Meta: Examples' + description: Issues and PRs related to examples. + color: ffff00 +- name: 'Meta: Feature' + description: Issues and PRs related to new features. + color: ffff00 +- name: 'Meta: GitHub' + description: Issues and PRs related to GitHub. + color: ffff00 +- name: 'Meta: Refactor' + description: Issues and PRs related to refactors. + color: ffff00 +- name: 'Meta: Typings' + description: Issues and PRs related to typings. + color: ffff00 +- name: 'Meta: V8' + description: Issues and PRs related to the V8 engine. + color: ffff00 +- name: 'Priority: Critical' + description: Issues that must be fixed or PRs that must be finished and merged with + maximum priority. + color: b60205 +- name: 'Priority: High' + description: Issues that must be fixed or PRs that must be finished and merged with + high priority. + color: d93f0b +- name: 'Priority: Medium' + description: Issues that must be fixed or PRs that must be finished and merged with + medium priority. + color: fbca04 +- name: 'Priority: Low' + description: Issues that must be fixed or PRs that must be finished and merged with + low priority. + color: 0e8a16 +- name: 'Priority: Kirito Level' + description: Issues/PR's that have a priority so low that even a quantum computer + couldn't calculate it. + color: '818181' +- name: 'SEM: Major' + description: PRs that contain breaking changes and should be released in the next + major version. + color: 9a35be +- name: 'SEM: Minor' + description: PRs that contain new features and should be released in the next minor + version. + color: d38dfa +- name: 'SEM: Patch' + description: PRs that contain bugfixes and should be released in the next patch + version. + color: 66d8eb +- name: 'SEM: N/A' + description: PRs that only contain documentation changes and do not change the api's + interface. + color: a7f9f3 +- name: 'Status: Blocked' + description: PRs that are blocked by other issues/PRs. + color: d81a0d +- name: 'Status: Denied' + description: Issues or PRs that have been denied by the team. + color: bc1202 +- name: 'Status: Duplicate' + description: Issues/PRs that are duplicated. + color: d93f0b +- name: 'Status: Help Wanted' + description: Issues that need assistance from volunteers or PRs that need help to + proceed. + color: 128A0C +- name: 'Status: Invalid' + description: Issues that will not be fixed or PRs that will not merge, e.g. due + to backwards compatibility. + color: 671df0 +- name: 'Status: Needs Docs' + description: PRs that need documentation + color: d4c5f9 +- name: 'Status: Needs Testing' + description: PRs that need testing from the author or volunteers. + color: d93f0b +- name: 'Status: Needs Typings' + description: PRs that need typings + color: d4c5f9 +- name: 'Status: Ready To Merge' + description: PRs that are ready to merge. + color: 05F541 +- name: 'Status: Review Ready' + description: PRs that are ready for author review. + color: 05F541 +- name: 'Status: Stalled' + description: Issues and PRs that are being set aside for now for rethinking + color: fbca04 +- name: 'Status: WIP' + description: Issues and PRs that are still a work in progress. + color: b60205 +- name: 'Type: Caching' + description: Issues and PRs related to caching. + color: 1d76db +- name: 'Type: Consistency' + description: Issues and PRs related to code consistency. + color: 1d76db +- name: 'Type: Dependencies' + description: Pull requests that update a dependency file + color: 0025ff +- name: 'Type: Discussion' + description: Issues that discuss a new feature, implementation, or a api's interface. + color: ffffff +- name: 'Type: Enhancement' + description: Issues and PRs related to feature enhancement. + color: 1d76db +- name: 'Type: Maintenance' + description: Issues and PRs related to the maintenance of a module. + color: 1d76db +- name: 'Type: Performance' + description: Issues and PRs related to the performance of the api's interface. + color: 1d76db +- name: 'Type: Provider' + description: Issues and PRs related to providers. + color: 1d76db +- name: 'Type: Proposal' + description: Issues that request a new feature or a change in the api's interface. + color: ffffff +- name: 'Type: Question' + description: Issues that do not belong to the Issue Tracker and should be asked + in the official Discord Server. + color: cc317c +- name: 'Type: Security' + description: Pull requests that address a security vulnerability + color: ee0701 +- name: 'Type: Sharding' + description: Issues and PRs related to sharding. + color: 1d76db +- name: 'Type: Typo' + description: Issues and PRs related to typos in the documentation or code. + color: c5def5 +- name: 'Type: Needs Rebase & Merge' + description: PRs that should be merged through the "Rebase and merge" strategy + color: 24853c diff --git a/.github/problemMatchers/eslint.json b/.github/problemMatchers/eslint.json new file mode 100644 index 00000000..eba0bf60 --- /dev/null +++ b/.github/problemMatchers/eslint.json @@ -0,0 +1,22 @@ +{ + "problemMatcher": [ + { + "owner": "eslint-stylish", + "pattern": [ + { + "regexp": "^([^\\s].*)$", + "file": 1 + }, + { + "regexp": "^\\s+(\\d+):(\\d+)\\s+(error|warning|info)\\s+(.*)\\s\\s+(.*)$", + "line": 1, + "column": 2, + "severity": 3, + "message": 4, + "code": 5, + "loop": true + } + ] + } + ] +} diff --git a/.github/problemMatchers/tsc.json b/.github/problemMatchers/tsc.json new file mode 100644 index 00000000..bbd30793 --- /dev/null +++ b/.github/problemMatchers/tsc.json @@ -0,0 +1,17 @@ +{ + "problemMatcher": [ + { + "owner": "tsc", + "pattern": [ + { + "regexp": "^(?:\\s+\\d+\\>)?([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\)\\s*:\\s+(error|warning|info)\\s+(\\w{1,2}\\d+)\\s*:\\s*(.*)$", + "file": 1, + "location": 2, + "severity": 3, + "code": 4, + "message": 5 + } + ] + } + ] +} diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml new file mode 100644 index 00000000..d0cb1954 --- /dev/null +++ b/.github/workflows/continuous-delivery.yml @@ -0,0 +1,84 @@ +name: Continuous Delivery + +on: + push: + branches: + - main + +jobs: + pre_ci: + name: Prepare CI environment + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v2 + with: + fetch-depth: 2 + - name: '[Push] Get commit message' + if: github.event_name == 'push' + id: push_get_commit_message + run: echo ::set-output name=push_commit_message::$(git log --format=%B -n 1 HEAD) + - name: '[Pull Request] Get commit message' + if: github.event_name == 'pull_request' + id: pr_get_commit_message + run: echo ::set-output name=pr_commit_message::$(git log --format=%B -n 1 HEAD^2) + - name: Add problem matchers + run: | + echo "::add-matcher::.github/problemMatchers/tsc.json" + echo "::add-matcher::.github/problemMatchers/eslint.json" + outputs: + commit_message: $( [ -z "${{ steps.pr_get_commit_message.outputs.pr_commit_message }}" ] && echo "${{ steps.push_get_commit_message.outputs.push_commit_message }}" || echo "${{ steps.pr_get_commit_message.outputs.pr_commit_message }}" ) + + Build: + name: Publish Build + runs-on: ubuntu-latest + if: "!contains(needs.pre_ci.outputs.commit_message, '[skip ci]')" + needs: pre_ci + steps: + - name: Checkout Project + uses: actions/checkout@v2 + - name: Use Node.js 16 + uses: actions/setup-node@v2 + with: + node-version: 16 + - name: Restore CI Cache + uses: actions/cache@v2.1.7 + with: + path: node_modules + key: ${{ runner.os }}-16-${{ hashFiles('**/yarn.lock') }} + - name: Install Dependencies + run: yarn --ignore-scripts --frozen-lockfile + - name: Build Code + run: yarn prepublishOnly + - name: Push Code + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + run: | + REPO="https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" + + echo -e "\n# Checkout the repo in the target branch" + TARGET_BRANCH="build" + git clone $REPO out -b $TARGET_BRANCH + + echo -e "\n# Remove any old files in the dist folder" + rm -rfv out/dist/* + + echo -e "\n# Move the generated files to the newly-checked-out repo, to be committed and pushed" + rsync -vaI package.json out/ + rsync -vaI LICENSE out/ + rsync -vaI README.md out/ + rsync -vaI dist/ out/dist + + echo -e "\n# Removing TSC incremental file" + rm -rfv out/dist/**/*.tsbuildinfo + + echo -e "\n# Commit and push" + cd out + git add --all . + git config user.name "${GITHUB_ACTOR}" + git config user.email "${GITHUB_EMAIL}" + git commit -m "build: tsc build for ${GITHUB_SHA}" || true + git push origin $TARGET_BRANCH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_ACTOR: 'github-actions[bot]' + GITHUB_EMAIL: '41898282+github-actions[bot]@users.noreply.github.com' diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml new file mode 100644 index 00000000..1f12250f --- /dev/null +++ b/.github/workflows/continuous-integration.yml @@ -0,0 +1,78 @@ +name: Continuous Integration + +on: + push: + branches: + - main + pull_request: + +jobs: + Linting: + name: Linting + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v2 + - name: Add problem matcher + run: echo "::add-matcher::.github/problemMatchers/eslint.json" + - name: Use Node.js v16 + uses: actions/setup-node@v2 + with: + node-version: 16 + - name: Restore CI Cache + uses: actions/cache@v2.1.7 + id: cache-restore + with: + path: node_modules + key: ${{ runner.os }}-16-${{ hashFiles('**/yarn.lock') }} + - name: Install Dependencies if Cache Miss + if: ${{ !steps.cache-restore.outputs.cache-hit }} + run: yarn --frozen-lockfile + - name: Run ESLint + run: yarn lint --fix=false + + Testing: + name: Unit Tests + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v2 + - name: Use Node.js v16 + uses: actions/setup-node@v2 + with: + node-version: 16 + - name: Restore CI Cache + uses: actions/cache@v2.1.7 + id: cache-restore + with: + path: node_modules + key: ${{ runner.os }}-16-${{ hashFiles('**/yarn.lock') }} + - name: Install Dependencies if Cache Miss + if: ${{ !steps.cache-restore.outputs.cache-hit }} + run: yarn --frozen-lockfile + - name: Run tests + run: yarn test --coverage + + Building: + name: Compile Source Code + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v2 + - name: Add problem matcher + run: echo "::add-matcher::.github/problemMatchers/tsc.json" + - name: Use Node.js v16 + uses: actions/setup-node@v2 + with: + node-version: 16 + - name: Restore CI Cache + uses: actions/cache@v2.1.7 + id: cache-restore + with: + path: node_modules + key: ${{ runner.os }}-16-${{ hashFiles('**/yarn.lock') }} + - name: Install Dependencies if Cache Miss + if: ${{ !steps.cache-restore.outputs.cache-hit }} + run: yarn --frozen-lockfile + - name: Build Code + run: yarn build diff --git a/.github/workflows/labelssync.yml b/.github/workflows/labelssync.yml new file mode 100644 index 00000000..ff84aff8 --- /dev/null +++ b/.github/workflows/labelssync.yml @@ -0,0 +1,19 @@ +name: Automatic Label Sync + +on: + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + +jobs: + label_sync: + name: Automatic Label Synchronization + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v2 + - name: Run Label Sync + uses: crazy-max/ghaction-github-labeler@v3 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + yaml-file: .github/labels.yml diff --git a/.gitignore b/.gitignore index 2694f582..e95ccbc4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,29 @@ -.hgignore -node_modules -.c9 -.DS_Store -Thumbs.db -data/ -config.json -.vscode -data/ -out/ -config-*.json \ No newline at end of file +# Ignore a blachole and the folder for development +node_modules/ +.vs/ + +# Ignore tsc dist folder +dist/ + +# Ignore JavaScript files +**/*.js +**/*.mjs +**/*.js.map +**/*.d.ts +!src/**/*.d.ts +**/*.tsbuildinfo +!jest.config.ts +!scripts/*.mjs + +# Ignore heapsnapshot and log files +*.heapsnapshot +*.log + +# Ignore package locks +package-lock.json + +# Ignore the GH cli downloaded by workflows +gh + +# Ignore auto-generated documentation +docs/api.json diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 00000000..31354ec1 --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 00000000..d71a03b9 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +yarn commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..209199df --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +yarn pretty-quick --staged && yarn lint-staged diff --git a/.prettierrc b/.prettierrc index 921da85e..69cdf455 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,7 +1,20 @@ { - "tabWidth": 2, + "$schema": "http://json.schemastore.org/prettierrc", + "endOfLine": "lf", + "overrides": [ + { + "files": "*.yml", + "options": { + "tabWidth": 2, + "useTabs": false + } + } + ], + "printWidth": 150, + "quoteProps": "as-needed", "semi": true, "singleQuote": true, - "trailingComma": "all", - "endOfLine": "lf" + "tabWidth": 2, + "trailingComma": "none", + "useTabs": false } diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..395e834c --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "streetsidesoftware.code-spell-checker"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..5baa34a8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + "eslint.validate": ["typescript"], + "editor.tabSize": 2, + "editor.useTabStops": false, + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "editor.codeActionsOnSave": { + "source.fixAll": true, + "source.fixAll.eslint": true, + "source.organizeImports": true + }, + "files.eol": "\n", + "typescript.tsdk": "node_modules\\typescript\\lib", + "cSpell.maxNumberOfProblems": 8, + "cSpell.numSuggestions": 24, + "cSpell.words": ["joshdb", "Évelyne", "Lachance", "Hendry", "typedoc", "realware", "commitlint", "favware", "tsbuildinfo"] +} diff --git a/README.md b/README.md index 320ae695..50656b3a 100644 --- a/README.md +++ b/README.md @@ -1,64 +1,49 @@ -# JOSH - Javascript Object Storage Helper -
-

- Discord server - NPM version - NPM downloads - Dependencies - Patreon -

-

- npm installnfo -

-
-
-

Josh Logo +![Josh Logo](https://evie.codes/josh-light.png) + +# JOSH + +**JavaScript Object Storage Helper** + +[![GitHub](https://img.shields.io/github/license/josh-development/core)](https://github.com/josh-development/core/blob/main/LICENSE.md) +[![npm](https://img.shields.io/npm/v/@joshdb/core?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@joshdb/core) + +[![Support Server](https://discord.com/api/guilds/298508738623438848/embed.png?style=banner2)](https://discord.gg/N7ZKH3P) +

-JOSH is the JavaScript Object Storage Helper - a simple, effective, and efficient database wrapper. +--- -## Documentation +## Description - * [Installation](https://josh.evie.dev/install) - * [Basic Setup](https://josh.evie.dev/usage) - * [API Reference](https://josh.evie.dev/api) - * [Examples](https://josh.evie.dev/examples) +A simple, effective, and efficient database wrapper. -## Support +## Features -Support is offered on my official [Evie.Codes Discord](https://discord.gg/N7ZKH3P). +- Written in TypeScript +- Offers CommonJS and ESM bundles +- Fully tested ## Installation +```sh +# With NPM +npm install @joshdb/core@next +# Or with Yarn +yarn add @joshdb/core@next ``` -npm i @joshdb/core -OR -yarn add @joshdb/core -``` - -JOSH does not operate on its own and requires [a provider](https://josh.evie.dev/providers/about) to connect to a database. - -### FAQs -## Who the hell is Josh? +## FAQ -I'm sure you meant *What* the hell is Josh, and it's quite simply the easiest data storage system you'll ever encounter. Josh will help you -store any JSON-based data simply, effectively, into any popuplar database back-end. +### What is Josh? -* Josh is trustworthy: He's never lost a single bit yet, and not about to start. -* Josh is dependable: As long as your database doesn't fail, Josh won't fail. -* Josh is speedy: He has a minimal footprint, walks around light a ballerina, silent as a mouse. -* Josh cares about you: He's friendly, knows his stuff, is documented well, and won't leave you in the dark. +Josh is quite simply the easiest storage system you'll ever encounter. Josh makes it simple to store any JSON-based data effectively into any popular database back-end using providers. ### Why use Josh? -The best reason to use Josh is quite simply to get a project up and running as quickly as possible with as little effort as possible when it -comes to the database interaction layer. It does this by removing the complexity of setting up an ORM or learning a database language, while -still giving you all the power it can muster. +Josh makes it extremely easy and simple to get a project up and running as quickly as possible with very little effort when it comes to the database interaction layer. It does this by removed the complexity of setting up and ORM or learning a database language, while still giving you all the power. ### When NOT to use Josh? -If you think you can do better, if you already know database interactions or ORMs, or you don't trust database wrappers made by other people... -well in any of those cases I don't even know why you're on this page, go on now, `git out --of:here` and go make some good apps, you don't need this! +If you think you can do better, if you already know database interactions or ORMs, or you don't trust database wrappers made by other people... Well, in any of those cases I don't even know why you're on this page, go on now, `git out --of:here` and go make some good applications, you don't need this! diff --git a/__tests__/index.js b/__tests__/index.js deleted file mode 100644 index 7968fc7b..00000000 --- a/__tests__/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/* global describe expect it */ -const Josh = require('./'); - -describe('Basic Initialization', () => { - it('should fail without props', () => { - expect(() => { - const josh = new Josh(); - console.log(josh); - }).toThrow(); - }); -}); diff --git a/docs.md b/docs.md deleted file mode 100644 index db4f488c..00000000 --- a/docs.md +++ /dev/null @@ -1,79 +0,0 @@ -These things are tentative. If they get posted to github, ***__DO NOT USE THEM__*** - -I mean, these are just me doing "docs-driven-development" by dumping the shit I wanna do in a markdown file, okay? - -## Observables - -Observables are objects you can *get* from the database, and edit directly without having to save them back manually. -This works through a background function that watches the value and is aware when it changed and saves it in the database. - -Caveat: Observables will consume a little bit of memory on their own - many observables may consume more than you intend. Additionally, - observables keep the data loaded into memory, and may cause memory leaks if misused. (To be verified) - -### observe -```js -const value = db.observe('myKey'); -value.thing = "blah"; -``` - -Observables should only be applied to full keys, and cannot be used on paths. - -## Serializer/Deserializer - -So, JOSH can't save "complex" objects to the database, right? Only simple JSON.stringify()able data. So, what if you have a class instance? -Like, you bot users, you want to save a channel and a message and an "entire guild" in JOSH? *_WELL YOU CAN'T_*. Except you can. Because serialization is a thing. The idea behind this is : "run this function before saving to the database, and when loading from the database". - -Serializers and deserializers must be attached to your instance before writing or reading data, otherwise they will not be applied. - -### addSerializer - -This creates a function that runs on your value when using set() and the serializer's name. It applies directly to the value, so it works on either a full value, or the value you assign to a prop, it doesn't care. The function is *named* which means you have to call it when setting. - -```js -// "whatever needs and ID" -josh.addSerializer('generic', data => data.id); - -// "some guild by ID" (the same as above, really, in this case) -josh.addSerializer('guild', data => data.id); - -// I know I need 2 things to fetch a message, store both. -josh.addSerializer('message', data => ({ id: data.id, channel: data.channel.id })); - -// guild including some custom guild property you want to add -josh.addSerializer('customguild', data => ({ - id: data.id, - settings: data.settings, - helpers: data.helper.getId() // we'll see this later in Get transforms, it's a class. -})); -``` - -### addDeserializer - -This creates a function that runs when a value is received by get(). You don't need to specify any path, since JOSH remembers what transform it used to save the data, but you do need to provide a valid function that "reverts" the set() serializer if you want your data to remain consistent. - -```js -const client = require("discord.js").Client; -const generics = require("some other thing"); -const settings = new Josh('guildsettings'); // probably the wrong syntax, right? - -// "whatever needs and ID" -josh.addDeserializer('generic', data => generics.get(data.id)); - -// "some guild by ID" (the same as above, really, in this case) -josh.addDeserializer('guild', data => client.guilds.get(data.id)); - -// I know I need 2 things to fetch a message, store both. -// josh will automatically await all transforms, by the way. Just sayin'. Use async functions if you want. -josh.addDeserializer('message', async data => client.channels.get(data.channel).fetchMessage(data.id)); - -// guild including some custom guild property you want to add -josh.addDeserializer('customguild', data => { - const guild = client.guilds.get(data.id); - guild.settings = settings.get(data.id); - guild.helpers = new Helpers(data.id); // some class instance you wouldn't be able to store yay! - return guild; -}); -``` - -## Using serializers - diff --git a/docs/api-docs.md b/docs/api-docs.md deleted file mode 100644 index bb1cb80f..00000000 --- a/docs/api-docs.md +++ /dev/null @@ -1,559 +0,0 @@ - - -## Josh -**Kind**: global class - -* [Josh](#Josh) - * [new Josh([options])](#new-josh-options) - * _instance_ - * [.keys](#Josh+keys) ⇒ Promise.<Array.String> - * [.values](#Josh+values) ⇒ Promise.<Array> - * [.size](#Josh+size) ⇒ Promise.<number> - * [.get(keyOrPath)](#Josh+get) ⇒ Promise.<\*> - * [.getMany(keys)](#Josh+getMany) ⇒ Promise.<Object> - * [.random(count)](#Josh+random) ⇒ Promise.<Object> - * [.randomKey(count)](#Josh+randomKey) ⇒ Promise.<Array.<string>> - * [.has(keyOrPath)](#Josh+has) ⇒ Promise.<boolean> - * [.set(keyOrPath, value)](#Josh+set) ⇒ [Promise.<Josh>](#Josh) - * [.setMany(data, overwrite)](#Josh+setMany) ⇒ [Promise.<Josh>](#Josh) - * [.update(keyOrPath, input)](#Josh+update) ⇒ Promise.<Object> - * [.ensure(keyOrPath, defaultValue)](#Josh+ensure) ⇒ Promise.<\*> - * [.delete(keyOrPath)](#Josh+delete) ⇒ [Promise.<Josh>](#Josh) - * [.push(keyOrPath, value, allowDupes)](#Josh+push) ⇒ [Promise.<Josh>](#Josh) - * [.remove(keyOrPath, value)](#Josh+remove) ⇒ [Promise.<Josh>](#Josh) - * [.inc(keyOrPath)](#Josh+inc) ⇒ [Promise.<Josh>](#Josh) - * [.dec(keyOrPath)](#Josh+dec) ⇒ [Promise.<Josh>](#Josh) - * [.find(pathOrFn, predicate)](#Josh+find) ⇒ Promise.<Object> - * [.filter(pathOrFn, predicate)](#Josh+filter) ⇒ Promise.<Object> - * [.map(pathOrFn)](#Josh+map) ⇒ Promise.<Array.<\*>> - * [.includes(keyOrPath, value)](#Josh+includes) ⇒ boolean - * [.some(pathOrFn, value)](#Josh+some) ⇒ boolean - * [.every(pathOrFn, value)](#Josh+every) ⇒ boolean - * [.math(keyOrPath, operation, operand, path)](#Josh+math) ⇒ [Promise.<Josh>](#Josh) - * [.autoId()](#Josh+autoId) ⇒ Promise.<string> - * [.import(data, overwrite, clear)](#Josh+import) ⇒ [Promise.<Josh>](#Josh) - * [.export()](#Josh+export) ⇒ Promise.<string> - * _static_ - * [.multi(names, options)](#Josh.multi) ⇒ Array.<Map> - - - -### new Josh([options]) -Initializes a new Josh, with options. - - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional options an configurations. | -| [options.name] | string | Required. The name of the table in which to save the data. | -| [options.provider] | string | Required. A string with the name of the provider to use. Should not be already required, as Josh takes care of doing that for you. *Must* be a valid provider that complies with the Provider API. The provider needs to be installed separately with yarn or npm. See https://josh.evie.dev/providers for details. | -| [options.ensureProps] | boolean | defaults to `true`. If enabled and an inserted value is an object, using ensure() will also ensure that every property present in the default object will be added to the value, if it's absent. | -| [options.autoEnsure] | \* | default is disabled. When provided a value, essentially runs ensure(key, autoEnsure) automatically so you don't have to. This is especially useful on get(), but will also apply on set(), and any array and object methods that interact with the database. | -| [options.serializer] | function | Optional. If a function is provided, it will execute on the data when it is written to the database. This is generally used to convert the value into a format that can be saved in the database, such as converting a complete class instance to just its ID. This function may return the value to be saved, or a promise that resolves to that value (in other words, can be an async function). | -| [options.deserializer] | function | Optional. If a function is provided, it will execute on the data when it is read from the database. This is generally used to convert the value from a stored ID into a more complex object. This function may return a value, or a promise that resolves to that value (in other words, can be an async function). | - -**Example** -```js -const Josh = require("@joshdb/core"); -const provider = require("@joshdb/sqlite"); - -// sqlite-based database, with default options -const sqliteDB = new Josh({ - name: 'mydatabase', - provider, -}); -``` - - -### josh.keys ⇒ Promise.<Array.String> -Get all the keys in the database. - -**Kind**: instance property of [Josh](#josh) -**Returns**: Promise.<Array.String> - An array of all the keys as string values. - - -### josh.values ⇒ Promise.<Array> -Get all the values in the database. - -**Kind**: instance property of [Josh](#josh) -**Returns**: Promise.<Array> - An array of all the values stored in the database. - - -### josh.size ⇒ Promise.<number> -Get the amount of rows inside the database. - -**Kind**: instance property of [Josh](#josh) -**Returns**: Promise.<number> - An integer equal to the amount of stored key/value pairs. - - -### josh.get(keyOrPath) ⇒ Promise.<\*> -Retrieves (fetches) a value from the database. If a simple key is provided, returns the value. -If a path is provided, will only return the value at that path, if it exists. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<\*> - Returns the value for the key or the value found at the specified path. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | string | Either a key, or full path, of the value you want to get. For more information on how path works, see https://josh.evie.dev/path | - - - -### josh.getMany(keys) ⇒ Promise.<Object> -Retrieve many values from the database. -If you provide `josh.all` as a value (josh being your variable for the database), the entire data set is returned. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<Object> - An object with one or many key/value pairs where the property name is the key and the property value is the database value. - -| Param | Type | Description | -| --- | --- | --- | -| keys | Array.<string> \| symbol | An array of keys to return, or `db.all` to retrieve them all. | - - - -### josh.random(count) ⇒ Promise.<Object> -Returns one or more random values from the database. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<Object> - An array of key/value pairs each in their own array. -The array of values should never contain duplicates. If the requested count is higher than the number -of rows in the database, only the available number of rows will be returned, in randomized order. -Each array element is comprised of the key and value: // TODO : FIX [['a', 1], ['b', 2], ['c', 3]] - -| Param | Type | Description | -| --- | --- | --- | -| count | number | Defaults to 1. The number of random key/value pairs to get. | - - - -### josh.randomKey(count) ⇒ Promise.<Array.<string>> -Returns one or more random keys from the database. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<Array.<string>> - An array of string keys in a randomized order. -The array of keys should never contain duplicates. If the requested count is higher than the number -of rows in the database, only the available number of rows will be returned. - -| Param | Type | Description | -| --- | --- | --- | -| count | number | Defaults to 1. The number of random key/value pairs to get. | - - - -### josh.has(keyOrPath) ⇒ Promise.<boolean> -Verifies whether a key, or a specific property of an object, exists at all. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<boolean> - Whether the key, or property specified in the path, exists. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | string | Either a key, or full path, of the value you want to get. For more information on how path works, see https://josh.evie.dev/path | - - - -### josh.set(keyOrPath, value) ⇒ [Promise.<Josh>](#Josh) -Store a value in the database. If a simple key is provided, creates or overwrites the entire value with the new one provide. -If a path is provided, and the stored value is an object, only the value at the path will be overwritten. - -**Kind**: instance method of [Josh](#josh) -**Returns**: [Promise.<Josh>](#Josh) - This database wrapper, useful if you want to chain more instructions for Josh. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | string | Either a key, or a full path, where you want to store the value. For more information on how path works, see https://josh.evie.dev/path | -| value | \* | The value to store for the key, or in the path, specified. All values MUST be "simple" javascript values: Numbers, Booleans, Strings, Arrays, Objects. If you want to store a "complex" thing such as an instance of a class, please use a Serializer to convert it to a storable value. | - - - -### josh.setMany(data, overwrite) ⇒ [Promise.<Josh>](#Josh) -Store many values at once in the database. DOES NOT SUPPORT PATHS. Or autoId. - -**Kind**: instance method of [Josh](#josh) -**Returns**: [Promise.<Josh>](#Josh) - This database wrapper, useful if you want to chain more instructions for Josh. - -| Param | Type | Description | -| --- | --- | --- | -| data | Object | The data to insert. Must be an object as key/value pairs. | -| overwrite | boolean | Whether to overwrite existing keys. Since this method does not support paths, existin data will be lost. | - -**Example** -```js -josh.setMany({ - "thinga": "majig", - "foo": "bar", - "isCool": true -}); -``` - - -### josh.update(keyOrPath, input) ⇒ Promise.<Object> -Update an object in the database with modified values. Similar to set() except it does not overwrite the entire object. -Instead, the data is *merged* with the existing object. Object properties not included in your data are not touched. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<Object> - The merged object that will be stored in the database. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | string | Either a key, or full path, of the value you want to update. | -| input | Object \| function | Either the object, or a function. If a function is provided, it will receive the *current* value as an argument. You are expected to return a modified object that will be stored in the database. | - -**Example** -```js -josh.set('thing', { - a: 1, - b: 2, - c: 3 -}); -josh.update('thing', { - a: 'one', - d: 4 -}); -// value is now {a: 'one', b: 2, c: 3, d: 4} - -josh.update('thing', (previousValue) => { - ...previousValue, - b: 'two', - e: 5, -}); -// value is now {a: 'one', b: 'two', c: 3, d: 4, e: 5} -``` - - -### josh.ensure(keyOrPath, defaultValue) ⇒ Promise.<\*> -Returns the key's value, or the default given, ensuring that the data is there. -This is a shortcut to "if josh doesn't have key, set it, then get it" which is a very common pattern. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<\*> - The value from the database for the key, or the default value provided for a new key. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | string | Either a key, or full path, of the value you want to ensure. | -| defaultValue | \* | Required. The value you want to save in the database and return as default. | - -**Example** -```js -// Simply ensure the data exists (for using property methods): -josh.ensure("mykey", {some: "value", here: "as an example"}); -josh.has("mykey"); // always returns true -josh.get("mykey", "here") // returns "as an example"; - -// Get the default value back in a variable: -const settings = mySettings.ensure("1234567890", defaultSettings); -console.log(settings) // josh's value for "1234567890" if it exists, otherwise the defaultSettings value. -``` - - -### josh.delete(keyOrPath) ⇒ [Promise.<Josh>](#Josh) -Remove a key/value pair, or the property and value at a specific path, or clear the database. - -**Kind**: instance method of [Josh](#josh) -**Returns**: [Promise.<Josh>](#Josh) - This database wrapper, useful if you want to chain more instructions for Josh. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | string \| symbol \| Array.<string> | Either a key, or full path, of the value you want to delete. If providing a path, only the value located at the path is deleted. If providing an array, will delete all keys in that array (does not support paths) Alternatively: josh.delete(josh.all) will clear the database of all data. | - - - -### josh.push(keyOrPath, value, allowDupes) ⇒ [Promise.<Josh>](#Josh) -Add a new value to an array. - -**Kind**: instance method of [Josh](#josh) -**Returns**: [Promise.<Josh>](#Josh) - This database wrapper, useful if you want to chain more instructions for Josh. - -| Param | Type | Default | Description | -| --- | --- | --- | --- | -| keyOrPath | string | | Either a key, or full path, where the array where you want to add a value. | -| value | \* | | The value to add to the array. | -| allowDupes | boolean | true | Whether to allow duplicate values to be added. Note that if you're pushing objects or arrays, duplicates can occur no matter what, as detecting duplicate objects is CPU-intensive. | - - - -### josh.remove(keyOrPath, value) ⇒ [Promise.<Josh>](#Josh) -Remove a value from an array, by value (simple values like strings and numbers) or function (complex values like arrays or objects). - -**Kind**: instance method of [Josh](#josh) -**Returns**: [Promise.<Josh>](#Josh) - This database wrapper, useful if you want to chain more instructions for Josh. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | \* | Either a key, or full path, where the array where you want to remove from, is stored. | -| value | \* \| function | Required. The value to remove from the array. OR a function to match a value stored in the array. If using a function, the function provides the value and must return a boolean that's true for the value you want to remove. | - -**Example** -```js -// Assuming -josh.set('array', [1, 2, 3]) -josh.set('objectarray', [{ a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 }]) - -josh.remove('array', 1); // value is now [2, 3] -josh.remove('objectarray', (value) => value.e === 5); // value is now [{ a: 1, b: 2, c: 3 }] -``` - - -### josh.inc(keyOrPath) ⇒ [Promise.<Josh>](#Josh) -Increments (adds 1 to the number) the stored value. - -**Kind**: instance method of [Josh](#josh) -**Returns**: [Promise.<Josh>](#Josh) - This database wrapper, useful if you want to chain more instructions for Josh. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | \* | Either a key, or full path, to the value you want to increment. The value must be a number. | - - - -### josh.dec(keyOrPath) ⇒ [Promise.<Josh>](#Josh) -Decrements (remove 1 from the number) the stored value. - -**Kind**: instance method of [Josh](#josh) -**Returns**: [Promise.<Josh>](#Josh) - This database wrapper, useful if you want to chain more instructions for Josh. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | \* | Either a key, or full path, to the value you want to decrement. The value must be a number. | - - - -### josh.find(pathOrFn, predicate) ⇒ Promise.<Object> -Finds a value within the database, either through an exact value match, or a function. -Useful for Objects and Array values, will not work on "simple" values like strings. -Returns the first found match - if you need more than one result, use filter() instead. -Either a function OR a value **must** be provided. -Note that using functions here currently is very inefficient, so it's suggested to use paths whenever necesary. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<Object> - Returns an array composed of the full value (NOT the one at the path!), and the key. - -| Param | Type | Description | -| --- | --- | --- | -| pathOrFn | function \| string | Mandatory. Either a function, or the path in which to find the value. If using a function: it will run on either the stored value, OR the value at the path given if it's provided. - The function receives the value (or value at the path) as well the the key currently being checked. - The function must return a boolean or truthy/falsey value! Oh and the function can be async, too ;) If using a path: - A "value" predicate is mandatory when checking by path. - The value must be simple: string, boolean, integer. It cannot be an object or array. | -| predicate | string | Optional on functions, Mandatory on path finds. If provided, the function or value acts on what's at that path. | - -**Example** -```js -// Assuming: -josh.set("john.shmidt", { - fullName: "John Jacob Jingleheimer Schmidt", - id: 12345, - user: { - username: "john.shmidt", - firstName: "john", - lastName: "shmidt", - password: "somerandombcryptstringthingy", - lastAccess: -22063545000, - isActive: false, - avatar: null, - } -}); - -// Regular string find: -josh.find("user.firstName", "john") - -// Simple function find: -josh.find(value => value.user.firstName === "john"); - -// Function find with a path: -josh.find(value => value === "john", "user.firstName"); - -// The return of all the above if the same: -{ - "john.shmidt": { - fullName: "John Jacob Jingleheimer Schmidt", - id: 12345, - user: { - username: "john.shmidt", - firstName: "john", - lastName: "shmidt", - password: "somerandombcryptstringthingy", - lastAccess: -22063545000, - isActive: false, - avatar: null, - } - } -} -``` - - -### josh.filter(pathOrFn, predicate) ⇒ Promise.<Object> -Filters for values within the database, either through an exact value match, or a function. -Useful for Objects and Array values, will not work on "simple" values like strings. -Returns all matches found - if you need a single value, use find() instead. -Either a function OR a value **must** be provided. -Note that using functions here currently is very inefficient, so it's suggested to use paths whenever necesary. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<Object> - Returns an array of key/value pair(s) that successfully passes the provided function. - -| Param | Type | Description | -| --- | --- | --- | -| pathOrFn | function \| string | Mandatory. Either a function, or the path in which to find the value. If using a function: it will run on either the stored value, OR the value at the path given if it's provided. - The function receives the value (or value at the path) as well the the key currently being checked. - The function must return a boolean or truthy/falsey value! Oh and the function can be async, too ;) If using a path: - A "value" predicate is mandatory when checking by path. - The value must be simple: string, boolean, integer. It cannot be an object or array. | -| predicate | string | Optional on functions, Mandatory on path finds. If provided, the function or value acts on what's at that path. | - - - -### josh.map(pathOrFn) ⇒ Promise.<Array.<\*>> -Maps data from each value in your data. Works similarly to Array.map(), but can use both async functions, as well as paths. -Note that using functions here currently is very inefficient, so it's suggested to use paths whenever necesary. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<Array.<\*>> - An array of values mapped from the data. - -| Param | Type | Description | -| --- | --- | --- | -| pathOrFn | function \| string | Mandatory. Either a function, or the path where to get the value from. If using a path, the value at the path will be returned, or null. If using a function, the function is run on the entire value (no path is used). The function is given the `key` and `value` as arguments, and the value returned will be accessible in the return array. | - - - -### josh.includes(keyOrPath, value) ⇒ boolean -Performs Array.includes() on a certain value. Works similarly to -[Array.includes()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes). - -**Kind**: instance method of [Josh](#josh) -**Returns**: boolean - Whether the value is included in the array. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | string | Either a key, or full path, to the array you want to check for the value. The value must be an array. | -| value | \* | Either the value to check in the array, or a function to determine the presence of the value. If using a value, note that this won't work if the value you're checking for is an array or object - use a function for that. If using a function, the function takes in the value and index, and must return a boolean true when the value is the one you want. | - -**Example** -```js -josh.set('arr', ['a', 'b', 1, 2, { foo: "bar"}]); - -josh.includes('arr', 'a'); // true -josh.includes('arr', 1) // true -josh.includes('arr', val => val.foo === 'bar'); // true -``` - - -### josh.some(pathOrFn, value) ⇒ boolean -Checks whether *at least one key* contains the expected value. The loop stops once the value is found. - -**Kind**: instance method of [Josh](#josh) -**Returns**: boolean - Whether the value was found or not (if one of the rows in the database match the value at path, or the function has returned true) - -| Param | Type | Description | -| --- | --- | --- | -| pathOrFn | string | Either a function, or the full path to the value to check against the provided value. If using a path, the value at he path will be compared to the value provided as a second argument. If using a function, the function is given the *full* value for each key, along with the key itself, for each row in the database. It should return `true` if your match is found. | -| value | string \| number \| boolean \| null | The value to be checked at each path. Cannot be an object or array (use a function for those). Ignored if a function is provided. | - - - -### josh.every(pathOrFn, value) ⇒ boolean -Checks whether *every single key* contains the expected value. Identical to josh.some() except all must match except just one. - -**Kind**: instance method of [Josh](#josh) -**Returns**: boolean - Whether the value was found or not, on ever single row. - -| Param | Type | Description | -| --- | --- | --- | -| pathOrFn | \* | Either a function, or the full path to the value to check against the provided value. If using a path, the value at he path will be compared to the value provided as a second argument. If using a function, the function is given the *full* value for each key, along with the key itself, for each row in the database. It should return `true` if your match is found. | -| value | string \| number \| boolean \| null | The value to be checked at each path. Cannot be an object or array (use a function for those). | - - - -### josh.math(keyOrPath, operation, operand, path) ⇒ [Promise.<Josh>](#Josh) -Executes a mathematical operation on a value and saves the result in the database. - -**Kind**: instance method of [Josh](#josh) -**Returns**: [Promise.<Josh>](#Josh) - This database wrapper, useful if you want to chain more instructions for Josh. - -| Param | Type | Description | -| --- | --- | --- | -| keyOrPath | string | Either a key, or full path, to the numerical value you want to exceute math on. Must be an Number value. | -| operation | string | Which mathematical operation to execute. Supports most math ops: =, -, *, /, %, ^, and english spelling of those operations. | -| operand | number | The right operand of the operation. | -| path | string | Optional. The property path to execute the operation on, if the value is an object or array. | - -**Example** -```js -// Assuming -josh.set("number", 42); -josh.set("numberInObject", {sub: { anInt: 5 }}); - -josh.math("number", "/", 2); // 21 -josh.math("number", "add", 5); // 26 -josh.math("number", "modulo", 3); // 2 -josh.math("numberInObject.sub.anInt", "+", 10); // 15 -``` - - -### josh.autoId() ⇒ Promise.<string> -Get an automatic ID for insertion of a new record. - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<string> - A unique ID to insert data. -**Example** -```js -const Josh = require("@joshdb/core"); -const provider = require("@joshdb/sqlite"); - - -const sqliteDB = new Josh({ - name: 'mydatabase', - provider, -}); -(async() => { - const newId = await sqliteDB.autoId(); - console.log("Inserting new row with ID: ", newID); - sqliteDB.set(newId, "This is a new test value"); -})(); -``` - - -### josh.import(data, overwrite, clear) ⇒ [Promise.<Josh>](#Josh) -Import an existing json export from josh or enmap. This data must have been exported from josh or enmap, -and must be from a version that's equivalent or lower than where you're importing it. - -**Kind**: instance method of [Josh](#josh) -**Returns**: [Promise.<Josh>](#Josh) - This database wrapper, useful if you want to chain more instructions for Josh. - -| Param | Type | Default | Description | -| --- | --- | --- | --- | -| data | string | | The data to import to Josh. Must contain all the required fields provided by export() | -| overwrite | boolean | true | Defaults to `true`. Whether to overwrite existing key/value data with incoming imported data | -| clear | boolean | false | Defaults to `false`. Whether to clear the enmap of all data before importing (**__WARNING__**: Any exiting data will be lost! This cannot be undone.) | - - - -### josh.export() ⇒ Promise.<string> -Exports your entire database in JSON format. Useable as import data for both Josh and Enmap. -***WARNING: This currently requires loading the entire database in memory to write to JSON and might fail on large datasets (more than 1Gb)*** - -**Kind**: instance method of [Josh](#josh) -**Returns**: Promise.<string> - A JSON string that can be saved wherever you need it. -**Example** -```js -const fs = require("fs"); -josh.export().then(data => fs.writeFileSync("./export.json"), data)); -``` - - -### Josh.multi(names, options) ⇒ Array.<Map> -Initialize multiple Josh instances easily. Used to simplify the creation of many tables - -**Kind**: static method of [Josh](#josh) -**Returns**: Array.<Map> - An array of initialized Josh instances. - -| Param | Type | Description | -| --- | --- | --- | -| names | Array.<string> | Array of strings. Each array entry will create a separate josh with that name. | -| options | Object | Options object to pass to each josh, excluding the name.. | - -**Example** -```js -// Using local variables. -const Josh = require('josh'); -const provider = require("@joshdb/sqlite"); -const { settings, tags, blacklist } = Josh.multi(['settings', 'tags', 'blacklist'], { provider }); - -// Attaching to an existing object (for instance some API's client) -const Josh = require("@joshdb/core"); -const provider = require("@joshdb/sqlite"); -Object.assign(client, Josh.multi(["settings", "tags", "blacklist"], { provider })); -``` diff --git a/docs/build.js b/docs/build.js deleted file mode 100644 index 7c71b403..00000000 --- a/docs/build.js +++ /dev/null @@ -1,52 +0,0 @@ -const jsdoc2md = require('jsdoc-to-markdown'); -const fs = require('fs'); -const slug = require('limax'); - -var htmlEntities = { - nbsp: ' ', - cent: '¢', - pound: '£', - yen: '¥', - euro: '€', - copy: '©', - reg: '®', - lt: '<', - gt: '>', - quot: '"', - amp: '&', - apos: '\'', -}; - -// eslint-disable-next-line -const unescapeHTML = str => str.replace(/\&([^;]+);/g, (entity, entityCode) => { - let match; - - if (entityCode in htmlEntities) { - return htmlEntities[entityCode]; - /* eslint no-cond-assign: 0 */ - } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) { - return String.fromCharCode(parseInt(match[1], 16)); - /* eslint no-cond-assign: 0 */ - } else if (match = entityCode.match(/^#(\d+)$/)) { - // eslint-disable-next-line - return String.fromCharCode(~~match[1]); - } else { - return entity; - } -}); - -const finalize = str => str - .replace(/\[Promise\.<Josh><\/code >\](#Josh)/gi, '[Promise.<Josh>](#josh)') - .replace(/\[Josh<\/code>\]\(#Josh\)/gi, '[Josh](#josh)') - .replace('* [new Josh([options])](#new_Josh_new)', '* [new Josh([options])](#new-josh-options)'); - -const regexread = /^ {4}\* \[\.(.*?)\]\((.*?)\)(.*?)(\(#.*?\)|)$/gm; - -// eslint-disable-next-line -const parseData = data => finalize(data.replace(regexread, (_, b, __, d) => - ` * [.${b}](#${slug(`josh.${b} ${unescapeHTML(d.replace(/<\/?code>/g, ''))}`)})${d}`)); - -jsdoc2md.render({ files: './src/index.js' }).then(data => - fs.writeFile('./docs/api-docs.md', - parseData(data), - () => false)); diff --git a/docs/guides/getting-started/GettingStarted.md b/docs/guides/getting-started/GettingStarted.md new file mode 100644 index 00000000..fea2536b --- /dev/null +++ b/docs/guides/getting-started/GettingStarted.md @@ -0,0 +1,48 @@ +# Getting Started with `@joshdb/core` + +## Installing [`@joshdb/core`](https://github.com/josh-development/core/tree/build) + +```sh +# Using NPM +npm i @joshdb/core@next +# Or using Yarn +yarn add @joshdb/core@next +``` + +Note: Josh requires you to have Node.js v16.0.0 or higher. + +## Basic Usage + +You can make use of the **Josh** class exported from `@joshdb/core` by using `import` or `require`. You can then initiate an instance very simply. Below will create an in-memory storage using the [`MapProvider`](https://github.com/josh-development/core/blob/main/src/lib/structures/defaultProvider/MapProvider.ts) + +### CommonJS + +```javascript +const { Josh } = require('@joshdb/core'); + +const josh = new Josh({ name: 'name' }); +``` + +### ESM + +```javascript +import { Josh } from '@joshdb/core'; + +const josh = new Josh({ name: 'name' }); +``` + +### TypeScript + +You can use [generics](https://www.typescriptlang.org/docs/handbook/2/generics.html) to define what type your `Josh` instance uses. + +```typescript +import { Josh } from '@joshdb/core'; + +interface User { + name: string; + + email: string; +} + +const josh = new Josh({ name: 'name' }); +``` diff --git a/docs/guides/getting-started/UsingProviders.md b/docs/guides/getting-started/UsingProviders.md new file mode 100644 index 00000000..3bcd794d --- /dev/null +++ b/docs/guides/getting-started/UsingProviders.md @@ -0,0 +1,68 @@ +# Using Providers + +## What is a provider? + +A provider is simply a layer between **Josh** and a database (or wherever data is stored). Each provider receives a payload from every method you use in your instance and returns a modified version. + +## Basic Usage + +Providers can be installed separately from Josh using Yarn or NPM. You can also create your own provider by extending the exported [`JoshProvider`](https://github.com/josh-development/core/blob/main/src/lib/structures/JoshProvider.ts) class. + +In The example below we will use the default in-memory provider which using the native [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) class. + +### CommonJS + +```javascript +const { Josh, MapProvider } = require('@joshdb/core'); + +const josh = new Josh({ + name: 'name', + provider: new MapProvider() +}); +``` + +### ESM + +```javascript +import { Josh, MapProvider } from '@joshdb/core'; + +const josh = new Josh({ + name: 'name', + provider: new MapProvider() +}); +``` + +### TypeScript + +You can use [generics](https://www.typescriptlang.org/docs/handbook/2/generics.html) to define what type your `Josh` instance uses. + +```typescript +import { Josh, MapProvider } from '@joshdb/core'; + +interface User { + name: string; + + email: string; +} + +const josh = new Josh({ + name: 'name', + provider: new MapProvider() +}); +``` + +## Provider Options + +Some providers may have options that can be passed when initiating them. These will be objects with their appropriate properties. + +Below is an example of how that might look. + +```javascript +const josh = new Josh({ + name: 'name', + provider: new Provider({ + optionOne: 'optionOne', + optionTwo: 'optionTwo' + }) +}); +``` diff --git a/docs/guides/middleware/CreatingMiddleware.md b/docs/guides/middleware/CreatingMiddleware.md new file mode 100644 index 00000000..278f3860 --- /dev/null +++ b/docs/guides/middleware/CreatingMiddleware.md @@ -0,0 +1,53 @@ +# Creating Middleware + +Now that you have the proper file structure and have an understanding of what a middleware is used for, let's get started! + +## Basic Usage + +You can make use of the **Middleware** class exported from `joshdb/core` by using `import` or `require`. + +**When using JavaScript** + +```javascript +const { Middleware } = require('@joshdb/core'); +``` + +**When using TypeScript** + +```typescript +import { Middleware } from '@joshdb/core'; +``` + +Each middleware is a class that extends the base `Middleware` class from Josh. You need to extend it. + +## Logger Middleware + +To create a middleware you need to create a file with name of the middleware, in our case `logger.js`. The path to this file would be `src/middleware/name/logger.js`. + +Below is a very simple example of a middleware class file which uses the `run` method. The `run` method runs on every **Josh** method before and after provider interaction, but _does not_ modify the payload. So even if you do modify the payload here, it will not do anything internally. + +**When using JavaScript** + +```javascript +const { Middleware } = require('@joshdb/core'); + +module.exports = class extends Middleware { + run(payload) { + console.log(payload); + } +}; +``` + +**When using TypeScript** + +```typescript +import { Middleware, Payload } = from '@joshdb/core'; + +export default class extends Middleware { + public run(payload: Payload) { + console.log(payload) + } +} +``` + +If everything was done correctly, you should now see the `payload` be logged to the console during every **Josh** method executions. diff --git a/docs/guides/middleware/GettingStarted.md b/docs/guides/middleware/GettingStarted.md new file mode 100644 index 00000000..175f956f --- /dev/null +++ b/docs/guides/middleware/GettingStarted.md @@ -0,0 +1,25 @@ +# Getting Started with Middleware + +## What is middleware? + +Middleware are simply a class that has methods to run before and after providers receive payloads from **Josh**. They make it possible to implement things like [`AutoEnsure`](https://github.com/josh-development/core/blob/main/src/middlewares/CoreAutoEnsure.ts). + +## File Structure + +Before creating any middleware, you should have a _main_ file, we'll make this `src/main.js`. + +Below is an example of what that file could look like. + +```javascript +const { Josh } = require('@joshdb/core'); + +const josh = new Josh({ name: 'name' }); +``` + +## Using middleware + +To start taking advantage of middlewares you can simply utilize the `Josh#use()` method. This method takes a single parameter being your middleware class. Below is an example. + +```javascript +josh.use(new MyMiddleware()); +``` diff --git a/index.js b/index.js deleted file mode 100644 index 61ca6575..00000000 --- a/index.js +++ /dev/null @@ -1,3 +0,0 @@ -const Josh = require('./src/index.js'); - -module.exports = Josh; diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 00000000..2f774fa1 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,15 @@ +import type { Config } from '@jest/types'; + +// eslint-disable-next-line @typescript-eslint/require-await +export default async (): Promise => ({ + displayName: 'unit test', + preset: 'ts-jest', + testEnvironment: 'node', + testRunner: 'jest-circus/runner', + testMatch: ['/tests/**/*.test.ts'], + globals: { + 'ts-jest': { + tsconfig: '/tests/tsconfig.json' + } + } +}); diff --git a/package.json b/package.json index f2a7af8f..af0bb5c3 100644 --- a/package.json +++ b/package.json @@ -1,37 +1,90 @@ { "name": "@joshdb/core", - "version": "1.2.7", - "description": "Javascript Object Storage Helper", - "main": "src/index.js", + "version": "2.0.0", + "description": "JavaScript Object Storage Helper", + "author": "Évelyne Lachance (https://evie.codes/)", + "contributors": [ + "Hezekiah Hendry ", + "DanCodes (https://dancodes.online/)", + "Wilson (https://wilson.antti.codes/)" + ], + "license": "Apache-2.0", + "private": false, + "main": "dist/index.js", + "module": "dist/index.mjs", + "browser": "dist/index.umd.js", + "unpkg": "dist/index.umd.js", + "types": "dist/index.d.ts", + "exports": { + "import": "./dist/index.mjs", + "require": "./dist/index.js" + }, "scripts": { - "test": "jest", - "docs": "node ./docs/build.js" + "clean": "rimraf dist node_modules/.cache", + "docs": "typedoc", + "lint": "eslint src tests --ext ts --fix", + "format": "prettier --write {src,tests}/**/*.ts", + "test": "jest --verbose", + "update": "yarn upgrade-interactive --latest", + "build": "rollup -c rollup.bundle.ts", + "watch": "tsc -b src -w", + "prepublishOnly": "rollup-type-bundler", + "prepare": "husky install" + }, + "dependencies": { + "@realware/utilities": "^2.0.2", + "@sapphire/utilities": "^3.2.1" + }, + "devDependencies": { + "@commitlint/cli": "^16.1.0", + "@commitlint/config-conventional": "^16.0.0", + "@favware/rollup-type-bundler": "^1.0.7", + "@sapphire/eslint-config": "^4.0.11", + "@sapphire/ts-config": "^3.1.8", + "@types/jest": "^27.0.2", + "@types/node": "^17.0.10", + "eslint": "~8.6.0", + "husky": "^7.0.4", + "jest": "^27.4.7", + "jest-circus": "^27.4.6", + "lint-staged": "^12.3.1", + "prettier": "^2.4.1", + "pretty-quick": "^3.1.1", + "rollup": "^2.66.0", + "rollup-plugin-cleaner": "^1.0.0", + "rollup-plugin-typescript2": "^0.31.1", + "rollup-plugin-version-injector": "^1.3.3", + "ts-jest": "^27.1.3", + "ts-node": "^10.4.0", + "typedoc": "^0.22.11", + "typescript": "^4.5.5" }, "repository": { "type": "git", - "url": "git+https://github.com/eslachance/josh.git" + "url": "git+https://github.com/josh-development/core.git" }, - "author": "Evelyne Lachance (https://evie.codes/)", - "license": "Apache-2.0", + "files": [ + "dist", + "!dist/*.tsbuildinfo" + ], + "engines": { + "node": ">=16", + "npm": ">=6" + }, + "keywords": [], "bugs": { - "url": "https://github.com/eslachance/josh/issues" + "url": "https://github.com/josh-development/core/issues" }, - "homepage": "https://github.com/eslachance/josh#readme", - "dependencies": { - "lodash": "^4.17.20", - "serialize-javascript": "^6.0.0" + "homepage": "https://github.com/josh-development/core", + "publishConfig": { + "access": "public" }, - "devDependencies": { - "eslint": "6.8.0", - "eslint-config-airbnb-base": "^14.2.0", - "eslint-config-standard": "^14.1.1", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.1", - "jest": "^26.2.2", - "jsdoc-to-markdown": "^6.0.1", - "limax": "^2.1.0" - }, - "types": "./typings/index.d.ts" + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] + }, + "lint-staged": { + "*.ts": "eslint --fix --ext ts" + } } diff --git a/rollup.bundle.ts b/rollup.bundle.ts new file mode 100644 index 00000000..c1cb79f2 --- /dev/null +++ b/rollup.bundle.ts @@ -0,0 +1,33 @@ +import { resolve } from 'path'; +import cleaner from 'rollup-plugin-cleaner'; +import typescript from 'rollup-plugin-typescript2'; +import versionInjector from 'rollup-plugin-version-injector'; + +export default { + input: 'src/index.ts', + output: [ + { + file: './dist/index.js', + format: 'cjs', + exports: 'named', + sourcemap: true + }, + { + file: './dist/index.mjs', + format: 'es', + exports: 'named', + sourcemap: true + }, + { + file: './dist/index.umd.js', + format: 'umd', + name: 'JoshCore', + sourcemap: true, + globals: { + '@sapphire/utilities': 'SapphireUtilities', + '@realware/utilities': 'RealwareUtilities' + } + } + ], + plugins: [cleaner({ targets: ['./dist'] }), typescript({ tsconfig: resolve(process.cwd(), 'src', 'tsconfig.json') }), versionInjector()] +}; diff --git a/src/error.js b/src/error.js deleted file mode 100644 index 7eefc13d..00000000 --- a/src/error.js +++ /dev/null @@ -1,12 +0,0 @@ -class CustomError extends Error { - - constructor(message, name = null) { - super(); - Error.captureStackTrace(this, this.constructor); - this.name = name || 'JoshError'; - this.message = message; - } - -} - -module.exports = CustomError; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index c8b57c99..00000000 --- a/src/index.js +++ /dev/null @@ -1,752 +0,0 @@ -const { - merge, - isArray, - isFunction, - get: _get, - isNil, - isObject, - cloneDeep, -} = require('lodash'); -const serialize = require('serialize-javascript'); - -// Custom error codes with stack support. -const Err = require('./error.js'); - -// Package.json -const pkgdata = require('../package.json'); - -class Josh { - /** - * Initializes a new Josh, with options. - * @param {Object} [options] Additional options an configurations. - * @param {string} [options.name] Required. The name of the table in which to save the data. - * @param {string} [options.provider] Required. A string with the name of the provider to use. Should not be already required, - * as Josh takes care of doing that for you. *Must* be a valid provider that complies with the Provider API. - * The provider needs to be installed separately with yarn or npm. See https://josh.evie.dev/providers for details. - * @param {boolean} [options.ensureProps] defaults to `true`. If enabled and an inserted value is an object, using ensure() will also ensure that - * every property present in the default object will be added to the value, if it's absent. - * @param {*} [options.autoEnsure] default is disabled. When provided a value, essentially runs ensure(key, autoEnsure) automatically so you don't have to. - * This is especially useful on get(), but will also apply on set(), and any array and object methods that interact with the database. - * @param {Function} [options.serializer] Optional. If a function is provided, it will execute on the data when it is written to the database. - * This is generally used to convert the value into a format that can be saved in the database, such as converting a complete class instance to just its ID. - * This function may return the value to be saved, or a promise that resolves to that value (in other words, can be an async function). - * @param {Function} [options.deserializer] Optional. If a function is provided, it will execute on the data when it is read from the database. - * This is generally used to convert the value from a stored ID into a more complex object. - * This function may return a value, or a promise that resolves to that value (in other words, can be an async function). - * @example - * const Josh = require("@joshdb/core"); - * const provider = require("@joshdb/sqlite"); - * - * // sqlite-based database, with default options - * const sqliteDB = new Josh({ - * name: 'mydatabase', - * provider, - * }); - */ - constructor(options = {}) { - const { provider: Provider, name, providerOptions } = options; - - // Just grab the version from package.json - this.version = pkgdata.version; - - // Fail miserably and weep if no provider, or no name, was given during initialization - if (!Provider || !name) { - throw new Err( - 'Josh requires both a "name" and "provider" given in the options.', - 'JoshOptionsError', - ); - } - - // Verify if the provider given is an object, and is a valid provider for Josh... - const intializedProvider = new Provider({ name, ...providerOptions }); - if (intializedProvider.constructor.name !== 'JoshProvider') { - throw new Err( - `The given Provider does not seem valid. I expected JoshProvider, but this was a ${intializedProvider.constructor.name}!`, - 'JoshOptionsError', - ); - } - - // Create a function that will be resolved whenever the provider's database is connected. - this.defer = new Promise((resolve) => { - this.ready = resolve; - }); - - // Configure shit - this.provider = intializedProvider; - this.name = name; - - this.all = Symbol('_all'); - this.off = Symbol('_off'); - - this.serializer = options.serializer; - this.deserializer = options.deserializer; - - this.autoEnsure = isNil(options.autoEnsure) ? this.off : options.autoEnsure; - this.ensureProps = isNil(options.ensureProps) ? true : options.ensureProps; - - // Connect the provider to its database. - this.provider.init().then(() => { - this.ready(); - this.isReady = true; - }); - - // Initialize this property, to prepare for a possible destroy() call. - // This is completely ignored in all situations except destroying Josh. - this.isDestroyed = false; - } - - /* - * Internal Method. Verifies that the database is ready, assuming persistence is used. - */ - async readyCheck() { - await this.defer; - if (this.isDestroyed) { - throw new Err( - 'This Josh has been destroyed and can no longer be used without being re-initialized.', - 'JoshDestroyedError', - ); - } - } - - /* - * Internal Method. Splits the key and path - */ - getKeyAndPath(keyOrPath) { - if (!keyOrPath) return []; - const [key, ...path] = keyOrPath.split('.'); - return [key.toString(), path.length ? path.join('.') : null]; - } - - /** - * Retrieves (fetches) a value from the database. If a simple key is provided, returns the value. - * If a path is provided, will only return the value at that path, if it exists. - * @param {string} keyOrPath Either a key, or full path, of the value you want to get. - * For more information on how path works, see https://josh.evie.dev/path - * @return {Promise<*>} Returns the value for the key or the value found at the specified path. - */ - async get(keyOrPath) { - await this.readyCheck(); - const [key, path] = this.getKeyAndPath(keyOrPath); - if(isNil(key)) return null; - let value; - if (!(await this.has(keyOrPath))) { - if (this.autoEnsure !== this.off) value = this.autoEnsure; - else return null; - } else { - value = await this.provider.get(key); - } - value = this.deserializer ? await this.deserializer(value, key, path) : value; - return !isNil(path) ? _get(value, path) : value; - } - - // Not yet implemented (or implementable) - // async query(opts) { - // await this.readyCheck(); - // this.provider.query(opts); - // } - - /** - * Retrieve many values from the database. - * If you provide `josh.all` as a value (josh being your variable for the database), the entire data set is returned. - * @param {string[]|symbol} keys An array of keys to return, or `db.all` to retrieve them all. - * @return {Promise} An object with one or many key/value pairs where the property name is the key and the property value is the database value. - */ - async getMany(keys) { - await this.readyCheck(); - const data = - keys === this.all ? this.provider.getAll() : this.provider.getMany(keys); - if (this.deserializer) { - for(const key of Object.keys(data)) { - data[key] = await this.deserializer(data[key], key); - } - } - return data; - } - - /** - * Returns one or more random values from the database. - * @param {number} count Defaults to 1. The number of random key/value pairs to get. - * @return {Promise} An array of key/value pairs each in their own array. - * The array of values should never contain duplicates. If the requested count is higher than the number - * of rows in the database, only the available number of rows will be returned, in randomized order. - * Each array element is comprised of the key and value: // TODO : FIX [['a', 1], ['b', 2], ['c', 3]] - */ - async random(count) { - await this.readyCheck(); - return await this.provider.random(count); - } - - /** - * Returns one or more random keys from the database. - * @param {number} count Defaults to 1. The number of random key/value pairs to get. - * @return {Promise>} An array of string keys in a randomized order. - * The array of keys should never contain duplicates. If the requested count is higher than the number - * of rows in the database, only the available number of rows will be returned. - */ - async randomKey(count) { - await this.readyCheck(); - return await this.provider.randomKey(count); - } - - /** - * Verifies whether a key, or a specific property of an object, exists at all. - * @param {string} keyOrPath Either a key, or full path, of the value you want to get. - * For more information on how path works, see https://josh.evie.dev/path - * @return {Promise} Whether the key, or property specified in the path, exists. - */ - async has(keyOrPath) { - await this.readyCheck(); - try { - const [key, path] = this.getKeyAndPath(keyOrPath); - return this.provider.has(key, path); - } catch (err) { - console.log(keyOrPath); - console.log(`Error on ${keyOrPath}: ${err}`); - return null; - } - } - - /** - * Get all the keys in the database. - * @return {Promise} An array of all the keys as string values. - */ - get keys() { - return this.readyCheck().then(() => this.provider.keys()); - } - - /** - * Get all the values in the database. - * @return {Promise} An array of all the values stored in the database. - */ - get values() { - return this.readyCheck().then(() => this.provider.values()); - } - - /** - * Get the amount of rows inside the database. - * @return {Promise} An integer equal to the amount of stored key/value pairs. - */ - get size() { - return this.readyCheck().then(() => this.provider.count()); - } - - /** - * Store a value in the database. If a simple key is provided, creates or overwrites the entire value with the new one provide. - * If a path is provided, and the stored value is an object, only the value at the path will be overwritten. - * @param {string} keyOrPath Either a key, or a full path, where you want to store the value. - * For more information on how path works, see https://josh.evie.dev/path - * @param {*} value The value to store for the key, or in the path, specified. - * All values MUST be "simple" javascript values: Numbers, Booleans, Strings, Arrays, Objects. - * If you want to store a "complex" thing such as an instance of a class, please use a Serializer to convert it to a storable value. - * @return {Promise} This database wrapper, useful if you want to chain more instructions for Josh. - */ - async set(keyOrPath, value) { - await this.readyCheck(); - const [key, path] = this.getKeyAndPath(keyOrPath); - if(isNil(value) && this.autoEnsure !== this.off) { - value = this.autoEnsure; - } - await this.provider.set( - key, - path, - this.serializer ? await this.serializer(value, key, path) : value, - ); - return this; - } - - /** - * Store many values at once in the database. DOES NOT SUPPORT PATHS. Or autoId. - * @param {Object} data The data to insert. Must be an object as key/value pairs. - * @param {boolean} overwrite Whether to overwrite existing keys. Since this method does not support paths, existin data will be lost. - * @return {Promise} This database wrapper, useful if you want to chain more instructions for Josh. - * @example - * josh.setMany({ - * "thinga": "majig", - * "foo": "bar", - * "isCool": true - * }); - */ - async setMany(data, overwrite) { - await this.readyCheck(); - await this.provider.setMany(data, overwrite); - return this; - } - - /** - * Update an object in the database with modified values. Similar to set() except it does not overwrite the entire object. - * Instead, the data is *merged* with the existing object. Object properties not included in your data are not touched. - * @param {string} keyOrPath Either a key, or full path, of the value you want to update. - * @param {Object|Function} input Either the object, or a function. If a function is provided, - * it will receive the *current* value as an argument. You are expected to return a modified object that will be stored in the database. - * @return {Promise} The merged object that will be stored in the database. - * @example - * josh.set('thing', { - * a: 1, - * b: 2, - * c: 3 - * }); - * josh.update('thing', { - * a: 'one', - * d: 4 - * }); - * // value is now {a: 'one', b: 2, c: 3, d: 4} - * - * josh.update('thing', (previousValue) => { - * ...previousValue, - * b: 'two', - * e: 5, - * }); - * // value is now {a: 'one', b: 'two', c: 3, d: 4, e: 5} - */ - async update(keyOrPath, input) { - await this.readyCheck(); - const previousValue = await this.get(keyOrPath); - let mergeValue = input; - if (typeof input === 'function') { - mergeValue = input(previousValue); - } - await this.set(keyOrPath, merge(previousValue, mergeValue)); - return this; - } - - /** - * Returns the key's value, or the default given, ensuring that the data is there. - * This is a shortcut to "if josh doesn't have key, set it, then get it" which is a very common pattern. - * @param {string} keyOrPath Either a key, or full path, of the value you want to ensure. - * @param {*} defaultValue Required. The value you want to save in the database and return as default. - * @example - * // Simply ensure the data exists (for using property methods): - * josh.ensure("mykey", {some: "value", here: "as an example"}); - * josh.has("mykey"); // always returns true - * josh.get("mykey", "here") // returns "as an example"; - * - * // Get the default value back in a variable: - * const settings = mySettings.ensure("1234567890", defaultSettings); - * console.log(settings) // josh's value for "1234567890" if it exists, otherwise the defaultSettings value. - * @return {Promise<*>} The value from the database for the key, or the default value provided for a new key. - */ - async ensure(keyOrPath, defaultValue) { - await this.readyCheck(); - const [key, path] = this.getKeyAndPath(keyOrPath); - defaultValue = cloneDeep(defaultValue); - if (this.autoEnsure !== this.off) { - if (!isNil(defaultValue)) { - console.warn( - `WARNING: Saving "${key}" autoEnsure value was provided for this JOSH but a default value has also been provided. The defaultValue will be used, autoEnsure value is used instead.`, - ); - } - defaultValue = this.autoEnsure; - } - - if (isNil(defaultValue)) { - throw new Err( - `No defaultValue or autoEnsure value provided on ensure method for "${key}" in "${this.name}"`, - 'JOSHArgumentError', - ); - } - if(!isNil(path)) { - if (this.ensureProps) await this.ensure(key, {}); - if(await this.has(keyOrPath)) return await this.get(keyOrPath); - await this.set(keyOrPath, defaultValue); - return defaultValue; - } - let currValue = await this.get(key); - if(this.ensureProps && isObject(currValue)) { - - const merged = merge(defaultValue, currValue); - await this.set(key, merged); - return merged; - } - if(await this.has(keyOrPath)) return await this.get(keyOrPath); - this.set(keyOrPath, defaultValue); - return defaultValue; - } - - /** - * Remove a key/value pair, or the property and value at a specific path, or clear the database. - * @param {string|symbol|Array} keyOrPath Either a key, or full path, of the value you want to delete. - * If providing a path, only the value located at the path is deleted. - * If providing an array, will delete all keys in that array (does not support paths) - * Alternatively: josh.delete(josh.all) will clear the database of all data. - * @return {Promise} This database wrapper, useful if you want to chain more instructions for Josh. - */ - async delete(keyOrPath) { - await this.readyCheck(); - if (isArray(keyOrPath)) { - return this.provider.deleteMany(keyOrPath); - } - if (keyOrPath === this.all) { - await this.provider.clear(); - } else { - const [key, path] = this.getKeyAndPath(keyOrPath); - await this.provider.delete(key, path); - } - return this; - } - - /** - * Add a new value to an array. - * @param {string} keyOrPath Either a key, or full path, where the array where you want to add a value. - * @param {*} value The value to add to the array. - * @param {boolean} allowDupes Whether to allow duplicate values to be added. Note that if you're pushing objects or arrays, - * duplicates can occur no matter what, as detecting duplicate objects is CPU-intensive. - * @return {Promise} This database wrapper, useful if you want to chain more instructions for Josh. - */ - async push(keyOrPath, value, allowDupes = true) { - await this.readyCheck(); - const [key, path] = this.getKeyAndPath(keyOrPath); - await this.provider.push(key, path, value, allowDupes); - return this; - } - - /** - * Remove a value from an array, by value (simple values like strings and numbers) or function (complex values like arrays or objects). - * @param {*} keyOrPath Either a key, or full path, where the array where you want to remove from, is stored. - * @param {*|Function} value Required. The value to remove from the array. OR a function to match a value stored in the array. - * If using a function, the function provides the value and must return a boolean that's true for the value you want to remove. - * @return {Promise} This database wrapper, useful if you want to chain more instructions for Josh. - * @example - * // Assuming - * josh.set('array', [1, 2, 3]) - * josh.set('objectarray', [{ a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 }]) - * - * josh.remove('array', 1); // value is now [2, 3] - * josh.remove('objectarray', (value) => value.e === 5); // value is now [{ a: 1, b: 2, c: 3 }] - */ - async remove(keyOrPath, value) { - await this.readyCheck(); - const [key, path] = isArray(keyOrPath) ? - [key, null] : - this.getKeyAndPath(keyOrPath); - await this.provider.remove(key, path, value); - return this; - } - - /** - * Increments (adds 1 to the number) the stored value. - * @param {*} keyOrPath Either a key, or full path, to the value you want to increment. The value must be a number. - * @return {Promise} This database wrapper, useful if you want to chain more instructions for Josh. - */ - async inc(keyOrPath) { - await this.readyCheck(); - const [key, path] = this.getKeyAndPath(keyOrPath); - await this.provider.inc(key, path); - return this; - } - - /** - * Decrements (remove 1 from the number) the stored value. - * @param {*} keyOrPath Either a key, or full path, to the value you want to decrement. The value must be a number. - * @return {Promise} This database wrapper, useful if you want to chain more instructions for Josh. - */ - async dec(keyOrPath) { - await this.readyCheck(); - const [key, path] = this.getKeyAndPath(keyOrPath); - await this.provider.dec(key, path); - return this; - } - - /** - * Finds a value within the database, either through an exact value match, or a function. - * Useful for Objects and Array values, will not work on "simple" values like strings. - * Returns the first found match - if you need more than one result, use filter() instead. - * Either a function OR a value **must** be provided. - * Note that using functions here currently is very inefficient, so it's suggested to use paths whenever necesary. - * @param {Function|string} pathOrFn Mandatory. Either a function, or the path in which to find the value. - * If using a function: it will run on either the stored value, OR the value at the path given if it's provided. - * - The function receives the value (or value at the path) as well the the key currently being checked. - * - The function must return a boolean or truthy/falsey value! Oh and the function can be async, too ;) - * If using a path: - * - A "value" predicate is mandatory when checking by path. - * - The value must be simple: string, boolean, integer. It cannot be an object or array. - * @param {string} predicate Optional on functions, Mandatory on path finds. If provided, the function or value acts on what's at that path. - * @return {Promise} Returns an array composed of the full value (NOT the one at the path!), and the key. - * @example - * // Assuming: - * josh.set("john.shmidt", { - * fullName: "John Jacob Jingleheimer Schmidt", - * id: 12345, - * user: { - * username: "john.shmidt", - * firstName: "john", - * lastName: "shmidt", - * password: "somerandombcryptstringthingy", - * lastAccess: -22063545000, - * isActive: false, - * avatar: null, - * } - * }); - * - * // Regular string find: - * josh.find("user.firstName", "john") - * - * // Simple function find: - * josh.find(value => value.user.firstName === "john"); - * - * // Function find with a path: - * josh.find(value => value === "john", "user.firstName"); - * - * // The return of all the above if the same: - * { - * "john.shmidt": { - * fullName: "John Jacob Jingleheimer Schmidt", - * id: 12345, - * user: { - * username: "john.shmidt", - * firstName: "john", - * lastName: "shmidt", - * password: "somerandombcryptstringthingy", - * lastAccess: -22063545000, - * isActive: false, - * avatar: null, - * } - * } - * } - */ - async find(pathOrFn, predicate) { - await this.readyCheck(); - return isFunction(pathOrFn) - ? this.provider.findByFunction(pathOrFn, predicate) - : this.provider.findByValue(pathOrFn, predicate); - } - - /** - * Filters for values within the database, either through an exact value match, or a function. - * Useful for Objects and Array values, will not work on "simple" values like strings. - * Returns all matches found - if you need a single value, use find() instead. - * Either a function OR a value **must** be provided. - * Note that using functions here currently is very inefficient, so it's suggested to use paths whenever necesary. - * @param {Function|string} pathOrFn Mandatory. Either a function, or the path in which to find the value. - * If using a function: it will run on either the stored value, OR the value at the path given if it's provided. - * - The function receives the value (or value at the path) as well the the key currently being checked. - * - The function must return a boolean or truthy/falsey value! Oh and the function can be async, too ;) - * If using a path: - * - A "value" predicate is mandatory when checking by path. - * - The value must be simple: string, boolean, integer. It cannot be an object or array. - * @param {string} predicate Optional on functions, Mandatory on path finds. If provided, the function or value acts on what's at that path. - * @return {Promise} Returns an array of key/value pair(s) that successfully passes the provided function. - * - */ - async filter(pathOrFn, predicate) { - await this.readyCheck(); - return isFunction(pathOrFn) - ? this.provider.filterByFunction(pathOrFn, predicate) - : this.provider.filterByValue(pathOrFn, predicate); - } - - /** - * Maps data from each value in your data. Works similarly to Array.map(), but can use both async functions, as well as paths. - * Note that using functions here currently is very inefficient, so it's suggested to use paths whenever necesary. - * @param {Function|string} pathOrFn Mandatory. Either a function, or the path where to get the value from. - * If using a path, the value at the path will be returned, or null. - * If using a function, the function is run on the entire value (no path is used). The function is given the `key` and `value` as arguments, - * and the value returned will be accessible in the return array. - * @return {Promise>} An array of values mapped from the data. - */ - async map(pathOrFn) { - await this.readyCheck(); - return isFunction(pathOrFn) - ? this.provider.mapByFunction(pathOrFn) - : this.provider.mapByValue(pathOrFn); - } - - /** - * Performs Array.includes() on a certain value. Works similarly to - * [Array.includes()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes). - * @param {string} keyOrPath Either a key, or full path, to the array you want to check for the value. The value must be an array. - * @param {*} value Either the value to check in the array, or a function to determine the presence of the value. - * If using a value, note that this won't work if the value you're checking for is an array or object - use a function for that. - * If using a function, the function takes in the value and index, and must return a boolean true when the value is the one you want. - * @return {Promise} Whether the value is included in the array. - * @example - * josh.set('arr', ['a', 'b', 1, 2, { foo: "bar"}]); - * - * josh.includes('arr', 'a'); // true - * josh.includes('arr', 1) // true - * josh.includes('arr', val => val.foo === 'bar'); // true - */ - async includes(keyOrPath, value) { - await this.readyCheck(); - const [key, path] = this.getKeyAndPath(keyOrPath); - return this.provider.includes(key, path, value); - } - - /** - * Checks whether *at least one key* contains the expected value. The loop stops once the value is found. - * @param {string} pathOrFn Either a function, or the full path to the value to check against the provided value. - * If using a path, the value at he path will be compared to the value provided as a second argument. - * If using a function, the function is given the *full* value for each key, along with the key itself, for each row in the database. - * It should return `true` if your match is found. - * @param {string|number|boolean|null} value The value to be checked at each path. Cannot be an object or array (use a function for those). - * Ignored if a function is provided. - * @return {Promise} Whether the value was found or not (if one of the rows in the database match the value at path, or the function has returned true) - */ - async some(pathOrFn, value) { - await this.readyCheck(); - return isFunction(pathOrFn) - ? this.provider.someByFunction(pathOrFn) - : this.provider.someByValue(pathOrFn, value); - } - - /** - * Checks whether *every single key* contains the expected value. Identical to josh.some() except all must match except just one. - * @param {*} pathOrFn Either a function, or the full path to the value to check against the provided value. - * If using a path, the value at he path will be compared to the value provided as a second argument. - * If using a function, the function is given the *full* value for each key, along with the key itself, for each row in the database. - * It should return `true` if your match is found. - * @param {Promise} value The value to be checked at each path. Cannot be an object or array (use a function for those). - * @return {boolean} Whether the value was found or not, on ever single row. - */ - async every(pathOrFn, value) { - await this.readyCheck(); - return isFunction(pathOrFn) - ? this.provider.everyByFunction(pathOrFn) - : this.provider.everyByValue(pathOrFn, value); - } - - // async reduce(fn, initialvalue) - - /** - * Executes a mathematical operation on a value and saves the result in the database. - * @param {string} keyOrPath Either a key, or full path, to the numerical value you want to exceute math on. Must be an Number value. - * @param {string} operation Which mathematical operation to execute. Supports most - * math ops: =, -, *, /, %, ^, and english spelling of those operations. - * @param {number} operand The right operand of the operation. - * @param {string} path Optional. The property path to execute the operation on, if the value is an object or array. - * @return {Promise} This database wrapper, useful if you want to chain more instructions for Josh. - * @example - * // Assuming - * josh.set("number", 42); - * josh.set("numberInObject", {sub: { anInt: 5 }}); - * - * josh.math("number", "/", 2); // 21 - * josh.math("number", "add", 5); // 26 - * josh.math("number", "modulo", 3); // 2 - * josh.math("numberInObject.sub.anInt", "+", 10); // 15 - * - */ - async math(keyOrPath, operation, operand) { - await this.readyCheck(); - const [key, path] = this.getKeyAndPath(keyOrPath); - await this.provider.math(key, path, operation, operand); - return this; - } - - /** - * Get an automatic ID for insertion of a new record. - * @return {Promise} A unique ID to insert data. - * @example - * const Josh = require("@joshdb/core"); - * const provider = require("@joshdb/sqlite"); - * - * - * const sqliteDB = new Josh({ - * name: 'mydatabase', - * provider, - * }); - * (async() => { - * const newId = await sqliteDB.autoId(); - * console.log("Inserting new row with ID: ", newID); - * sqliteDB.set(newId, "This is a new test value"); - * })(); - */ - async autoId() { - await this.readyCheck(); - return await this.provider.autoId(); - } - - /** - * Import an existing json export from josh or enmap. This data must have been exported from josh or enmap, - * and must be from a version that's equivalent or lower than where you're importing it. - * @param {string} data The data to import to Josh. Must contain all the required fields provided by export() - * @param {boolean} overwrite Defaults to `true`. Whether to overwrite existing key/value data with incoming imported data - * @param {boolean} clear Defaults to `false`. Whether to clear the enmap of all data before importing - * (**__WARNING__**: Any exiting data will be lost! This cannot be undone.) - * @return {Promise} This database wrapper, useful if you want to chain more instructions for Josh. - */ - async import(data, overwrite = true, clear = false) { - await this.readyCheck(); - if (clear) await this.delete(this.all); - if (isNil(data)) { - throw new Err( - `No data provided for import() in "${this.name}"`, - 'JoshImportError', - ); - } - const parsed = eval(`(${data})`); - const importData = {}; - for (const { key, value } of parsed.keys) { - importData[key] = this.serializer - ? await this.serializer(value, key) - : value; - } - await this.provider.setMany(importData, overwrite); - return this; - } - - /** - * Exports your entire database in JSON format. Useable as import data for both Josh and Enmap. - * ***WARNING: This currently requires loading the entire database in memory to write to JSON and might fail on large datasets (more than 1Gb)*** - * @return {Promise} A JSON string that can be saved wherever you need it. - * @example - * const fs = require("fs"); - * josh.export().then(data => fs.writeFileSync("./export.json"), data)); - */ - async export() { - await this.readyCheck(); - const data = await this.provider.getAll(); - const output = { - name: this.name, - version: pkgdata.version, - exportDate: Date.now(), - keys: [], - }; - for (const key of Object.keys(data)) { - const keydata = this.deserializer - ? await this.deserializer(data[key], key) - : data[key]; - output.keys.push({ key, value: keydata }); - } - // serialize-javascript's serializer! - return serialize( - output, - null, - 2, - ); - } - - /** - * Initialize multiple Josh instances easily. Used to simplify the creation of many tables - * @param {Array} names Array of strings. Each array entry will create a separate josh with that name. - * @param {Object} options Options object to pass to each josh, excluding the name.. - * @example - * // Using local variables. - * const Josh = require('josh'); - * const provider = require("@joshdb/sqlite"); - * const { settings, tags, blacklist } = Josh.multi(['settings', 'tags', 'blacklist'], { provider }); - * - * // Attaching to an existing object (for instance some API's client) - * const Josh = require("@joshdb/core"); - * const provider = require("@joshdb/sqlite"); - * Object.assign(client, Josh.multi(["settings", "tags", "blacklist"], { provider })); - * - * @returns {Array} An array of initialized Josh instances. - */ - static multi(names, options = {}) { - if (!names.length || names.length < 1) { - throw new Err( - '"names" argument must be an array of string names.', - 'JoshTypeError', - ); - } - - const returnvalue = {}; - for (const name of names) { - const josh = new Josh({ name, ...options }); - returnvalue[name] = josh; - } - return returnvalue; - } -} - -module.exports = Josh; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..1f8ea443 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,12 @@ +export * from './lib/decorators'; +export * from './lib/errors'; +export * from './lib/functions'; +export * from './lib/payloads'; +export * from './lib/structures/default-provider'; +export * from './lib/structures/Josh'; +export * from './lib/structures/JoshProvider'; +export * from './lib/structures/Middleware'; +export * from './lib/structures/MiddlewareStore'; +export * from './lib/types'; +export * from './lib/validators'; +export * from './middlewares/CoreAutoEnsure'; diff --git a/src/lib/decorators/ApplyMiddlewareOptions.ts b/src/lib/decorators/ApplyMiddlewareOptions.ts new file mode 100644 index 00000000..01d5a212 --- /dev/null +++ b/src/lib/decorators/ApplyMiddlewareOptions.ts @@ -0,0 +1,27 @@ +import type { Ctor } from '@sapphire/utilities'; +import type { Middleware } from '../..'; +import { createClassDecorator } from './utils/createClassDecorator'; +import { createProxy } from './utils/createProxy'; + +/** + * Decorator function that applies given options to {@link Middleware} class. + * @since 2.0.0 + * @param options The middleware options. + * + * @example + * ```typescript + * import { ApplyMiddlewareOptions, Middleware } from '@joshdb/core'; + * + * (at)ApplyMiddlewareOptions({ + * name: 'name', + * // More options... + * }) + * export class CoreMiddleware extends Middleware {} + * ``` */ +export function ApplyMiddlewareOptions(options: Middleware.Options): ClassDecorator { + return createClassDecorator((target: Ctor, Middleware>) => + createProxy(target, { + construct: (ctor) => new ctor(options) + }) + ); +} diff --git a/src/lib/decorators/index.ts b/src/lib/decorators/index.ts new file mode 100644 index 00000000..7cb8c1cd --- /dev/null +++ b/src/lib/decorators/index.ts @@ -0,0 +1 @@ +export * from './ApplyMiddlewareOptions'; diff --git a/src/lib/decorators/utils/createClassDecorator.ts b/src/lib/decorators/utils/createClassDecorator.ts new file mode 100644 index 00000000..f30aa59a --- /dev/null +++ b/src/lib/decorators/utils/createClassDecorator.ts @@ -0,0 +1,3 @@ +export function createClassDecorator void>(fn: TFunction): ClassDecorator { + return fn; +} diff --git a/src/lib/decorators/utils/createProxy.ts b/src/lib/decorators/utils/createProxy.ts new file mode 100644 index 00000000..df12a647 --- /dev/null +++ b/src/lib/decorators/utils/createProxy.ts @@ -0,0 +1,11 @@ +// eslint-disable-next-line @typescript-eslint/ban-types +export function createProxy(target: T, handler: Omit, 'get'>): T { + return new Proxy(target, { + ...handler, + get: (target, property) => { + const value = Reflect.get(target, property); + + return typeof value === 'function' ? (...args: readonly unknown[]) => value.apply(target, args) : value; + } + }); +} diff --git a/src/lib/errors/JoshError.ts b/src/lib/errors/JoshError.ts new file mode 100644 index 00000000..2f67ad22 --- /dev/null +++ b/src/lib/errors/JoshError.ts @@ -0,0 +1,44 @@ +/** + * The base class for errors in {@link Josh} + * @since 2.0.0 + */ +export class JoshError extends Error { + /** + * The identifier for this error. + * @since 2.0.0 + */ + public identifier: string; + + public constructor(options: JoshError.Options) { + super(options.message); + + this.identifier = options.identifier; + } + + /** + * The name of this error. + */ + public get name() { + return 'JoshError'; + } +} + +export namespace JoshError { + /** + * The options for {@link JoshError} + * @since 2.0.0 + */ + export interface Options { + /** + * The identifier for this error. + * @since 2.0.0 + */ + identifier: string; + + /** + * The message for this error. + * @since 2.0.0 + */ + message?: string; + } +} diff --git a/src/lib/errors/JoshProviderError.ts b/src/lib/errors/JoshProviderError.ts new file mode 100644 index 00000000..842bed89 --- /dev/null +++ b/src/lib/errors/JoshProviderError.ts @@ -0,0 +1,42 @@ +import type { Method } from '../types'; +import { JoshError } from './JoshError'; + +/** + * The base class for {@link JoshProvider}. + * @since 2.0.0 + */ +export class JoshProviderError extends JoshError { + /** + * The method this error applies to. + * @since 2.0.0 + */ + public method: Method; + + public constructor(options: JoshProviderError.Options) { + super(options); + + this.method = options.method; + } + + /** + * The name for this error. + * @since 2.0.0 + */ + public get name() { + return 'JoshProviderError'; + } +} + +export namespace JoshProviderError { + /** + * The options for {@link JoshProviderError} + * @since 2.0.0 + */ + export interface Options extends JoshError.Options { + /** + * The method this error applies to. + * @since 2.0.0 + */ + method: Method; + } +} diff --git a/src/lib/errors/index.ts b/src/lib/errors/index.ts new file mode 100644 index 00000000..aee51161 --- /dev/null +++ b/src/lib/errors/index.ts @@ -0,0 +1,2 @@ +export * from './JoshError'; +export * from './JoshProviderError'; diff --git a/src/lib/functions/convertLegacyExportJSON.ts b/src/lib/functions/convertLegacyExportJSON.ts new file mode 100644 index 00000000..3dfec98c --- /dev/null +++ b/src/lib/functions/convertLegacyExportJSON.ts @@ -0,0 +1,7 @@ +import type { Josh } from '../structures/Josh'; + +export function convertLegacyExportJSON(json: Josh.LegacyExportJSON): Josh.ExportJSON { + const { name, version, exportDate, keys } = json; + + return { name, version, exportedTimestamp: exportDate, entries: keys.map<[string, StoredValue]>(({ key, value }) => [key, value]) }; +} diff --git a/src/lib/functions/index.ts b/src/lib/functions/index.ts new file mode 100644 index 00000000..0d26aea0 --- /dev/null +++ b/src/lib/functions/index.ts @@ -0,0 +1,2 @@ +export * from './convertLegacyExportJSON'; +export * from './isNodeEnvironment'; diff --git a/src/lib/functions/isNodeEnvironment.ts b/src/lib/functions/isNodeEnvironment.ts new file mode 100644 index 00000000..aba046f1 --- /dev/null +++ b/src/lib/functions/isNodeEnvironment.ts @@ -0,0 +1,3 @@ +export function isNodeEnvironment(): boolean { + return process?.versions?.node !== undefined; +} diff --git a/src/lib/payloads/AutoKey.ts b/src/lib/payloads/AutoKey.ts new file mode 100644 index 00000000..7d063a1b --- /dev/null +++ b/src/lib/payloads/AutoKey.ts @@ -0,0 +1,17 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.AutoKey} + * @since 2.0.0 + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface AutoKeyPayload extends Payload, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.AutoKey; +} diff --git a/src/lib/payloads/Clear.ts b/src/lib/payloads/Clear.ts new file mode 100644 index 00000000..1c134428 --- /dev/null +++ b/src/lib/payloads/Clear.ts @@ -0,0 +1,16 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Clear} + * @since 2.0.0 + * @see {@link Payload} + * @since 2.0.0 + */ +export interface ClearPayload extends Payload { + /** + * The method.this payload is for. + * @since 2.0.0 + */ + method: Method.Clear; +} diff --git a/src/lib/payloads/Dec.ts b/src/lib/payloads/Dec.ts new file mode 100644 index 00000000..8ce5e7c1 --- /dev/null +++ b/src/lib/payloads/Dec.ts @@ -0,0 +1,17 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Dec} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @see {@link Payload.OptionalData} + * @since 2.0.0 + */ +export interface DecPayload extends Payload, Payload.KeyPath { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Dec; +} diff --git a/src/lib/payloads/Delete.ts b/src/lib/payloads/Delete.ts new file mode 100644 index 00000000..92c5e332 --- /dev/null +++ b/src/lib/payloads/Delete.ts @@ -0,0 +1,16 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Delete} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @since 2.0.0 + */ +export interface DeletePayload extends Payload, Payload.KeyPath { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Delete; +} diff --git a/src/lib/payloads/Ensure.ts b/src/lib/payloads/Ensure.ts new file mode 100644 index 00000000..f6773d97 --- /dev/null +++ b/src/lib/payloads/Ensure.ts @@ -0,0 +1,28 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Ensure} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface EnsurePayload extends Payload, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Ensure; + + /** + * The key to get or set. + * @since 2.0.0 + */ + key: string; + + /** + * The default value to store if {@link EnsurePayload.key} doesn't exist. + * @since 2.0.0 + */ + defaultValue: StoredValue; +} diff --git a/src/lib/payloads/Every.ts b/src/lib/payloads/Every.ts new file mode 100644 index 00000000..731268e9 --- /dev/null +++ b/src/lib/payloads/Every.ts @@ -0,0 +1,95 @@ +import type { Awaitable, Primitive } from '@sapphire/utilities'; +import type { Method, StringArray } from '../types'; +import type { Payload } from './Payload'; + +/** + * The union payload for {@link Method.Every} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface EveryPayload extends Payload, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Every; + + /** + * The type for this payload. + * @since 2.0.0 + */ + type: Payload.Type.Hook | Payload.Type.Value; + + /** + * The hook to check equality. + * @since 2.0.0 + */ + hook?: EveryHook; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value?: Primitive; + + /** + * A path to the value for equality check. + * @since 2.0.0 + */ + path?: StringArray; +} + +/** + * The hook payload for {@link Method.Every} + * @see {@link Payload} + * @see {@link Payload.ByHook} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface EveryByHookPayload extends Payload, Payload.ByHook, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Every; + + /** + * The hook to check equality. + * @since 2.0.0 + */ + hook: EveryHook; +} + +/** + * The value payload for {@link Method.Every} + * @see {@link Payload} + * @see {@link Payload.ByValue} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface EveryByValuePayload extends Payload, Payload.ByValue, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Every; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value: Primitive; + + /** + * A path to the value for equality check. + * @since 2.0.0 + */ + path: StringArray; +} + +/** + * The hook for {@link EveryByHookPayload} + * @since 2.0.0 + */ +export type EveryHook = (value: Value) => Awaitable; diff --git a/src/lib/payloads/Filter.ts b/src/lib/payloads/Filter.ts new file mode 100644 index 00000000..7eed290d --- /dev/null +++ b/src/lib/payloads/Filter.ts @@ -0,0 +1,95 @@ +import type { Awaitable, Primitive } from '@sapphire/utilities'; +import type { Method, StringArray } from '../types'; +import type { Payload } from './Payload'; + +/** + * The union payload for {@link Method.Filter} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface FilterPayload extends Payload, Payload.Data> { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Filter; + + /** + * The type for this payload. + * @since 2.0.0 + */ + type: Payload.Type.Hook | Payload.Type.Value; + + /** + * The hook to check equality. + * @since 2.0.0 + */ + hook?: FilterHook; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value?: Primitive; + + /** + * A path to the value for equality check. + * @since 2.0.0 + */ + path?: StringArray; +} + +/** + * The hook payload for {@link Method.Filter} + * @see {@link Payload} + * @see {@link Payload.ByHook} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface FilterByHookPayload extends Payload, Payload.ByHook, Payload.Data> { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Filter; + + /** + * The hook for this payload. + * @since 2.0.0 + */ + hook: FilterHook; +} + +/** + * The value payload for {@link Method.Filter} + * @see {@link Payload} + * @see {@link Payload.ByValue} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface FilterByValuePayload extends Payload, Payload.ByValue, Payload.Data> { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Filter; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value: Primitive; + + /** + * A path to the value for equality check. + * @since 2.0.0 + */ + path: StringArray; +} + +/** + * The hook for {@link FilterByHookPayload} + * @since 2.0.0 + */ +export type FilterHook = (value: HookValue) => Awaitable; diff --git a/src/lib/payloads/Find.ts b/src/lib/payloads/Find.ts new file mode 100644 index 00000000..e52b582a --- /dev/null +++ b/src/lib/payloads/Find.ts @@ -0,0 +1,95 @@ +import type { Awaitable, Primitive } from '@sapphire/utilities'; +import type { Method, StringArray } from '../types'; +import type { Payload } from './Payload'; + +/** + * The union payload for {@link Method.Find} + * @see {@link Payload} + * @see {@link Payload.OptionalData} + * @since 2.0.0 + */ +export interface FindPayload extends Payload, Payload.OptionalData { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Find; + + /** + * The type for this payload. + * @since 2.0.0 + */ + type: Payload.Type.Hook | Payload.Type.Value; + + /** + * The hook to check equality. + * @since 2.0.0 + */ + hook?: FindHook; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value?: Primitive; + + /** + * A path to the value to check equality. + * @since 2.0.0 + */ + path?: StringArray; +} + +/** + * The hook payload for {@link Method.Find} + * @see {@link Payload} + * @see {@link Payload.ByHook} + * @see {@link Payload.OptionalData} + * @since 2.0.0 + */ +export interface FindByHookPayload extends Payload, Payload.ByHook, Payload.OptionalData { + /** + * The method for this payload + * @since 2.0.0 + */ + method: Method.Find; + + /** + * The hook to check equality. + * @since 2.0.0 + */ + hook: FindHook; +} + +/** + * The value payload for {@link Method.Find} + * @see {@link Payload} + * @see {@link Payload.ByValue} + * @see {@link Payload.OptionalData} + * @since 2.0.0 + */ +export interface FindByValuePayload extends Payload, Payload.ByValue, Payload.OptionalData { + /** + * The method for this payload + * @since 2.0.0 + */ + method: Method.Find; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value: Primitive; + + /** + * A path to the value for equality. + * @since 2.0.0 + */ + path: StringArray; +} + +/** + * The hook for {@link FindByHookPayload} + * @since 2.0.0 + */ +export type FindHook = (data: Value) => Awaitable; diff --git a/src/lib/payloads/Get.ts b/src/lib/payloads/Get.ts new file mode 100644 index 00000000..f9f2885c --- /dev/null +++ b/src/lib/payloads/Get.ts @@ -0,0 +1,17 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Get} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @see {@link Payload.OptionalData} + * @since 2.0.0 + */ +export interface GetPayload extends Payload, Payload.KeyPath, Payload.OptionalData { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Get; +} diff --git a/src/lib/payloads/GetAll.ts b/src/lib/payloads/GetAll.ts new file mode 100644 index 00000000..fbcd25de --- /dev/null +++ b/src/lib/payloads/GetAll.ts @@ -0,0 +1,16 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.GetAll} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface GetAllPayload extends Payload, Payload.Data> { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.GetAll; +} diff --git a/src/lib/payloads/GetMany.ts b/src/lib/payloads/GetMany.ts new file mode 100644 index 00000000..1fdcac91 --- /dev/null +++ b/src/lib/payloads/GetMany.ts @@ -0,0 +1,22 @@ +import type { Method, StringArray } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.GetMany} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface GetManyPayload extends Payload, Payload.Data> { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.GetMany; + + /** + * The keys to get. + * @since 2.0.0 + */ + keys: StringArray; +} diff --git a/src/lib/payloads/Has.ts b/src/lib/payloads/Has.ts new file mode 100644 index 00000000..51698af7 --- /dev/null +++ b/src/lib/payloads/Has.ts @@ -0,0 +1,17 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Has} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface HasPayload extends Payload, Payload.KeyPath, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Has; +} diff --git a/src/lib/payloads/Inc.ts b/src/lib/payloads/Inc.ts new file mode 100644 index 00000000..eb121d1d --- /dev/null +++ b/src/lib/payloads/Inc.ts @@ -0,0 +1,17 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Inc} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @see {@link Payload.OptionalData} + * @since 2.0.0 + */ +export interface IncPayload extends Payload, Payload.KeyPath { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Inc; +} diff --git a/src/lib/payloads/Keys.ts b/src/lib/payloads/Keys.ts new file mode 100644 index 00000000..dcc8ea2d --- /dev/null +++ b/src/lib/payloads/Keys.ts @@ -0,0 +1,16 @@ +import type { Method, StringArray } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Keys} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface KeysPayload extends Payload, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Keys; +} diff --git a/src/lib/payloads/Map.ts b/src/lib/payloads/Map.ts new file mode 100644 index 00000000..92c3acdc --- /dev/null +++ b/src/lib/payloads/Map.ts @@ -0,0 +1,83 @@ +import type { Awaitable } from '@sapphire/utilities'; +import type { Method, StringArray } from '../types'; +import type { Payload } from './Payload'; + +/** + * The union payload for {@link Method.Map} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface MapPayload extends Payload, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Map; + + /** + * The type for this payload. + * @since 2.0.0 + */ + type: Payload.Type.Hook | Payload.Type.Path; + + /** + * The hook to map by. + * @since 2.0.0 + */ + hook?: MapHook; + + /** + * The path to map by. + * @since 2.0.0 + */ + path?: StringArray; +} + +/** + * The hook payload for {@link Method.Map} + * @see {@link Payload} + * @see {@link Payload.ByHook} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface MapByHookPayload extends Payload, Payload.ByHook, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Map; + + /** + * The hook to map by. + * @since 2.0.0 + */ + hook: MapHook; +} + +/** + * The path payload for {@link Method.Map} + * @see {@link Payload} + * @see {@link Payload.ByPath} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface MapByPathPayload extends Payload, Payload.ByPath, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Map; + + /** + * The path to map by. + * @since 2.0.0 + */ + path: StringArray; +} + +/** + * The hook for {@link MapByHookPayload} + * @since 2.0.0 + */ +export type MapHook = (data: HookValue) => Awaitable; diff --git a/src/lib/payloads/Math.ts b/src/lib/payloads/Math.ts new file mode 100644 index 00000000..1bc29fca --- /dev/null +++ b/src/lib/payloads/Math.ts @@ -0,0 +1,28 @@ +import type { MathOperator, Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Math} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @since 2.0.0 + */ +export interface MathPayload extends Payload, Payload.KeyPath { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Math; + + /** + * The operator to apply to the operands. + * @since 2.0.0 + */ + operator: MathOperator; + + /** + * The operand to apply to the operator. + * @since 2.0.0 + */ + operand: number; +} diff --git a/src/lib/payloads/Partition.ts b/src/lib/payloads/Partition.ts new file mode 100644 index 00000000..d71b532d --- /dev/null +++ b/src/lib/payloads/Partition.ts @@ -0,0 +1,105 @@ +import type { Awaitable, Primitive } from '@sapphire/utilities'; +import type { Method, StringArray } from '../types'; +import type { Payload } from './Payload'; + +/** + * The union payload for {@link Method.Partition} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface PartitionPayload extends Payload, Payload.Data> { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Partition; + + /** + * The type for this payload. + * @since 2.0.0 + */ + type: Payload.Type.Hook | Payload.Type.Value; + + /** + * The hook to check equality. + * @since 2.0.0 + */ + hook?: PartitionHook; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value?: Primitive; + + /** + * A path to the value for equality check. + * @since 2.0.0 + */ + path?: StringArray; +} + +/** + * The hook payload for {@link Method.Partition} + * @see {@link Payload} + * @see {@link Payload.ByHook} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface PartitionByHookPayload extends Payload, Payload.ByHook, Payload.Data> { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Partition; + + /** + * The hook for this payload + * @since 2.0.0 + */ + hook: PartitionHook; +} + +/** + * The value payload for {@link Method.Partition} + * @see {@link Payload} + * @see {@link Payload.ByValue} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface PartitionByValuePayload extends Payload, Payload.ByValue, Payload.Data> { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Partition; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value: Primitive; + + /** + * A path to the value for equality check. + * @since 2.0.0 + */ + path: StringArray; +} + +/** + * The data for {@link PartitionPayload} + * @since 2.0.0 + */ +export interface PartitionData { + truthy: Record; + + falsy: Record; +} + +/** + * The hook for {@link PartitionByHookPayload} + * @since 2.0.0 + */ +export type PartitionHook = (value: HookValue) => Awaitable; diff --git a/src/lib/payloads/Payload.ts b/src/lib/payloads/Payload.ts new file mode 100644 index 00000000..f66aa9f7 --- /dev/null +++ b/src/lib/payloads/Payload.ts @@ -0,0 +1,138 @@ +import type { JoshProviderError } from '../errors'; +import type { Method, StringArray, Trigger } from '../types'; + +/** + * The base payload to use for most Josh structures. + * @since 2.0.0 + */ +export interface Payload { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method; + + /** + * The trigger for this payload. + * @since 2.0.0 + */ + trigger?: Trigger; + + /** + * The error for this payload. + * @since 2.0.0 + */ + error?: JoshProviderError; +} + +export namespace Payload { + /** + * The key/path extension for {@link Payload}. + * @since 2.0.0 + */ + export interface KeyPath { + /** + * The key for this extension. + * @since 2.0.0 + */ + key: string; + + /** + * The path for this extension. + * @since 2.0.0 + */ + path: StringArray; + } + + /** + * The data extension for {@link Payload}. + * @since 2.0.0 + */ + export interface Data { + /** + * The data for this extension. + * @since 2.0.0 + */ + data: DataValue; + } + + /** + * The optional data extension for {@link Payload}. + * @see {@link Data} + * @since 2.0.0 + */ + export type OptionalData = Partial>; + + /** + * The byHook extension for {@link Payload} + * @since 2.0.0 + */ + export interface ByHook { + /** + * The type for this extension. + * @since 2.0.0 + */ + type: Type.Hook; + } + + /** + * The byPath extension for {@link Payload} + */ + export interface ByPath { + /** + * The type for this extension + * @since 2.0.0 + */ + type: Type.Path; + } + + /** + * The byValue extension for {@link Payload}. + * @since 2.0.0 + */ + export interface ByValue { + /** + * The type for this extension. + * @since 2.0.0 + */ + type: Type.Value; + } + + /** + * The byPath extension for {@link Payload} + */ + export interface ByPath { + /** + * The type for this extension + * @since 2.0.0 + */ + type: Type.Path; + } + + /** + * The type enum for {@link Payload}. + * @see {@link ByHook} + * @see {@link ByPath} + * @see {@link ByValue} + * @since 2.0.0 + */ + export enum Type { + /** + * The hook type. + * @since 2.0.0 + */ + Hook = 'HOOK', + + /** + * The path type. + * @since 2.0.0 + */ + Path = 'PATH', + + /** + * The value type. + * @since 2.0.0 + */ + Value = 'VALUE' + } +} diff --git a/src/lib/payloads/Push.ts b/src/lib/payloads/Push.ts new file mode 100644 index 00000000..edd947e0 --- /dev/null +++ b/src/lib/payloads/Push.ts @@ -0,0 +1,22 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Push} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @since 2.0.0 + */ +export interface PushPayload extends Payload, Payload.KeyPath { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Push; + + /** + * The value to push to an array. + * @since 2.0.0 + */ + value: Value; +} diff --git a/src/lib/payloads/Random.ts b/src/lib/payloads/Random.ts new file mode 100644 index 00000000..c95a5abe --- /dev/null +++ b/src/lib/payloads/Random.ts @@ -0,0 +1,16 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Random} + * @see {@link Payload} + * @see {@link Payload.OptionalData} + * @since 2.0.0 + */ +export interface RandomPayload extends Payload, Payload.OptionalData { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Random; +} diff --git a/src/lib/payloads/RandomKey.ts b/src/lib/payloads/RandomKey.ts new file mode 100644 index 00000000..cc0f09c1 --- /dev/null +++ b/src/lib/payloads/RandomKey.ts @@ -0,0 +1,16 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.RandomKey} + * @see {@link Payload} + * @see {@link Payload.OptionalData} + * @since 2.0.0 + */ +export interface RandomKeyPayload extends Payload, Payload.OptionalData { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.RandomKey; +} diff --git a/src/lib/payloads/Remove.ts b/src/lib/payloads/Remove.ts new file mode 100644 index 00000000..fb3d85f1 --- /dev/null +++ b/src/lib/payloads/Remove.ts @@ -0,0 +1,94 @@ +import type { Awaitable, Primitive } from '@sapphire/utilities'; +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The union payload for {@link Method.Remove} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @since 2.0.0 + */ +export interface RemovePayload extends Payload, Payload.KeyPath { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Remove; + + /** + * The type for this payload. + * @since 2.0.0 + */ + type: Payload.Type.Hook | Payload.Type.Value; + + /** + * The hook to check equality. + * @since 2.0.0 + */ + hook?: RemoveHook; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value?: Primitive; +} + +/** + * The hook payload for {@link Method.Remove} + * @see {@link Payload} + * @see {@link Payload.ByHook} + * @see {@link Payload.KeyPath} + */ +export interface RemoveByHookPayload extends Payload, Payload.ByHook, Payload.KeyPath { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Remove; + + /** + * The type for this payload. + * @since 2.0.0 + */ + type: Payload.Type.Hook; + + /** + * The hook to check equality. + * @since 2.0.0 + */ + hook: RemoveHook; +} + +/** + * The data payload for {@link Method.Remove} + * @see {@link Payload} + * @see {@link Payload.ByValue} + * @see {@link Payload.KeyPath} + * @since 2.0.0 + */ +export interface RemoveByValuePayload extends Payload, Payload.ByValue, Payload.KeyPath { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Remove; + + /** + * The type for this payload. + * @since 2.0.0 + */ + type: Payload.Type.Value; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value: Primitive; +} + +/** + * The hook for {@link RemoveByHookPayload} + * @since 2.0.0 + */ +export type RemoveHook = (value: Value) => Awaitable; diff --git a/src/lib/payloads/Set.ts b/src/lib/payloads/Set.ts new file mode 100644 index 00000000..627c4eac --- /dev/null +++ b/src/lib/payloads/Set.ts @@ -0,0 +1,22 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Set} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @since 2.0.0 + */ +export interface SetPayload extends Payload, Payload.KeyPath { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Set; + + /** + * The value to set. + * @since 2.0.0 + */ + value: Value; +} diff --git a/src/lib/payloads/SetMany.ts b/src/lib/payloads/SetMany.ts new file mode 100644 index 00000000..d91fc434 --- /dev/null +++ b/src/lib/payloads/SetMany.ts @@ -0,0 +1,35 @@ +import type { Method, StringArray } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.SetMany} + * @see {@link Payload} + * @since 2.0.0 + */ +export interface SetManyPayload extends Payload, Payload.Data<[SetManyPayload.KeyPath, Value][]> { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.SetMany; +} + +export namespace SetManyPayload { + /** + * The key/path data for {@link SetManyPayload}. + * @since 2.0.0 + */ + export interface KeyPath { + /** + * The key to set. + * @since 2.0.0 + */ + key: string; + + /** + * The path to set at. + * @since 2.0.0 + */ + path: StringArray; + } +} diff --git a/src/lib/payloads/Size.ts b/src/lib/payloads/Size.ts new file mode 100644 index 00000000..d837dcb4 --- /dev/null +++ b/src/lib/payloads/Size.ts @@ -0,0 +1,16 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Size} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface SizePayload extends Payload, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Size; +} diff --git a/src/lib/payloads/Some.ts b/src/lib/payloads/Some.ts new file mode 100644 index 00000000..d3781fc6 --- /dev/null +++ b/src/lib/payloads/Some.ts @@ -0,0 +1,95 @@ +import type { Awaitable, Primitive } from '@sapphire/utilities'; +import type { Method, StringArray } from '../types'; +import type { Payload } from './Payload'; + +/** + * The union payload for {@link Method.Some} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface SomePayload extends Payload, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Some; + + /** + * The type for this payload. + * @since 2.0.0 + */ + type: Payload.Type.Hook | Payload.Type.Value; + + /** + * The hook to check equality. + * @since 2.0.0 + */ + hook?: SomeHook; + + /** + * The value to check equality. + * @since 2.0.0 + */ + value?: Primitive; + + /** + * A path to the value to check equality. + * @since 2.0.0 + */ + path?: StringArray; +} + +/** + * The hook payload for {@link Method.Some} + * @see {@link Payload} + * @see {@link Payload.ByHook} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface SomeByHookPayload extends Payload, Payload.ByHook, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Some; + + /** + * The input hook for this payload. + * @since 2.0.0 + */ + hook: SomeHook; +} + +/** + * The data payload for {@link Method.Some} + * @see {@link Payload} + * @see {@link Payload.ByValue} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface SomeByValuePayload extends Payload, Payload.ByValue, Payload.Data { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Some; + + /** + * The input data for this payload. + * @since 2.0.0 + */ + value: Primitive; + + /** + * A path to the value to check equality. + * @since 2.0.0 + */ + path: StringArray; +} + +/** + * The hook for {@link SomeByHookPayload} + * @since 2.0.0 + */ +export type SomeHook = (value: Value) => Awaitable; diff --git a/src/lib/payloads/Update.ts b/src/lib/payloads/Update.ts new file mode 100644 index 00000000..d3c4140a --- /dev/null +++ b/src/lib/payloads/Update.ts @@ -0,0 +1,33 @@ +import type { Awaitable } from '@sapphire/utilities'; +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The union payload for {@link Method.Update} + * @see {@link Payload} + * @see {@link Payload.KeyPath} + * @see {@link Payload.OptionalData} + * @since 2.0.0 + */ +export interface UpdatePayload + extends Payload, + Payload.KeyPath, + Payload.OptionalData { + /** + * The method this payload is for. + * @since 2.0.0 + */ + method: Method.Update; + + /** + * The hook to update stored value. + * @since 2.0.0 + */ + hook: UpdateHook; +} + +/** + * The hook for {@link UpdateByHookPayload} + * @since 2.0.0 + */ +export type UpdateHook = (value: HookValue) => Awaitable; diff --git a/src/lib/payloads/Values.ts b/src/lib/payloads/Values.ts new file mode 100644 index 00000000..bf19edfd --- /dev/null +++ b/src/lib/payloads/Values.ts @@ -0,0 +1,16 @@ +import type { Method } from '../types'; +import type { Payload } from './Payload'; + +/** + * The payload for {@link Method.Values} + * @see {@link Payload} + * @see {@link Payload.Data} + * @since 2.0.0 + */ +export interface ValuesPayload extends Payload, Payload.Data { + /** + * The method for this payload + * @since 2.0.0 + */ + method: Method.Values; +} diff --git a/src/lib/payloads/index.ts b/src/lib/payloads/index.ts new file mode 100644 index 00000000..679c8bf4 --- /dev/null +++ b/src/lib/payloads/index.ts @@ -0,0 +1,28 @@ +export * from './AutoKey'; +export * from './Clear'; +export * from './Dec'; +export * from './Delete'; +export * from './Ensure'; +export * from './Every'; +export * from './Filter'; +export * from './Find'; +export * from './Get'; +export * from './GetAll'; +export * from './GetMany'; +export * from './Has'; +export * from './Inc'; +export * from './Keys'; +export * from './Map'; +export * from './Math'; +export * from './Partition'; +export * from './Payload'; +export * from './Push'; +export * from './Random'; +export * from './RandomKey'; +export * from './Remove'; +export * from './Set'; +export * from './SetMany'; +export * from './Size'; +export * from './Some'; +export * from './Update'; +export * from './Values'; diff --git a/src/lib/structures/Josh.ts b/src/lib/structures/Josh.ts new file mode 100644 index 00000000..a6a614c9 --- /dev/null +++ b/src/lib/structures/Josh.ts @@ -0,0 +1,1816 @@ +import { Awaitable, isFunction, isPrimitive, Primitive } from '@sapphire/utilities'; +import { writeFile } from 'fs/promises'; +import { emitWarning } from 'process'; +import type { CoreAutoEnsure } from '../../middlewares/CoreAutoEnsure'; +import { JoshError } from '../errors'; +import { convertLegacyExportJSON, isNodeEnvironment } from '../functions'; +import { + AutoKeyPayload, + ClearPayload, + DecPayload, + DeletePayload, + EnsurePayload, + EveryHook, + EveryPayload, + FilterHook, + FilterPayload, + FindHook, + FindPayload, + GetAllPayload, + GetManyPayload, + GetPayload, + HasPayload, + IncPayload, + KeysPayload, + MapHook, + MapPayload, + MathPayload, + PartitionHook, + PartitionPayload, + Payload, + PushPayload, + RandomKeyPayload, + RandomPayload, + RemoveHook, + RemovePayload, + SetManyPayload, + SetPayload, + SizePayload, + SomeHook, + SomePayload, + UpdateHook, + UpdatePayload, + ValuesPayload +} from '../payloads'; +import { BuiltInMiddleware, KeyPath, KeyPathJSON, MathOperator, Method, Path, StringArray, Trigger } from '../types'; +import { isLegacyExportJSON } from '../validators'; +import { MapProvider } from './default-provider'; +import { JoshProvider } from './JoshProvider'; +import { Middleware } from './Middleware'; +import { MiddlewareStore } from './MiddlewareStore'; + +/** + * The base class that makes Josh work. + * @see {@link Josh.Options} for all options available to the Josh class. + * @since 2.0.0 + * + * @example + * ```javascript + * const josh = new Josh({ + * name: 'name', + * // More options... + * }); + * ``` + * + * @example + * ```javascript + * // Using a provider. + * const josh = new Josh({ + * name: 'name', + * provider: new Provider(), + * // More options... + * }); + * ``` + */ +export class Josh { + /** + * This Josh's name. Used for middleware and/or provider information. + * @since 2.0.0 + */ + public name: string; + + /** + * This Josh's options. Used throughout the instance. + * @since 2.0.0 + */ + public options: Josh.Options; + + /** + * This Josh's middlewares. + * + * NOTE: Do not use this unless you know what your doing. + * @since 2.0.0 + */ + public middlewares: MiddlewareStore; + + /** + * This Josh's provider instance. + * + * NOTE: Do not use this unless you know what your doing. + */ + public provider: JoshProvider; + + public constructor(options: Josh.Options) { + const { name, provider } = options; + + this.options = options; + + if (!name) + throw new JoshError({ identifier: Josh.Identifiers.MissingName, message: 'The "name" option is required to initiate a Josh instance.' }); + + this.name = name; + this.provider = provider ?? new MapProvider({}); + + if (!(this.provider instanceof JoshProvider)) + throw new JoshError({ + identifier: Josh.Identifiers.InvalidProvider, + message: 'The "provider" option must extend the exported "JoshProvider" class.' + }); + + this.middlewares = new MiddlewareStore({ instance: this }); + } + + /** + * The initialization method for Josh. + * @since 2.0.0 + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await josh.init(); + * ``` + */ + public async init(): Promise { + const context = await this.provider.init({ name: this.name, instance: this }); + + if (context.error) throw context.error; + + return this; + } + + /** + * Adds a middleware by providing options and a hook. + * @since 2.0.0 + * @param options The options for this middleware instance. + * @param hook The hook to run for the payload. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * josh.use({ name: 'my-middleware' }, (payload) => payload); + * ``` + */ + public use

(options: Josh.UseMiddlewareOptions, hook: (payload: P) => Awaitable

): this; + + /** + * Adds a middleware by providing a {@link Middleware} instance. + * @since 2.0.0 + * @param instance The middleware instance. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * josh.use(new MyMiddleware()); + * ``` + */ + public use(instance: Middleware): this; + public use

(optionsOrInstance: Josh.UseMiddlewareOptions | Middleware, hook?: (payload: P) => Awaitable

): this { + if (optionsOrInstance instanceof Middleware) this.middlewares.set(optionsOrInstance.name, optionsOrInstance); + else { + if (hook === undefined) + throw new JoshError({ + identifier: Josh.Identifiers.UseMiddlewareHookNotFound, + message: 'The "hook" parameter for middleware was not found.' + }); + + const { name, position, trigger, method } = optionsOrInstance; + const options: Middleware.Options = { name, position, conditions: { pre: [], post: [] } }; + const middleware = this.middlewares.get(options.name) ?? new Middleware(options).init(this.middlewares); + + if (trigger !== undefined && method !== undefined) options.conditions[trigger === Trigger.PreProvider ? 'pre' : 'post'].push(method); + + Object.defineProperty(middleware, method === undefined ? 'run' : method, { value: hook }); + + this.middlewares.set(middleware.name, middleware); + } + + return this; + } + + /** + * Generate an automatic key. Generally an integer incremented by `1`, but depends on provider. + * @since 2.0.0 + * @returns The newly generated automatic key. + * + * @example + * ```javascript + * const key = await josh.autoKey(); + * + * await josh.set(key, 'value'); + * ``` + */ + public async autoKey(): Promise { + let payload: AutoKeyPayload = { method: Method.AutoKey, trigger: Trigger.PreProvider, data: '' }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.AutoKey)) payload = await middleware[Method.AutoKey](payload); + + payload = await this.provider[Method.AutoKey](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.AutoKey)) payload = await middleware[Method.AutoKey](payload); + + return payload.data; + } + + /** + * Clears all stored values from the provider. + * + * NOTE: This deletes **all** data and cannot be reversed. + * @since 2.0.0 + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.clear(); + * + * await josh.get('key'); // null + * ``` + */ + public async clear(): Promise { + let payload: ClearPayload = { method: Method.Clear, trigger: Trigger.PreProvider }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Clear)) payload = await middleware[Method.Clear](payload); + + payload = await this.provider[Method.Clear](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Clear)) payload = await middleware[Method.Clear](payload); + + return this; + } + + /** + * Decrement an integer by `1`. + * @since 2.0.0 + * @param keyPath The key/path to the integer for decrementing. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await josh.set('key', 1); + * + * await josh.inc('key'); + * + * await josh.get('key'); // 0 + * ``` + * + * @example + * ```javascript + * await josh.set('key', 1); + * + * await josh.inc({ key: 'key' }); + * + * await josh.get('key'); // 0 + * ``` + * + * @example + * ```javascript + * await josh.set('key.path', 1); + * + * await josh.inc('key.path'); + * + * await josh.get('key.path'); // 0 + * ``` + * + * @example + * ```javascript + * await josh.set('key.path', 1); + * + * await josh.inc({ key: 'key', path: 'path' }); + * + * await josh.get('key.path'); // 0 + * ``` + * + * @example + * ```javascript + * await josh.set('key.path', 1); + * + * await josh.inc({ key: 'key', path: ['path'] }); + * + * await josh.get('key.path'); // 0 + * ``` + */ + public async dec(keyPath: KeyPath): Promise { + const [key, path] = this.getKeyPath(keyPath); + let payload: DecPayload = { method: Method.Dec, trigger: Trigger.PreProvider, key, path }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Dec)) payload = await middleware[Method.Dec](payload); + + payload = await this.provider[Method.Dec](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Dec)) payload = await middleware[Method.Dec](payload); + + return this; + } + + /** + * Deletes a key or path in a key value. + * @since 2.0.0 + * @param keyPath The key/path to delete from. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.delete('key'); + * + * await josh.get('key'); // null + * ``` + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.delete({ key: 'key' }); + * + * await josh.get('key'); // null + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.delete('key.path'); + * + * await josh.get('key'); // {} + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.delete({ key: 'key', path: 'path' }); + * + * await josh.get('key'); // {} + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.delete({ key: 'key', path: ['path'] }); + * + * await josh.get('key'); // {} + * ``` + */ + public async delete(keyPath: KeyPath): Promise { + const [key, path] = this.getKeyPath(keyPath); + let payload: DeletePayload = { method: Method.Delete, trigger: Trigger.PreProvider, key, path }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Delete)) payload = await middleware[Method.Delete](payload); + + payload = await this.provider[Method.Delete](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Delete)) payload = await middleware[Method.Delete](payload); + + return this; + } + + /** + * Ensure a key exists and set a default value if it doesn't. + * @since 2.0.0 + * @param key The key to ensure. + * @param defaultValue The default value to set if the key doesn't exist. + * @returns The value gotten from the key. + * + * @example + * ```javascript + * await josh.ensure('key', 'defaultValue'); // 'defaultValue' + * ``` + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.ensure('key', 'defaultValue'); // 'value' + * ``` + */ + public async ensure(key: string, defaultValue: StoredValue): Promise { + let payload: EnsurePayload = { method: Method.Ensure, trigger: Trigger.PreProvider, key, defaultValue, data: defaultValue }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Ensure)) payload = await middleware[Method.Ensure](payload); + + payload = await this.provider[Method.Ensure](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Ensure)) payload = await middleware[Method.Ensure](payload); + + return payload.data; + } + + /** + * Checks every stored value at a path against the given value. Identical behavior to [Array#every](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every). + * @since 2.0.0 + * @param path The path at which the stored value is at. + * @param value The primitive value to check against the stored value. + * @returns A boolean of whether every value matched. + * + * @example + * ```javascript + * await josh.every('path', 'value'); // true + * await josh.every(['path'], 'value'); // true + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * await josh.set('key2', { path: 'value2' }); + * + * await josh.every('path', 'value'); // false + * await josh.every(['path'], 'value'); // false + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * await josh.set('key2', { path: 'value' }); + * + * await josh.every('path', 'value'); // true + * await josh.evert(['path'], 'value') // true + * ``` + */ + public async every(path: Path, value: Primitive): Promise; + + /** + * Checks every stored value with a function. Identical Behavior to [Array#every](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every). + * @since 2.0.0 + * @param hook The hook function to check against stored values. + * @returns A boolean of whether every hook function returns true. + * + * @example + * ```javascript + * await josh.every((value) => value === 'value'); // true + * ``` + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * await josh.set('key2', 'value2'); + * + * await josh.every((value) => value === 'value'); // false + * ``` + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * await josh.set('key2', 'value'); + * + * await josh.every((value) => value === 'value'); // true + * ``` + */ + public async every(hook: EveryHook): Promise; + public async every(pathOrHook: Path | EveryHook, value?: Primitive): Promise { + if (!isFunction(pathOrHook)) { + if (value === undefined) + throw new JoshError({ identifier: Josh.Identifiers.EveryMissingValue, message: 'The "value" parameter was not found.' }); + if (!isPrimitive(value)) + throw new JoshError({ identifier: Josh.Identifiers.EveryInvalidValue, message: 'The "value" parameter must be a primitive type.' }); + } + + let payload: EveryPayload = { + method: Method.Every, + trigger: Trigger.PreProvider, + type: isFunction(pathOrHook) ? Payload.Type.Hook : Payload.Type.Value, + data: true + }; + + if (isFunction(pathOrHook)) payload.hook = pathOrHook; + else { + payload.path = this.getPath(pathOrHook); + payload.value; + } + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Every)) payload = await middleware[Method.Every](payload); + + payload = await this.provider[Method.Every](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Every)) payload = await middleware[Method.Every](payload); + + return payload.data; + } + + /** + * Filter stored values using a path and value. + * @since 2.0.0 + * @param path A path to the value for equality check. + * @param value The value to check equality. + * @param returnBulkType The return bulk type. Defaults to {@link Bulk.Object} + * @returns The bulk data. + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.filter('path', 'value'); // { key: { path: 'value' } } + * await josh.filter(['path'], 'value', Bulk.OneDimensionalArray); // [{ path: 'value' }] + * ``` + */ + public async filter>( + path: Path, + value: Primitive, + returnBulkType?: BulkType + ): Promise[BulkType]>; + + /** + * Filter stored data using a hook function. + * @since 2.0.0 + * @param hook The hook function to check equality. + * @param _value Unused. + * @param returnBulkType The return bulk type. Defaults to {@link Bulk.Object} + * @returns The bulk data. + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.filter((value) => value === 'value'); // { key: { path: 'value' } } + * await josh.filter((value) => value === 'value', undefined, Bulk.TwoDimensionalArray); // [['key', 'value']] + * ``` + */ + public async filter>( + hook: FilterHook, + _value: undefined, + returnBulkType?: BulkType + ): Promise[BulkType]>; + + public async filter>( + pathOrHook: Path | FilterHook, + value?: Primitive, + returnBulkType?: BulkType + ): Promise[BulkType]> { + if (!isFunction(pathOrHook)) { + if (value === undefined) + throw new JoshError({ identifier: Josh.Identifiers.FilterMissingValue, message: 'The "value" parameter was not found.' }); + if (!isPrimitive(value)) + throw new JoshError({ identifier: Josh.Identifiers.FilterInvalidValue, message: 'The "value" parameter must be a primitive type.' }); + } + + let payload: FilterPayload = { + method: Method.Filter, + trigger: Trigger.PreProvider, + type: isFunction(pathOrHook) ? Payload.Type.Hook : Payload.Type.Value, + data: {} + }; + + if (isFunction(pathOrHook)) payload.hook = pathOrHook; + else { + payload.path = this.getPath(pathOrHook); + payload.value = value; + } + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Filter)) payload = await middleware[Method.Filter](payload); + + payload = await this.provider[Method.Filter](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Filter)) payload = await middleware[Method.Filter](payload); + + return this.convertBulkData(payload.data, returnBulkType); + } + + /** + * Find a stored value using a path and value. + * @since 2.0.0 + * @param path A path to the value for equality check. + * @param value The value to check equality. + * @returns The found value or null. + * + * @example + * ```javascript + * await josh.find('path', 'value'); // null + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.find('path', 'value'); // { path: 'value' } + * ``` + */ + public async find(path: Path, value: Primitive): Promise; + + /** + * Find a stored value using a hook function. + * @since 2.0.0 + * @param hook The hook to check equality. + * @returns The found value or null. + * + * @example + * ```javascript + * await josh.find((value) => value === 'value'); // null + * ``` + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.find((value) => value === 'value'); // 'value' + * ``` + */ + public async find(hook: FindHook): Promise; + public async find(pathOrHook: Path | FindHook, value?: Primitive): Promise { + if (!isFunction(pathOrHook)) { + if (value === undefined) + throw new JoshError({ identifier: Josh.Identifiers.FindMissingValue, message: 'The "value" parameter was not found.' }); + if (!isPrimitive(value)) + throw new JoshError({ identifier: Josh.Identifiers.FindInvalidValue, message: 'The "value" parameter must be a primitive type.' }); + } + + let payload: FindPayload = { + method: Method.Find, + trigger: Trigger.PreProvider, + type: isFunction(pathOrHook) ? Payload.Type.Hook : Payload.Type.Value + }; + + if (isFunction(pathOrHook)) payload.hook = pathOrHook; + else { + payload.path = this.getPath(pathOrHook); + payload.value = value; + } + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Find)) payload = await middleware[Method.Find](payload); + + payload = await this.provider[Method.Find](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Find)) payload = await middleware[Method.Find](payload); + + return payload.data ?? null; + } + + /** + * Get a value using a key. + * @since 2.0.0 + * @param key A key at which a value is. + * @returns The value gotten or null. + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.get('key'); // 'value' + * ``` + */ + public async get(key: string): Promise; + + /** + * Get a value using a key and/or path. + * @since 2.0.0 + * @param keyPath A key and/or path at which a value is. + * @returns The value gotten or null. + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.get('key'); // { path: 'value' } + * await josh.get({ key: 'key' }); // { path: 'value' } + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.get('key.path'); // 'value' + * await josh.get({ key: 'key', path: 'path' }); // 'value' + * await josh.get({ key: 'key', path: ['path'] }); //'value' + * ``` + */ + public async get(keyPath: KeyPath): Promise { + const [key, path] = this.getKeyPath(keyPath); + let payload: GetPayload = { method: Method.Get, trigger: Trigger.PreProvider, key, path }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Get)) payload = await middleware[Method.Get](payload); + + payload = await this.provider.get(payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Get)) payload = await middleware[Method.Get](payload); + + return payload.data ?? null; + } + + /** + * Get all stored values. + * @since 2.0.0 + * @param returnBulkType The return bulk type. Defaults to {@link Bulk.Object} + * @returns The bulk data. + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.getAll(); // { key: 'value' } + * await josh.getAll(Bulk.OneDimensionalArray); // ['value'] + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.getAll(); // { key: { path: 'value' } } + * await josh.getAll(Bulk.TwoDimensionalArray); // [['key', { path: 'value' }]] + * ``` + */ + public async getAll = Bulk.Object>( + returnBulkType?: BulkType + ): Promise[BulkType]> { + let payload: GetAllPayload = { method: Method.GetAll, trigger: Trigger.PreProvider, data: {} }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.GetAll)) payload = await middleware[Method.GetAll](payload); + + payload = await this.provider.getAll(payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.GetAll)) payload = await middleware[Method.GetAll](payload); + + return this.convertBulkData(payload.data, returnBulkType); + } + + /** + * Get stored values at multiple keys. + * @since 2.0.0 + * @param keys An array of keys to get values from. + * @param returnBulkType The return bulk type. Defaults to {@link Bulk.Object} + * @returns The bulk data. + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await this.getMany(['key']); // { key: 'value' } + * await this.getMany(['key'], Bulk.OneDimensionalArray); // ['value'] + * ``` + */ + public async getMany>( + keys: StringArray, + returnBulkType?: BulkType + ): Promise[BulkType]> { + let payload: GetManyPayload = { method: Method.GetMany, trigger: Trigger.PreProvider, keys, data: {} }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.GetMany)) payload = await middleware[Method.GetMany](payload); + + payload = await this.provider[Method.GetMany](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.GetMany)) payload = await middleware[Method.GetMany](payload); + + return this.convertBulkData(payload.data, returnBulkType); + } + + /** + * Check if a key and/or path exists. + * @since 2.0.0 + * @param keyPath A key and/or path to the value to check for. + * @returns Whether the value exists. + * + * @example + * ```javascript + * await josh.has('key'); // false + * await josh.has({ key: 'key' }) // false + * + * await josh.set('key', 'value'); + * + * await josh.has('key'); // true + * await josh.has({ key: 'key' }) // true + * ``` + * + * @example + * ```javascript + * await josh.has('key.path'); // false + * await josh.has({ key: 'key', path: 'path' }); // false + * await josh.has({ key: 'key', path: ['path'] }) // false + * + * await josh.set('key', { path: 'value' }); + * + * await josh.has('key.path'); // true + * await josh.has({ key: 'key', path: 'path' }); // true + * await josh.has({ key: 'key', path: ['path'] }) // true + * ``` + */ + public async has(keyPath: KeyPath): Promise { + const [key, path] = this.getKeyPath(keyPath); + let payload: HasPayload = { method: Method.Has, trigger: Trigger.PreProvider, key, path, data: false }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Has)) payload = await middleware[Method.Has](payload); + + payload = await this.provider.has(payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Has)) payload = await middleware[Method.Has](payload); + + return payload.data; + } + + /** + * Increment an integer by `1`. + * @since 2.0.0 + * @param keyPath The key and/or path to an integer value for incrementing. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await josh.set('key', 0); + * + * await josh.inc('key'); + * + * await josh.get('key'); // 1 + * ``` + * + * @example + * ```javascript + * await josh.set('key', 0); + * + * await josh.inc({ key: 'key' }); + * + * await josh.get('key'); // 1 + * ``` + * + * @example + * ```javascript + * await josh.set('key.path', 0); + * + * await josh.inc('key.path'); + * + * await josh.get('key.path'); // 1 + * ``` + * + * @example + * ```javascript + * await josh.set('key.path', 0); + * + * await josh.inc({ key: 'key', path: 'path' }); + * + * await josh.get('key.path'); // 1 + * ``` + * + * @example + * ```javascript + * await josh.set('key.path', 0); + * + * await josh.inc({ key: 'key', path: ['path'] }); + * + * await josh.get('key.path'); // 1 + * ``` + */ + public async inc(keyPath: KeyPath): Promise { + const [key, path] = this.getKeyPath(keyPath); + let payload: IncPayload = { method: Method.Inc, trigger: Trigger.PreProvider, key, path }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Inc)) payload = await middleware[Method.Inc](payload); + + payload = await this.provider.inc(payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Inc)) payload = await middleware[Method.Inc](payload); + + return this; + } + + /** + * Returns all stored value keys. + * @since 2.0.0 + * @returns The array of stored value keys. + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.keys(); // ['key'] + * ``` + */ + public async keys(): Promise { + let payload: KeysPayload = { method: Method.Keys, trigger: Trigger.PreProvider, data: [] }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Keys)) payload = await middleware[Method.Keys](payload); + + payload = await this.provider.keys(payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Keys)) payload = await middleware[Method.Keys](payload); + + return payload.data; + } + + /** + * Map stored values by path or hook function. + * @since 2.0.0 + * @param pathOrHook The path or hook to map by. + * @returns The mapped values. + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.map('path'); // ['value'] + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * + * await josh.map(['path']); // 'value' + * ``` + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.map((value) => value.toUpperCase()); // ['VALUE'] + * ``` + */ + public async map(pathOrHook: Path | MapHook): Promise { + let payload: MapPayload = { + method: Method.Map, + trigger: Trigger.PreProvider, + type: isFunction(pathOrHook) ? Payload.Type.Hook : Payload.Type.Path, + data: [] + }; + + if (isFunction(pathOrHook)) payload.hook = pathOrHook; + else payload.path = this.getPath(pathOrHook); + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Map)) payload = await middleware[Method.Map](payload); + + payload = await this.provider[Method.Map](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Map)) payload = await middleware[Method.Map](payload); + + return payload.data; + } + + /** + * Executes math operations on a value with an operand at a specified key and/or path. + * @since 2.0.0 + * @param keyPath The key and/or path the value is at. + * @param operator The operator that will be used on the operand and value. + * @param operand The operand to apply to the value. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await josh.set('key', 0); + * + * await josh.math('key', MathOperator.Addition, 1); + * + * await josh.get('key'); // 1 + * ``` + * + * @example + * ```javascript + * await josh.set('key', 1); + * + * await josh.math('key', MathOperator.Subtraction, 1); + * + * await josh.get('key'); // 0 + * ``` + * + * @example + * ```javascript + * await josh.set('key', 1); + * + * await josh.math('key', MathOperator.Multiplication, 2); + * + * await josh.get('key'); // 2 + * ``` + * + * @example + * ```javascript + * await josh.set('key', 2); + * + * await josh.math('key' MathOperator.Division, 2); + * + * await josh.get('key'); 1 + * ``` + */ + public async math(keyPath: KeyPath, operator: MathOperator, operand: number): Promise { + const [key, path] = this.getKeyPath(keyPath); + let payload: MathPayload = { method: Method.Math, trigger: Trigger.PreProvider, key, path, operator, operand }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Math)) payload = await middleware[Method.Math](payload); + + payload = await this.provider[Method.Math](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Math)) payload = await middleware[Method.Math](payload); + + return this; + } + + /** + * Filter stored values and get both truthy and falsy results. + * @since 2.0.0 + * @param hook The hook function to check equality. + * @param _value Unused. + * @param returnBulkType The return bulk type, Defaults to {@link Bulk.Object} + * @returns A partition of filtered bulk data. First bulk data is the truthy filter and the second bulk data is the falsy filter. + * + * @example + * ```javascript + * await josh.set('key', true); + * await josh.set('key2', false); + * + * await josh.partition((value) => value); // [{ key: true }, { key2: false }] + * ``` + */ + public async partition>( + hook: PartitionHook, + _value: undefined, + returnBulkType: BulkType + ): Promise<[ReturnBulk[BulkType], ReturnBulk[BulkType]]>; + + /** + * Filter stored values and get both truthy and falsy results. + * @since 2.0.0 + * @param path A path to the value for equality check. + * @param value The value to check equality. + * @param returnBulkType The return bulk type. Defaults to {@link Bulk.Object} + * @returns A partition of filtered bulk data. First bulk data is the truthy filter and the second bulk data is the falsy filter. + * + * @example + * ```javascript + * await josh.set('key', { path: true }); + * await josh.set('key2', { path: false }); + * + * await josh.partition('path'); // [{ key: true }, { key2: false }] + * ``` + */ + public async partition>( + path: Path, + value: Primitive, + returnBulkType: BulkType + ): Promise<[ReturnBulk[BulkType], ReturnBulk[BulkType]]>; + + public async partition>( + pathOrHook: Path | PartitionHook, + value?: Primitive, + returnBulkType?: BulkType + ): Promise<[ReturnBulk[BulkType], ReturnBulk[BulkType]]> { + if (!isFunction(pathOrHook)) { + if (value === undefined) + throw new JoshError({ identifier: Josh.Identifiers.PartitionMissingValue, message: 'The "value" parameter was not found.' }); + if (!isPrimitive(value)) + throw new JoshError({ identifier: Josh.Identifiers.PartitionInvalidValue, message: 'The "value" parameter must be a primitive type.' }); + } + + let payload: PartitionPayload = { + method: Method.Partition, + trigger: Trigger.PreProvider, + type: isFunction(pathOrHook) ? Payload.Type.Hook : Payload.Type.Value, + data: { truthy: {}, falsy: {} } + }; + + if (isFunction(pathOrHook)) payload.hook = pathOrHook; + else { + payload.path = this.getPath(pathOrHook); + payload.value = value; + } + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Partition)) payload = await middleware[Method.Partition](payload); + + payload = await this.provider[Method.Partition](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Partition)) payload = await middleware[Method.Partition](payload); + + const { truthy, falsy } = payload.data; + + return [this.convertBulkData(truthy, returnBulkType), this.convertBulkData(falsy, returnBulkType)]; + } + + /** + * Push a value to an array. + * @since 2.0.0 + * @param keyPath A key and/or path to the array. + * @param value The value to push. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await josh.set('key', []); + * + * await josh.push('key', 'value'); + * await josh.push({ key: 'key' }, 'value'); + * + * await josh.get('key'); // ['value'] + * ``` + * + * @example + * ```javascript + * await josh.set('key', { path: [] }); + * + * await josh.push('key.path', 'value'); + * await josh.push({ key: 'key', path: 'path' }, 'value'); + * await josh.push({ key: 'key', path: ['path'] }, 'value'); + * + * await josh.get('key.path'); // ['value'] + * ``` + */ + public async push(keyPath: KeyPath, value: Value): Promise { + const [key, path] = this.getKeyPath(keyPath); + let payload: PushPayload = { method: Method.Push, trigger: Trigger.PreProvider, key, path, value }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Push)) payload = await middleware[Method.Push](payload); + + payload = await this.provider[Method.Push](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Push)) payload = await middleware[Method.Push](payload); + + return this; + } + + /** + * Get a random value. + * @since 2.0.0 + * @returns The random data or `null`. + * + * @example + * ```javascript + * await josh.random(); // null + * ``` + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.random(); // 'value' + * ``` + */ + public async random(): Promise { + let payload: RandomPayload = { method: Method.Random, trigger: Trigger.PreProvider }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Random)) payload = await middleware[Method.Random](payload); + + payload = await this.provider[Method.Random](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Random)) payload = await middleware[Method.Random](payload); + + return payload.data ?? null; + } + + /** + * Get a random key. + * @since 2.0.0 + * @returns The random key or `null`. + * + * @example + * ```javascript + * await josh.randomKey(); // null + * ``` + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.randomKey(); // null + * ``` + */ + public async randomKey(): Promise { + let payload: RandomKeyPayload = { method: Method.RandomKey, trigger: Trigger.PreProvider }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.RandomKey)) payload = await middleware[Method.RandomKey](payload); + + payload = await this.provider.randomKey(payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.RandomKey)) payload = await middleware[Method.RandomKey](payload); + + return payload.data ?? null; + } + + /** + * Removes an element from an array at a key and/or path that matches the given value. + * @since 2.0.0 + * @param keyPath The key and/or path to the array to remove an element. + * @param value The value to match to an element in the array. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await provider.set('key', ['value']); + * + * await provider.remove('key', 'value'); + * + * await provider.get('key'); // [] + * ``` + */ + public async remove(keyPath: KeyPath, value: Primitive): Promise; + + /** + * Removes an element from an array at a key and/or path that are validated by a hook function. + * @since 2.0.0 + * @param keyPath The key and/or path to the array to remove an element. + * @param hook The hook function to validate elements in the array. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await provider.set('key', ['value']); + * + * await provider.remove('key', (value) => value === 'value'); + * + * await provider.get('key'); // [] + * ``` + */ + public async remove(keyPath: KeyPath, hook: RemoveHook): Promise; + public async remove(keyPath: KeyPath, valueOrHook: Primitive | RemoveHook): Promise { + const [key, path] = this.getKeyPath(keyPath); + + if (!isFunction(valueOrHook)) { + if (!isPrimitive(valueOrHook)) + throw new JoshError({ identifier: Josh.Identifiers.RemoveInvalidValue, message: 'The "value" parameter was not of a primitive type.' }); + } + + let payload: RemovePayload = { + method: Method.Remove, + trigger: Trigger.PreProvider, + type: isFunction(valueOrHook) ? Payload.Type.Hook : Payload.Type.Value, + key, + path + }; + + if (isFunction(valueOrHook)) payload.hook = valueOrHook; + else payload.value = valueOrHook; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Remove)) payload = await middleware[Method.Remove](payload); + + payload = await this.provider[Method.Remove](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Remove)) payload = await middleware[Method.Remove](payload); + + return this; + } + + /** + * Sets a value using a key and/or path. + * @since 2.0.0 + * @param keyPath The key and/or path to set the value to. + * @param value The value to set at the key and/or path. + * @returns The {@link Josh} instance. + * + * @example + * ```javascript + * await josh.set('key', { path: 'value' }); + * await josh.set({ key: 'key' }); + * ``` + * + * @example + * ```javascript + * await josh.set('key.path'); + * await josh.set({ key: 'key', path: 'path' }); + * await josh.set({ key: 'key', path: ['path'] }); + * ``` + */ + public async set(keyPath: KeyPath, value: Value): Promise { + const [key, path] = this.getKeyPath(keyPath); + let payload: SetPayload = { method: Method.Set, trigger: Trigger.PreProvider, key, path, value }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Set)) payload = await middleware[Method.Set](payload); + + payload = await this.provider[Method.Set](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Set)) payload = await middleware[Method.Set](payload); + + return this; + } + + public async setMany(entries: [KeyPath, Value][]): Promise { + let payload: SetManyPayload = { + method: Method.SetMany, + trigger: Trigger.PreProvider, + data: entries.map(([keyPath, value]) => { + const [key, path] = this.getKeyPath(keyPath); + + return [{ key, path: this.getPath(path) }, value]; + }) + }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.SetMany)) payload = await middleware[Method.SetMany](payload); + + payload = await this.provider[Method.SetMany](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.SetMany)) payload = await middleware[Method.SetMany](payload); + + return this; + } + + /** + * Get the amount of key/values + * @since 2.0.0 + * @returns The number amount. + * + * @example + * ```javascript + * await josh.size(); // 0 + * ``` + */ + public async size(): Promise { + let payload: SizePayload = { method: Method.Size, trigger: Trigger.PreProvider, data: 0 }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Size)) payload = await middleware[Method.Size](payload); + + payload = await this.provider[Method.Size](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Size)) payload = await middleware[Method.Size](payload); + + return payload.data; + } + + /** + * Verify if a path's value matches a value. + * @since 2.0.0 + * @param path A path to the value for equality check. + * @param value The value to check equality. + * + * @example + * ```javascript + * await provider.some('path', 'value'); // false + * ``` + * + * @example + * ```javascript + * await provider.set('key.path', 'value'); + * + * await provider.some('path', 'value'); // true + * ``` + * + */ + public async some(path: Path, value: Primitive): Promise; + + /** + * Verify if a stored value matches with a hook function, + * @since 2.0.0 + * @param hook The hook to check equality. + * + * @example + * ```javascript + * await provider.some((value) => value === 'value'); // false + * ``` + * + * @example + * ```javascript + * await provider.set('key.path', 'value'); + * + * await provider.some('path', 'value'); // true + * ``` + */ + public async some(hook: SomeHook): Promise; + public async some(pathOrHook: Path | SomeHook, value?: Primitive): Promise { + if (!isFunction(pathOrHook)) { + if (value === undefined) + throw new JoshError({ identifier: Josh.Identifiers.SomeMissingValue, message: 'The "value" parameter was not found.' }); + if (!isPrimitive(value)) + throw new JoshError({ identifier: Josh.Identifiers.SomeInvalidValue, message: 'The "value" parameter must be a primitive type.' }); + } + + let payload: SomePayload = { + method: Method.Some, + trigger: Trigger.PreProvider, + type: isFunction(pathOrHook) ? Payload.Type.Hook : Payload.Type.Value, + data: false + }; + + if (isFunction(pathOrHook)) payload.hook = pathOrHook; + else { + payload.path = this.getPath(pathOrHook); + payload.value = value; + } + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Some)) payload = await middleware[Method.Some](payload); + + payload = await this.provider[Method.Some](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Some)) payload = await middleware[Method.Some](payload); + + return payload.data; + } + + /** + * Update a stored value using a hook function. + * @param keyPath The key and/or path to the stored value for updating. + * @param hook The hook to update the stored value. + * @returns The updated value or null. + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * + * await josh.update('key', (value) => value.toUpperCase()); // 'VALUE' + * ``` + */ + public async update(keyPath: KeyPath, hook: UpdateHook): Promise { + const [key, path] = this.getKeyPath(keyPath); + let payload: UpdatePayload = { method: Method.Update, trigger: Trigger.PreProvider, key, path, hook }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Update)) payload = await middleware[Method.Update](payload); + + payload = await this.provider[Method.Update](payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Update)) payload = await middleware[Method.Update](payload); + + return payload.data ?? null; + } + + /** + * Get all stored values. + * @since 2.0.0 + * @returns An array of stored values. + * + * @example + * ```javascript + * await josh.set('key', 'value'); + * await josh.set('anotherKey', 'anotherValue'); + * + * await josh.values(); // ['value', 'anotherValue'] + * ``` + */ + public async values(): Promise { + let payload: ValuesPayload = { method: Method.Values, trigger: Trigger.PreProvider, data: [] }; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPreMiddlewares(Method.Values)) payload = await middleware[Method.Values](payload); + + payload = await this.provider.values(payload); + payload.trigger = Trigger.PostProvider; + + if (payload.error) throw payload.error; + + for (const middleware of this.middlewares.array()) await middleware.run(payload); + for (const middleware of this.middlewares.getPostMiddlewares(Method.Values)) payload = await middleware[Method.Values](payload); + + return payload.data; + } + + public async import(options: Josh.ImportOptions): Promise { + let { json, overwrite, clear } = options; + + if (isLegacyExportJSON(json)) { + emitWarning( + new JoshError({ + identifier: Josh.Identifiers.LegacyDeprecation, + message: 'You have imported data from a deprecated legacy format. This will be removed in the next semver major version.' + }) + ); + + json = convertLegacyExportJSON(json); + } + + if (clear) await this.provider[Method.Clear]({ method: Method.Clear }); + + if (overwrite) + await this.provider[Method.SetMany]({ + method: Method.SetMany, + data: json.entries.map(([key, value]) => [{ key, path: [] }, value]) + }); + else + for (const [key, value] of json.entries) { + const { data } = await this.provider[Method.Has]({ method: Method.Has, key, path: [], data: true }); + + if (data) continue; + + await this.provider[Method.Set]({ method: Method.Set, key, path: [], value }); + } + + return this; + } + + /** + * Exports all data from the provider. + * @since 2.0.0 + * @returns The exported data json object. + */ + public async export(path?: string): Promise> { + const entries = Object.entries(await this.provider[Method.GetAll]({ method: Method.GetAll, data: {} })); + const json: Josh.ExportJSON = { name: this.name, version: Josh.version, exportedTimestamp: Date.now(), entries }; + + if (path !== undefined && isNodeEnvironment()) await writeFile(path, JSON.stringify(json)); + + return json; + } + + /** A private method for converting bulk data. + * @since 2.0.0 + * @private + * @param data The data to convert. + * @param returnBulkType The return bulk type. Defaults to {@link Bulk.Object} + * @returns The bulk data. + */ + private convertBulkData = Bulk.Object>( + data: ReturnBulk[Bulk.Object], + returnBulkType?: K + ): ReturnBulk[K] { + switch (returnBulkType) { + case Bulk.Object: + return data; + + case Bulk.Map: + return new Map(Object.entries(data)); + + case Bulk.OneDimensionalArray: + return Object.values(data); + + case Bulk.TwoDimensionalArray: + return Object.entries(data); + + default: + return data; + } + } + + private getKeyPath(keyPath: KeyPath): [string, StringArray] { + if (typeof keyPath === 'object') return [keyPath.key, this.getPath(keyPath.path ?? [])]; + + const [key, ...path] = keyPath.split('.'); + + return [key, path]; + } + + private getPath(path: Path): StringArray { + return typeof path === 'string' ? path.split('.') : path; + } + + /** + * The current version of {@link Josh} + * @since 2.0.0 + */ + public static version = '[VI]{version}[/VI]'; + + /** + * A static method to create multiple instances of {@link Josh}. + * @since 2.0.0 + * @param names The names to give each instance of {@link Josh} + * @param options The options to give all the instances. + * @returns + */ + public static multi = Record>( + names: string[], + options: Omit = {} + ): Instances { + const instances: Record = {}; + + for (const [name, instance] of names.map((name) => [name, new Josh({ ...options, name })]) as [string, Josh][]) instances[name] = instance; + + // @ts-expect-error 2322 + return instances; + } +} + +export namespace Josh { + /** + * The options for {@link Josh}. + * @since 2.0.0 + */ + export interface Options { + /** + * The name for the Josh instance. + * @since 2.0.0 + */ + name?: string; + + /** + * The provider instance. + * @since 2.0.0 + */ + provider?: JoshProvider; + + middlewareContextData?: { + [BuiltInMiddleware.AutoEnsure]: CoreAutoEnsure.ContextData; + }; + } + + /** + * The options for the {@link Josh.use} method. + * @since 2.0.0 + */ + export interface UseMiddlewareOptions { + /** + * The name for the middleware. + * @since 2.0.0 + */ + name: string; + + /** + * The position for the middleware. + * @since 2.0.0 + */ + position?: number; + + /** + * The trigger for the middleware hook. + * @since 2.0.0 + */ + trigger?: Trigger; + + /** + * The trigger for the middleware hook. + * @since 2.0.0 + */ + method?: Method; + } + + export interface ExportJSON { + name: string; + + version: string; + + exportedTimestamp: number; + + entries: [string, StoredValue][]; + } + + export interface LegacyExportJSON { + name: string; + + version: string; + + exportDate: number; + + keys: { key: string; value: StoredValue }[]; + } + + export interface ImportOptions { + json: ExportJSON | LegacyExportJSON; + + overwrite?: boolean; + + clear?: boolean; + } + export interface SetManyOptions extends KeyPathJSON { + value: Value; + } + + export enum Identifiers { + EveryInvalidValue = 'everyInvalidValue', + + EveryMissingValue = 'everyMissingValue', + + FilterInvalidValue = 'filterInvalidValue', + + FilterMissingValue = 'filterMissingValue', + + FindInvalidValue = 'findInvalidValue', + + FindMissingValue = 'findMissingValue', + + InvalidProvider = 'invalidProvider', + + LegacyDeprecation = 'legacyDeprecation', + + MiddlewareNotFound = 'middlewareNotFound', + + MissingName = 'missingName', + + PartitionInvalidValue = 'partitionInvalidValue', + + PartitionMissingValue = 'partitionMissingValue', + + RemoveInvalidValue = 'removeInvalidValue', + + SomeInvalidValue = 'someInvalidValue', + + SomeMissingValue = 'someMissingValue', + + UseMiddlewareHookNotFound = 'useMiddlewareHookNotFound' + } +} + +export enum Bulk { + Object, + + Map, + + OneDimensionalArray, + + TwoDimensionalArray +} + +export interface ReturnBulk { + [Bulk.Object]: Record; + + [Bulk.Map]: Map; + + [Bulk.OneDimensionalArray]: Value[]; + + [Bulk.TwoDimensionalArray]: [string, Value][]; + + [K: string]: Record | Map | Value[] | [string, Value][]; +} diff --git a/src/lib/structures/JoshProvider.ts b/src/lib/structures/JoshProvider.ts new file mode 100644 index 00000000..04bfb898 --- /dev/null +++ b/src/lib/structures/JoshProvider.ts @@ -0,0 +1,433 @@ +import type { Awaitable } from '@sapphire/utilities'; +import type { JoshProviderError } from '../errors'; +import type { + AutoKeyPayload, + ClearPayload, + DecPayload, + DeletePayload, + EnsurePayload, + EveryByHookPayload, + EveryByValuePayload, + EveryPayload, + FilterByHookPayload, + FilterByValuePayload, + FilterPayload, + FindByHookPayload, + FindByValuePayload, + FindPayload, + GetAllPayload, + GetManyPayload, + GetPayload, + HasPayload, + IncPayload, + KeysPayload, + MapByHookPayload, + MapByPathPayload, + MapPayload, + MathPayload, + PartitionByHookPayload, + PartitionByValuePayload, + PartitionPayload, + PushPayload, + RandomKeyPayload, + RandomPayload, + RemoveByHookPayload, + RemoveByValuePayload, + RemovePayload, + SetManyPayload, + SetPayload, + SizePayload, + SomeByHookPayload, + SomeByValuePayload, + SomePayload, + UpdatePayload, + ValuesPayload +} from '../payloads'; +import type { Method } from '../types'; +import type { Josh } from './Josh'; + +/** + * The base provider class. Extend this class to create your own provider. + * + * NOTE: If you want an example of how to use this class please see `src/lib/structures/defaultProvider/MapProvider.ts` + * + * @see {@link JoshProvider.Options} for all options available to the JoshProvider class. + * + * @since 2.0.0 + * @example + * ```typescript + * export class Provider extends JoshProvider { + * // Implement methods... + * } + * ``` + */ +export abstract class JoshProvider { + /** + * The name for this provider. + * @since 2.0.0 + */ + public name?: string; + + /** + * The {@link Josh} instance for this provider. + * @since 2.0.0 + */ + public instance?: Josh; + + /** + * The options for this provider. + * @since 2.0.0 + */ + public options: JoshProvider.Options; + + public constructor(options: JoshProvider.Options) { + this.options = options; + } + + /** + * Initialize the provider. + * @since 2.0.0 + * @param context The provider's context sent by this provider's {@link Josh} instance. + * @returns The provider's context. + * + * @example + * ```typescript + * public async init(context: JoshProvider.Context): Promise> { + * // Initialize provider... + * context = await super.init(context); + * // Initialize provider... + * return context; + * } + * ``` + */ + public async init(context: JoshProvider.Context): Promise> { + const { name, instance } = context; + + this.name = name; + this.instance = instance; + + return Promise.resolve(context); + } + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.AutoKey](payload: AutoKeyPayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Clear](payload: ClearPayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Dec](payload: DecPayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Delete](payload: DeletePayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Ensure](payload: EnsurePayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Every](payload: EveryByHookPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Every](payload: EveryByValuePayload): Awaitable; + public abstract [Method.Every](payload: EveryPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Filter](payload: FilterByHookPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Filter](payload: FilterByValuePayload): Awaitable>; + public abstract [Method.Filter](payload: FilterPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Find](payload: FindByHookPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Find](payload: FindByValuePayload): Awaitable>; + public abstract [Method.Find](payload: FindPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Get](payload: GetPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.GetAll](payload: GetAllPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.GetMany](payload: GetManyPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Has](payload: HasPayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Inc](payload: IncPayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Keys](payload: KeysPayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Map](payload: MapByHookPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Map](payload: MapByPathPayload): Awaitable>; + public abstract [Method.Map]( + payload: MapPayload + ): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Math](payload: MathPayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Partition](payload: PartitionByHookPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Partition](payload: PartitionByValuePayload): Awaitable>; + public abstract [Method.Partition](payload: PartitionPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Push](payload: PushPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Random](payload: RandomPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.RandomKey](payload: RandomKeyPayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Remove](payload: RemoveByHookPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Remove](payload: RemoveByValuePayload): Awaitable; + public abstract [Method.Remove](payload: RemovePayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Set](payload: SetPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.SetMany](payload: SetManyPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Size](payload: SizePayload): Awaitable; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Some](payload: SomeByHookPayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Some](payload: SomeByValuePayload): Awaitable; + public abstract [Method.Some](payload: SomePayload): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Update]( + payload: UpdatePayload + ): Awaitable>; + + /** + * @since 2.0.0 + * @param payload The payload sent by this provider's {@link Josh} instance. + * @returns The payload (modified), originally sent by this provider's {@link Josh} instance. + */ + public abstract [Method.Values](payload: ValuesPayload): Awaitable>; +} + +export namespace JoshProvider { + /** + * The options to extend for {@link JoshProvider} + * @since 2.0.0 + * + * @example + * ```typescript + * export namespace Provider { + * export interface Options extends JoshProvider.Options { + * // Provider options... + * } + * } + * ``` + */ + export interface Options {} + + /** + * The context sent by the {@link Josh} instance. + * @since 2.0.0 + */ + export interface Context { + /** + * The name of this context. + * @since 2.0.0 + */ + name: string; + + /** + * The instance of this context. + * @since 2.0.0 + */ + instance?: Josh; + + /** + * The error of this context. + * @since 2.0.0 + */ + error?: JoshProviderError; + } + + export interface Constructor { + new (options: Options): JoshProvider; + } + + export enum CommonIdentifiers { + DecMissingData = 'decMissingData', + + DecInvalidType = 'decInvalidType', + + FilterInvalidValue = 'filterInvalidValue', + + FindInvalidValue = 'findInvalidValue', + + IncInvalidType = 'incInvalidType', + + IncMissingData = 'incMissingData', + + MathInvalidType = 'mathInvalidType', + + MathMissingData = 'mathMissingData', + + PartitionInvalidValue = 'partitionInvalidValue', + + PushInvalidType = 'pushInvalidType', + + PushMissingData = 'pushMissingData', + + RemoveInvalidType = 'removeInvalidType', + + RemoveMissingData = 'removeMissingData' + } +} diff --git a/src/lib/structures/Middleware.ts b/src/lib/structures/Middleware.ts new file mode 100644 index 00000000..a443c5af --- /dev/null +++ b/src/lib/structures/Middleware.ts @@ -0,0 +1,367 @@ +import type { Awaitable } from '@sapphire/utilities'; +import { JoshError } from '../errors'; +import type { + AutoKeyPayload, + ClearPayload, + DecPayload, + DeletePayload, + EnsurePayload, + EveryByHookPayload, + EveryByValuePayload, + EveryPayload, + FilterByHookPayload, + FilterByValuePayload, + FilterPayload, + FindByHookPayload, + FindByValuePayload, + FindPayload, + GetAllPayload, + GetManyPayload, + GetPayload, + HasPayload, + IncPayload, + KeysPayload, + MapByHookPayload, + MapByPathPayload, + MapPayload, + MathPayload, + PartitionByHookPayload, + PartitionByValuePayload, + PartitionPayload, + Payload, + PushPayload, + RandomKeyPayload, + RandomPayload, + RemoveByHookPayload, + RemoveByValuePayload, + RemovePayload, + SetManyPayload, + SetPayload, + SizePayload, + SomeByHookPayload, + SomeByValuePayload, + SomePayload, + UpdatePayload, + ValuesPayload +} from '../payloads'; +import { Method } from '../types'; +import type { Josh } from './Josh'; +import type { JoshProvider } from './JoshProvider'; +import type { MiddlewareStore } from './MiddlewareStore'; + +/** + * The base class for creating middlewares. Extend this class to create a middleware. + * @see {@link Middleware.Options} for all available options for middlewares. + * @since 2.0.0 + * + * @example + * ```typescript + * (at)ApplyOptions({ + * name: 'middleware', + * // More options... + * }) + * export class CoreMiddleware extends Middleware { + * // Make method implementations... + * } + * ``` + * + * ```typescript + * export class CoreMiddleware extends Middleware { + * public constructor() { + * super({ + * name: 'middleware' + * }) + * } + * } + * ``` + */ + +export class Middleware { + /** + * The store for this middleware. + * @since 2.0.0 + */ + public store?: MiddlewareStore; + + /** + * The name of this middleware. + * @since 2.0.0 + */ + public name: string; + + /** + * The position this middleware runs at. + * @since 2.0.0 + */ + public readonly position?: number; + + /** + * The conditions this middleware to run. + * @since 2.0.0 + */ + public readonly conditions: Middleware.Conditions; + + public constructor(options: Middleware.Options) { + const { name, position, conditions } = options; + + this.name = name; + this.position = position; + this.conditions = conditions; + } + + /** + * Initiates this class with it's store. + * @since 2.0.0 + * @param store The store to set to `this`. + * @returns Returns the current Middleware class. + */ + public init(store: MiddlewareStore): this { + this.store = store; + + return this; + } + + public [Method.AutoKey](payload: AutoKeyPayload): Awaitable { + return payload; + } + + public [Method.Clear](payload: ClearPayload): Awaitable { + return payload; + } + + public [Method.Dec](payload: DecPayload): Awaitable { + return payload; + } + + public [Method.Delete](payload: DeletePayload): Awaitable { + return payload; + } + + public [Method.Ensure](payload: EnsurePayload): Awaitable> { + return payload; + } + + public [Method.Every](payload: EveryByHookPayload): Awaitable>; + public [Method.Every](payload: EveryByValuePayload): Awaitable; + public [Method.Every](payload: EveryPayload): Awaitable>; + public [Method.Every](payload: EveryPayload): Awaitable> { + return payload; + } + + public [Method.Filter](payload: FilterByHookPayload): Awaitable>; + public [Method.Filter](payload: FilterByValuePayload): Awaitable>; + public [Method.Filter](payload: FilterPayload): Awaitable>; + public [Method.Filter](payload: FilterPayload): Awaitable> { + return payload; + } + + public [Method.Find](payload: FindByHookPayload): Awaitable>; + public [Method.Find](payload: FindByValuePayload): Awaitable>; + public [Method.Find](payload: FindPayload): Awaitable>; + public [Method.Find](payload: FindPayload): Awaitable> { + return payload; + } + + public [Method.Get](payload: GetPayload): Awaitable> { + return payload; + } + + public [Method.GetAll](payload: GetAllPayload): Awaitable> { + return payload; + } + + public [Method.GetMany](payload: GetManyPayload): Awaitable> { + return payload; + } + + public [Method.Has](payload: HasPayload): Awaitable { + return payload; + } + + public [Method.Inc](payload: IncPayload): Awaitable { + return payload; + } + + public [Method.Keys](payload: KeysPayload): Awaitable { + return payload; + } + + public [Method.Map](payload: MapByHookPayload): Awaitable>; + public [Method.Map](payload: MapByPathPayload): Awaitable>; + public [Method.Map](payload: MapPayload): Awaitable>; + public [Method.Map](payload: MapPayload): Awaitable> { + return payload; + } + + public [Method.Math](payload: MathPayload): Awaitable { + return payload; + } + + public [Method.Partition](payload: PartitionByHookPayload): Awaitable>; + public [Method.Partition](payload: PartitionByValuePayload): Awaitable>; + public [Method.Partition](payload: PartitionPayload): Awaitable>; + public [Method.Partition](payload: PartitionPayload): Awaitable> { + return payload; + } + + public [Method.Push](payload: PushPayload): Awaitable> { + return payload; + } + + public [Method.Random](payload: RandomPayload): Awaitable> { + return payload; + } + + public [Method.RandomKey](payload: RandomKeyPayload): Awaitable { + return payload; + } + + public [Method.Remove](payload: RemoveByHookPayload): Awaitable>; + public [Method.Remove](payload: RemoveByValuePayload): Awaitable; + public [Method.Remove](payload: RemovePayload): Awaitable>; + public [Method.Remove](payload: RemovePayload): Awaitable> { + return payload; + } + + public [Method.Set](payload: SetPayload): Awaitable> { + return payload; + } + + public [Method.SetMany](payload: SetManyPayload): Awaitable> { + return payload; + } + + public [Method.Size](payload: SizePayload): Awaitable { + return payload; + } + + public [Method.Some](payload: SomeByHookPayload): Awaitable>; + public [Method.Some](payload: SomeByValuePayload): Awaitable; + public [Method.Some](payload: SomePayload): Awaitable>; + public [Method.Some](payload: SomePayload): Awaitable> { + return payload; + } + + public [Method.Update]( + payload: UpdatePayload + ): Awaitable> { + return payload; + } + + public [Method.Values](payload: ValuesPayload): Awaitable> { + return payload; + } + + public run

(payload: P): Awaitable { + return payload; + } + + /** + * Adds the options of this class to an object. + * @since 2.0.0 + * @returns The options for this middleware as an object. + */ + public toJSON(): Middleware.JSON { + return { name: this.name, position: this.position, conditions: this.conditions }; + } + + /** + * The Josh instance this middleware is currently running on. + * @since 2.0.0 + */ + protected get instance(): Josh { + if (this.store === undefined) + throw new JoshError({ + identifier: Middleware.Identifiers.StoreNotFound, + message: 'The "store" property is undefined. This usually means this middleware has not been initiated.' + }); + + return this.store.instance; + } + + /** + * The provider that is used with the current Josh. + * @since 2.0.0 + */ + protected get provider(): JoshProvider { + return this.instance.provider; + } +} + +export namespace Middleware { + /** + * The options for {@link Middleware} + * @since 2.0.0 + */ + export interface Options { + /** + * The name of this middleware. + * @since 2.0.0 + */ + name: string; + + /** + * The position at which this middleware runs at. + * @since 2.0.0 + */ + position?: number; + + /** + * The conditions for this middleware to run on. + * @since 2.0.0 + */ + conditions: Conditions; + } + + /** + * The conditions to run this middleware on. + * @since 2.0.0 + */ + export interface Conditions { + /** + * The `pre` provider method conditions to run at. + * @since 2.0.0 + */ + pre: Method[]; + + /** + * The `post` provider method conditions to run at. + * @since 2.0.0 + */ + post: Method[]; + } + + /** + * The options in an object for {@link Middleware} + * @since 2.0.0 + */ + export interface JSON { + /** + * The name of this middleware. + * @since 2.0.0 + */ + name: string; + + /** + * The position of this middleware. + * @since 2.0.0 + */ + position?: number; + + /** + * The conditions for this middleware. + * @since 2.0.0 + */ + conditions: Conditions; + } + + /** + * The context data to use for middleware. + * @since 2.0.0 + */ + export interface ContextData {} + + export enum Identifiers { + StoreNotFound = 'storeNotFound' + } +} diff --git a/src/lib/structures/MiddlewareStore.ts b/src/lib/structures/MiddlewareStore.ts new file mode 100644 index 00000000..834e12a8 --- /dev/null +++ b/src/lib/structures/MiddlewareStore.ts @@ -0,0 +1,76 @@ +import { Method, Trigger } from '../types'; +import type { Josh } from './Josh'; +import type { Middleware } from './Middleware'; + +/** + * The store to contain {@link Middleware} classes. + * @since 2.0.0 + */ +export class MiddlewareStore extends Map> { + /** + * The link {@link Josh} instance for this store. + * @since 2.0.0 + */ + public instance: Josh; + + public constructor(options: MiddlewareStore.Options) { + super(); + + const { instance } = options; + + this.instance = instance; + } + + /** + * Gets an array of middlewares. + * @since 2.0.0 + * @returns The array of middlewares. + */ + public array(): Middleware[] { + return Array.from(this.values()); + } + + /** + * Get pre provider middlewares by method. + * @since 2.0.0 + * @param method The method to filter by. + * @returns The middlewares after filtered. + */ + public getPreMiddlewares(method: Method): Middleware[] { + return this.filterByCondition(method, Trigger.PreProvider); + } + + /** + * Get post provider middlewares by method. + * @since 2.0.0 + * @param method The method to filter by. + * @returns The middlewares after filtered. + */ + public getPostMiddlewares(method: Method): Middleware[] { + return this.filterByCondition(method, Trigger.PostProvider); + } + + /** + * Filter middlewares by their conditions. + * @since 2.0.0 + * @param method + * @param trigger + * @returns + */ + private filterByCondition(method: Method, trigger: Trigger): Middleware[] { + const middlewares = this.array().filter((middleware) => + trigger === Trigger.PreProvider ? middleware.conditions.pre.includes(method) : middleware.conditions.post.includes(method) + ); + + const withPositions = middlewares.filter((middleware) => middleware.position !== undefined); + const withoutPositions = middlewares.filter((middleware) => middleware.position !== undefined); + + return [...withPositions.sort((a, b) => a.position! - b.position!), ...withoutPositions]; + } +} + +export namespace MiddlewareStore { + export interface Options { + instance: Josh; + } +} diff --git a/src/lib/structures/default-provider/MapProvider.ts b/src/lib/structures/default-provider/MapProvider.ts new file mode 100644 index 00000000..a15f0370 --- /dev/null +++ b/src/lib/structures/default-provider/MapProvider.ts @@ -0,0 +1,647 @@ +import { deleteFromObject, getFromObject, hasFromObject, setToObject } from '@realware/utilities'; +import { isNumber, isPrimitive } from '@sapphire/utilities'; +import type { + AutoKeyPayload, + ClearPayload, + DecPayload, + DeletePayload, + EnsurePayload, + EveryByHookPayload, + EveryByValuePayload, + EveryPayload, + FilterByHookPayload, + FilterByValuePayload, + FilterPayload, + FindByHookPayload, + FindByValuePayload, + FindPayload, + GetAllPayload, + GetManyPayload, + GetPayload, + HasPayload, + IncPayload, + KeysPayload, + MapByHookPayload, + MapByPathPayload, + MapPayload, + MathPayload, + PartitionByHookPayload, + PartitionByValuePayload, + PartitionPayload, + PushPayload, + RandomKeyPayload, + RandomPayload, + RemoveByHookPayload, + RemoveByValuePayload, + RemovePayload, + SetManyPayload, + SetPayload, + SizePayload, + SomeByHookPayload, + SomeByValuePayload, + SomePayload, + UpdatePayload, + ValuesPayload +} from '../../payloads'; +import { MathOperator, Method } from '../../types'; +import { + isEveryByHookPayload, + isEveryByValuePayload, + isFilterByHookPayload, + isFilterByValuePayload, + isFindByHookPayload, + isFindByValuePayload, + isMapByHookPayload, + isMapByPathPayload, + isPartitionByHookPayload, + isPartitionByValuePayload, + isRemoveByHookPayload, + isRemoveByValuePayload, + isSomeByHookPayload, + isSomeByValuePayload +} from '../../validators'; +import { JoshProvider } from '../JoshProvider'; +import { MapProviderError } from './MapProviderError'; + +/** + * A provider that uses the Node.js native [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) class. + * @since 2.0.0 + */ +export class MapProvider extends JoshProvider { + /** + * The [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) cache to store data. + * @since 2.0.0 + * @private + */ + private cache = new Map(); + + /** + * A simple cache for the {@link MapProvider.autoKey} method. + * @since 2.0.0 + */ + private autoKeyCount = 0; + + public [Method.AutoKey](payload: AutoKeyPayload): AutoKeyPayload { + this.autoKeyCount++; + + payload.data = this.autoKeyCount.toString(); + + return payload; + } + + public [Method.Clear](payload: ClearPayload): ClearPayload { + this.cache.clear(); + this.autoKeyCount = 0; + + return payload; + } + + public [Method.Dec](payload: DecPayload): DecPayload { + const { key, path } = payload; + const { data } = this.get({ method: Method.Get, key, path }); + + if (data === undefined) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.DecMissingData, + message: path.length === 0 ? `The data at "${key}" does not exist.` : `The data at "${key}.${path.join('.')}" does not exist.`, + method: Method.Dec + }); + + return payload; + } + + if (typeof data !== 'number') { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.DecInvalidType, + message: + path.length === 0 ? `The data at "${key}" must be of type "number".` : `The data at "${key}.${path.join('.')}" must be of type "number".`, + method: Method.Dec + }); + + return payload; + } + + this.set({ method: Method.Set, key, path, value: data - 1 }); + + return payload; + } + + public [Method.Delete](payload: DeletePayload): DeletePayload { + const { key, path } = payload; + + if (path.length === 0) { + this.cache.delete(key); + + return payload; + } + + if (this.has({ method: Method.Has, key, path, data: false }).data) { + const { data } = this.get({ method: Method.Get, key, path: [] }); + + deleteFromObject(data, path); + + return payload; + } + + return payload; + } + + public [Method.Ensure](payload: EnsurePayload): EnsurePayload { + const { key } = payload; + + if (!this.cache.has(key)) this.cache.set(key, payload.defaultValue); + + Reflect.set(payload, 'data', this.cache.get(key)); + + return payload; + } + + public async [Method.Every](payload: EveryByHookPayload): Promise>; + public async [Method.Every](payload: EveryByValuePayload): Promise; + public async [Method.Every](payload: EveryPayload): Promise> { + if (this.cache.size === 0) { + payload.data = false; + + return payload; + } + + if (isEveryByHookPayload(payload)) { + const { hook } = payload; + + for (const value of this.cache.values()) { + const everyValue = await hook(value); + + if (everyValue) continue; + + payload.data = false; + } + } + + if (isEveryByValuePayload(payload)) { + const { path, value } = payload; + + for (const key of this.cache.keys()) { + const { data } = this.get({ method: Method.Get, key, path }); + + if (value === data) continue; + + payload.data = false; + } + } + + return payload; + } + + public async [Method.Filter](payload: FilterByHookPayload): Promise>; + public async [Method.Filter](payload: FilterByValuePayload): Promise>; + public async [Method.Filter](payload: FilterPayload): Promise> { + if (isFilterByHookPayload(payload)) { + const { hook } = payload; + + for (const [key, value] of this.cache.entries()) { + const filterValue = await hook(value); + + if (!filterValue) continue; + + payload.data[key] = value; + } + } + + if (isFilterByValuePayload(payload)) { + const { path, value } = payload; + + if (!isPrimitive(value)) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.FilterInvalidValue, + message: 'The "value" must be a primitive type.', + method: Method.Filter + }); + + return payload; + } + + for (const [key, storedValue] of this.cache.entries()) + if (value === (path.length === 0 ? storedValue : getFromObject(storedValue, path))) payload.data[key] = storedValue; + } + + return payload; + } + + public async [Method.Find](payload: FindByHookPayload): Promise>; + public async [Method.Find](payload: FindByValuePayload): Promise>; + public async [Method.Find](payload: FindPayload): Promise> { + if (isFindByHookPayload(payload)) { + const { hook } = payload; + + for (const value of this.cache.values()) { + const foundValue = await hook(value); + + if (!foundValue) continue; + + payload.data = value; + + break; + } + } + + if (isFindByValuePayload(payload)) { + const { path, value } = payload; + + if (!isPrimitive(value)) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.FindInvalidValue, + message: 'The "value" must be of type primitive.', + method: Method.Find + }); + + return payload; + } + + for (const storedValue of this.cache.values()) { + if (payload.data !== undefined) break; + if (value === (path.length === 0 ? storedValue : getFromObject(storedValue, path))) payload.data = storedValue; + } + } + + return payload; + } + + public [Method.Get](payload: GetPayload): GetPayload { + const { key, path } = payload; + + Reflect.set(payload, 'data', path.length === 0 ? this.cache.get(key) : getFromObject(this.cache.get(key), path)); + + return payload; + } + + public [Method.GetAll](payload: GetAllPayload): GetAllPayload { + for (const [key, value] of this.cache.entries()) payload.data[key] = value; + + return payload; + } + + public [Method.GetMany](payload: GetManyPayload): GetManyPayload { + const { keys } = payload; + + for (const key of keys) payload.data[key] = this.cache.get(key) ?? null; + + return payload; + } + + public [Method.Has](payload: HasPayload): HasPayload { + const { key, path } = payload; + + if (this.cache.has(key)) { + payload.data = true; + + if (path.length !== 0) payload.data = hasFromObject(this.cache.get(key), path); + } + + return payload; + } + + public [Method.Inc](payload: IncPayload): IncPayload { + const { key, path } = payload; + const { data } = this.get({ method: Method.Get, key, path }); + + if (data === undefined) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.IncMissingData, + message: path.length === 0 ? `The data at "${key}" does not exist.` : `The data at "${key}.${path.join('.')}" does not exist.`, + method: Method.Inc + }); + + return payload; + } + + if (typeof data !== 'number') { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.IncInvalidType, + message: + path.length === 0 ? `The data at "${key}" must be of type "number".` : `The data at "${key}.${path.join('.')}" must be of type "number".`, + method: Method.Inc + }); + + return payload; + } + + this.set({ method: Method.Set, key, path, value: data + 1 }); + + return payload; + } + + public [Method.Keys](payload: KeysPayload): KeysPayload { + payload.data = Array.from(this.cache.keys()); + + return payload; + } + + public async [Method.Map]( + payload: MapByHookPayload + ): Promise>; + + public async [Method.Map](payload: MapByPathPayload): Promise>; + public async [Method.Map]( + payload: MapPayload + ): Promise> { + if (isMapByHookPayload(payload)) { + const { hook } = payload; + + // @ts-expect-error 2345 + for (const value of this.cache.values()) payload.data.push(await hook(value)); + } + + if (isMapByPathPayload(payload)) { + const { path } = payload; + + // @ts-expect-error 2345 + for (const value of this.cache.values()) payload.data.push(path.length === 0 ? value : getFromObject(value, path)); + } + + return payload; + } + + public [Method.Math](payload: MathPayload): MathPayload { + const { key, path, operator, operand } = payload; + let { data } = this.get({ method: Method.Get, key, path }); + + if (data === undefined) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.MathMissingData, + message: path.length === 0 ? `The data at "${key}" does not exist.` : `The data at "${key}.${path.join('.')}" does not exist.`, + method: Method.Math + }); + + return payload; + } + + if (!isNumber(data)) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.MathInvalidType, + message: path.length === 0 ? `The data at "${key}" must be a number.` : `The data at "${key}.${path.join('.')}" must be a number.`, + method: Method.Math + }); + + return payload; + } + + switch (operator) { + case MathOperator.Addition: + data += operand; + + break; + + case MathOperator.Subtraction: + data -= operand; + + break; + + case MathOperator.Multiplication: + data *= operand; + + break; + + case MathOperator.Division: + data /= operand; + + break; + + case MathOperator.Remainder: + data %= operand; + + break; + + case MathOperator.Exponent: + data **= operand; + + break; + } + + this.set({ method: Method.Set, key, path, value: data }); + + return payload; + } + + public async [Method.Partition](payload: PartitionByHookPayload): Promise>; + public async [Method.Partition](payload: PartitionByValuePayload): Promise>; + public async [Method.Partition](payload: PartitionPayload): Promise> { + if (isPartitionByHookPayload(payload)) { + const { hook } = payload; + + for (const [key, value] of this.cache.entries()) { + const filterValue = await hook(value); + + if (filterValue) payload.data.truthy[key] = value; + else payload.data.falsy[key] = value; + } + } + + if (isPartitionByValuePayload(payload)) { + const { path, value } = payload; + + if (!isPrimitive(value)) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.PartitionInvalidValue, + message: 'The "value" must be a primitive type.', + method: Method.Partition + }); + + return payload; + } + + for (const [key, storedValue] of this.cache.entries()) + if (value === (path.length === 0 ? storedValue : getFromObject(storedValue, path))) payload.data.truthy[key] = storedValue; + else payload.data.falsy[key] = storedValue; + } + + return payload; + } + + public [Method.Push](payload: PushPayload): PushPayload { + const { key, path, value } = payload; + const { data } = this.get({ method: Method.Get, key, path }); + + if (data === undefined) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.PushMissingData, + message: path.length === 0 ? `The data at "${key}" does not exist.` : `The data at "${key}.${path.join('.')}" does not exist.`, + method: Method.Push + }); + + return payload; + } + + if (!Array.isArray(data)) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.PushInvalidType, + message: path.length === 0 ? `The data at "${key}" must be an array.` : `The data at "${key}.${path.join('.')}" does not exist.`, + method: Method.Push + }); + + return payload; + } + + data.push(value); + + this.set({ method: Method.Set, key, path, value: data }); + + return payload; + } + + public [Method.Random](payload: RandomPayload): RandomPayload { + const values = Array.from(this.cache.values()); + + Reflect.set(payload, 'data', values[Math.floor(Math.random() * values.length)]); + + return payload; + } + + public [Method.RandomKey](payload: RandomKeyPayload): RandomKeyPayload { + const keys = Array.from(this.cache.keys()); + + payload.data = keys[Math.floor(Math.random() * keys.length)]; + + return payload; + } + + public async [Method.Remove](payload: RemoveByHookPayload): Promise>; + public async [Method.Remove](payload: RemoveByValuePayload): Promise; + public async [Method.Remove](payload: RemovePayload): Promise> { + if (isRemoveByHookPayload(payload)) { + const { key, path, hook } = payload; + const { data } = this.get({ method: Method.Get, key, path }); + + if (data === undefined) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.RemoveMissingData, + message: path.length === 0 ? `The data at "${key}" does not exist.` : `The data at "${key}.${path.join('.')}" does not exist.`, + method: Method.Remove + }); + + return payload; + } + + if (!Array.isArray(data)) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.RemoveInvalidType, + message: path.length === 0 ? `The data at "${key}" must be an array.` : `The data at "${key}.${path.join('.')}" must be an array.`, + method: Method.Remove + }); + + return payload; + } + + const filterValues = await Promise.all(data.map(hook)); + + this.set({ method: Method.Set, key, path, value: data.filter((_, index) => !filterValues[index]) }); + } + + if (isRemoveByValuePayload(payload)) { + const { key, path, value } = payload; + const { data } = this.get({ method: Method.Get, key, path }); + + if (data === undefined) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.RemoveMissingData, + message: path.length === 0 ? `The data at "${key}" does not exist.` : `The data at "${key}.${path.join('.')}" does not exist.`, + method: Method.Remove + }); + + return payload; + } + + if (!Array.isArray(data)) { + payload.error = new MapProviderError({ + identifier: JoshProvider.CommonIdentifiers.RemoveInvalidType, + message: path.length === 0 ? `The data at "${key}" must be an array.` : `The data at "${key}.${path.join('.')}" must be an array.`, + method: Method.Remove + }); + + return payload; + } + + this.set({ method: Method.Set, key, path, value: data.filter((storedValue) => value !== storedValue) }); + } + + return payload; + } + + public [Method.Set](payload: SetPayload): SetPayload { + const { key, path, value } = payload; + + // @ts-expect-error 2345 + if (path.length === 0) this.cache.set(key, value); + else { + const storedValue = this.cache.get(key); + + this.cache.set(key, setToObject(storedValue!, path, value)); + } + + return payload; + } + + public [Method.SetMany](payload: SetManyPayload): SetManyPayload { + const { data } = payload; + + for (const [{ key, path }, value] of data) this.set({ method: Method.Set, key, path, value }); + + return payload; + } + + public [Method.Size](payload: SizePayload): SizePayload { + payload.data = this.cache.size; + + return payload; + } + + public async [Method.Some](payload: SomeByHookPayload): Promise>; + public async [Method.Some](payload: SomeByValuePayload): Promise; + public async [Method.Some](payload: SomePayload): Promise> { + if (isSomeByHookPayload(payload)) { + const { hook } = payload; + + for (const value of this.cache.values()) { + const someValue = await hook(value); + + if (!someValue) continue; + + payload.data = true; + + break; + } + } + + if (isSomeByValuePayload(payload)) { + const { path, value } = payload; + + for (const storedValue of this.cache.values()) { + if (path.length !== 0 && value !== getFromObject(storedValue, path)) continue; + if (isPrimitive(storedValue) && value === storedValue) continue; + + payload.data = true; + } + } + + return payload; + } + + public async [Method.Update]( + payload: UpdatePayload + ): Promise> { + const { key, path, hook } = payload; + const { data } = this.get({ method: Method.Get, key, path }); + + if (data === undefined) return payload; + + Reflect.set(payload, 'data', await hook(data)); + this.set({ method: Method.Set, key, path, value: payload.data }); + + return payload; + } + + public [Method.Values](payload: ValuesPayload): ValuesPayload { + Reflect.set(payload, 'data', Array.from(this.cache.values())); + + return payload; + } +} diff --git a/src/lib/structures/default-provider/MapProviderError.ts b/src/lib/structures/default-provider/MapProviderError.ts new file mode 100644 index 00000000..06ea0f2d --- /dev/null +++ b/src/lib/structures/default-provider/MapProviderError.ts @@ -0,0 +1,14 @@ +import { JoshProviderError } from '../../errors'; + +/** + * The error class for the MapProvider. + * @since 2.0.0 + */ +export class MapProviderError extends JoshProviderError { + /** + * The name for this error. + */ + public get name() { + return 'MapProviderError'; + } +} diff --git a/src/lib/structures/default-provider/index.ts b/src/lib/structures/default-provider/index.ts new file mode 100644 index 00000000..b87ae222 --- /dev/null +++ b/src/lib/structures/default-provider/index.ts @@ -0,0 +1,2 @@ +export * from './MapProvider'; +export * from './MapProviderError'; diff --git a/src/lib/types/BuiltInMiddleware.ts b/src/lib/types/BuiltInMiddleware.ts new file mode 100644 index 00000000..8aca626b --- /dev/null +++ b/src/lib/types/BuiltInMiddleware.ts @@ -0,0 +1,3 @@ +export enum BuiltInMiddleware { + AutoEnsure = 'autoEnsure' +} diff --git a/src/lib/types/KeyPath.ts b/src/lib/types/KeyPath.ts new file mode 100644 index 00000000..c8b6b4aa --- /dev/null +++ b/src/lib/types/KeyPath.ts @@ -0,0 +1,11 @@ +import type { StringArray } from './StringArray'; + +export type KeyPath = string | KeyPathJSON; + +export type Path = string | StringArray; + +export interface KeyPathJSON { + key: string; + + path?: Path; +} diff --git a/src/lib/types/MathOperator.ts b/src/lib/types/MathOperator.ts new file mode 100644 index 00000000..cc9f9fe4 --- /dev/null +++ b/src/lib/types/MathOperator.ts @@ -0,0 +1,13 @@ +export enum MathOperator { + Addition = 'addition', + + Subtraction = 'subtraction', + + Multiplication = 'multiplication', + + Division = 'division', + + Remainder = 'remainder', + + Exponent = 'exponent' +} diff --git a/src/lib/types/Method.ts b/src/lib/types/Method.ts new file mode 100644 index 00000000..c8346af3 --- /dev/null +++ b/src/lib/types/Method.ts @@ -0,0 +1,55 @@ +export enum Method { + AutoKey = 'autoKey', + + Clear = 'clear', + + Dec = 'dec', + + Delete = 'delete', + + Ensure = 'ensure', + + Every = 'every', + + Filter = 'filter', + + Find = 'find', + + Get = 'get', + + GetAll = 'getAll', + + GetMany = 'getMany', + + Has = 'has', + + Inc = 'inc', + + Keys = 'keys', + + Map = 'map', + + Math = 'math', + + Partition = 'partition', + + Push = 'push', + + Random = 'random', + + RandomKey = 'randomKey', + + Remove = 'remove', + + Set = 'set', + + SetMany = 'setMany', + + Size = 'size', + + Some = 'some', + + Update = 'update', + + Values = 'values' +} diff --git a/src/lib/types/StringArray.ts b/src/lib/types/StringArray.ts new file mode 100644 index 00000000..a59c833d --- /dev/null +++ b/src/lib/types/StringArray.ts @@ -0,0 +1 @@ +export type StringArray = string[]; diff --git a/src/lib/types/Trigger.ts b/src/lib/types/Trigger.ts new file mode 100644 index 00000000..fe617dcf --- /dev/null +++ b/src/lib/types/Trigger.ts @@ -0,0 +1,5 @@ +export enum Trigger { + PreProvider, + + PostProvider +} diff --git a/src/lib/types/index.ts b/src/lib/types/index.ts new file mode 100644 index 00000000..de4374e9 --- /dev/null +++ b/src/lib/types/index.ts @@ -0,0 +1,6 @@ +export * from './BuiltInMiddleware'; +export * from './KeyPath'; +export * from './MathOperator'; +export * from './Method'; +export * from './StringArray'; +export * from './Trigger'; diff --git a/src/lib/validators/index.ts b/src/lib/validators/index.ts new file mode 100644 index 00000000..03805574 --- /dev/null +++ b/src/lib/validators/index.ts @@ -0,0 +1,2 @@ +export * from './legacy'; +export * from './payloads'; diff --git a/src/lib/validators/legacy/index.ts b/src/lib/validators/legacy/index.ts new file mode 100644 index 00000000..258513a9 --- /dev/null +++ b/src/lib/validators/legacy/index.ts @@ -0,0 +1 @@ +export * from './isLegacyExportJSON'; diff --git a/src/lib/validators/legacy/isLegacyExportJSON.ts b/src/lib/validators/legacy/isLegacyExportJSON.ts new file mode 100644 index 00000000..01fb1092 --- /dev/null +++ b/src/lib/validators/legacy/isLegacyExportJSON.ts @@ -0,0 +1,7 @@ +import type { Josh } from '../../structures/Josh'; + +export function isLegacyExportJSON( + json: Josh.ExportJSON | Josh.LegacyExportJSON +): json is Josh.LegacyExportJSON { + return 'exportDate' in json && 'keys' in json; +} diff --git a/src/lib/validators/payloads/Every.ts b/src/lib/validators/payloads/Every.ts new file mode 100644 index 00000000..59fb9df6 --- /dev/null +++ b/src/lib/validators/payloads/Every.ts @@ -0,0 +1,22 @@ +import { EveryByHookPayload, EveryByValuePayload, EveryPayload, Payload } from '../../payloads'; +import { Method } from '../../types'; + +/** + * Validates whether the given payload is {@link EveryByHookPayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isEveryByHookPayload(payload: EveryPayload): payload is EveryByHookPayload { + return payload.method === Method.Every && payload.type === Payload.Type.Hook; +} + +/** + * Validates whether the given payload is {@link EveryByValuePayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isEveryByValuePayload(payload: EveryPayload): payload is EveryByValuePayload { + return payload.method === Method.Every && payload.type === Payload.Type.Value; +} diff --git a/src/lib/validators/payloads/Filter.ts b/src/lib/validators/payloads/Filter.ts new file mode 100644 index 00000000..3860fb2d --- /dev/null +++ b/src/lib/validators/payloads/Filter.ts @@ -0,0 +1,22 @@ +import { FilterByHookPayload, FilterByValuePayload, FilterPayload, Payload } from '../../payloads'; +import { Method } from '../../types'; + +/** + * Validates whether the given payload is {@link FilterByHookPayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isFilterByHookPayload(payload: FilterPayload): payload is FilterByHookPayload { + return payload.method === Method.Filter && payload.type === Payload.Type.Hook; +} + +/** + * Validates whether the given payload is {@link FilterByValuePayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isFilterByValuePayload(payload: FilterPayload): payload is FilterByValuePayload { + return payload.method === Method.Filter && payload.type === Payload.Type.Value; +} diff --git a/src/lib/validators/payloads/Find.ts b/src/lib/validators/payloads/Find.ts new file mode 100644 index 00000000..77dfe85e --- /dev/null +++ b/src/lib/validators/payloads/Find.ts @@ -0,0 +1,22 @@ +import { FindByHookPayload, FindByValuePayload, FindPayload, Payload } from '../../payloads'; +import { Method } from '../../types'; + +/** + * Validates whether the given payload is {@link FindByHookPayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isFindByHookPayload(payload: FindPayload): payload is FindByHookPayload { + return payload.method === Method.Find && payload.type === Payload.Type.Hook; +} + +/** + * Validates whether the given payload is {@link FindByValuePayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isFindByValuePayload(payload: FindPayload): payload is FindByValuePayload { + return payload.method === Method.Find && payload.type === Payload.Type.Value; +} diff --git a/src/lib/validators/payloads/Map.ts b/src/lib/validators/payloads/Map.ts new file mode 100644 index 00000000..a92dc305 --- /dev/null +++ b/src/lib/validators/payloads/Map.ts @@ -0,0 +1,24 @@ +import { MapByHookPayload, MapByPathPayload, MapPayload, Payload } from '../../payloads'; +import { Method } from '../../types'; + +/** + * Validates whether the given payload is {@link MapByHookPayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isMapByHookPayload( + payload: MapPayload +): payload is MapByHookPayload { + return payload.method === Method.Map && payload.type === Payload.Type.Hook; +} + +/** + * Validates whether the given payload is {@link MapByValuePayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isMapByPathPayload(payload: MapPayload): payload is MapByPathPayload { + return payload.method === Method.Map && payload.type === Payload.Type.Path; +} diff --git a/src/lib/validators/payloads/Partition.ts b/src/lib/validators/payloads/Partition.ts new file mode 100644 index 00000000..56991d93 --- /dev/null +++ b/src/lib/validators/payloads/Partition.ts @@ -0,0 +1,22 @@ +import { PartitionByHookPayload, PartitionByValuePayload, PartitionPayload, Payload } from '../../payloads'; +import { Method } from '../../types'; + +/** + * Validates whether the given payload is {@link PartitionByHookPayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isPartitionByHookPayload(payload: PartitionPayload): payload is PartitionByHookPayload { + return payload.method === Method.Partition && payload.type === Payload.Type.Hook; +} + +/** + * Validates whether the given payload is {@link PartitionByValuePayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isPartitionByValuePayload(payload: PartitionPayload): payload is PartitionByValuePayload { + return payload.method === Method.Partition && payload.type === Payload.Type.Value; +} diff --git a/src/lib/validators/payloads/Remove.ts b/src/lib/validators/payloads/Remove.ts new file mode 100644 index 00000000..5d25ecc0 --- /dev/null +++ b/src/lib/validators/payloads/Remove.ts @@ -0,0 +1,22 @@ +import { Payload, RemoveByHookPayload, RemoveByValuePayload, RemovePayload } from '../../payloads'; +import { Method } from '../../types'; + +/** + * Validates whether the given payload is {@link RemoveByHookPayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isRemoveByHookPayload(payload: RemovePayload): payload is RemoveByHookPayload { + return payload.method === Method.Remove && payload.type === Payload.Type.Hook; +} + +/** + * Validates whether the given payload is {@link RemoveByValuePayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isRemoveByValuePayload(payload: RemovePayload): payload is RemoveByValuePayload { + return payload.method === Method.Remove && payload.type === Payload.Type.Value; +} diff --git a/src/lib/validators/payloads/Some.ts b/src/lib/validators/payloads/Some.ts new file mode 100644 index 00000000..66c15021 --- /dev/null +++ b/src/lib/validators/payloads/Some.ts @@ -0,0 +1,22 @@ +import { Payload, SomeByHookPayload, SomeByValuePayload, SomePayload } from '../../payloads'; +import { Method } from '../../types'; + +/** + * Validates whether the given payload is {@link SomeByHookPayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isSomeByHookPayload(payload: SomePayload): payload is SomeByHookPayload { + return payload.method === Method.Some && payload.type === Payload.Type.Hook; +} + +/** + * Validates whether the given payload is {@link SomeByValuePayload} + * @since 2.0.0 + * @param payload The payload to validate. + * @returns Validation boolean. + */ +export function isSomeByValuePayload(payload: SomePayload): payload is SomeByValuePayload { + return payload.method === Method.Some && payload.type === Payload.Type.Value; +} diff --git a/src/lib/validators/payloads/index.ts b/src/lib/validators/payloads/index.ts new file mode 100644 index 00000000..b87e6a1b --- /dev/null +++ b/src/lib/validators/payloads/index.ts @@ -0,0 +1,7 @@ +export * from './Every'; +export * from './Filter'; +export * from './Find'; +export * from './Map'; +export * from './Partition'; +export * from './Remove'; +export * from './Some'; diff --git a/src/middlewares/CoreAutoEnsure.ts b/src/middlewares/CoreAutoEnsure.ts new file mode 100644 index 00000000..7560b864 --- /dev/null +++ b/src/middlewares/CoreAutoEnsure.ts @@ -0,0 +1,158 @@ +import { ApplyMiddlewareOptions } from '../lib/decorators/ApplyMiddlewareOptions'; +import type { + DecPayload, + GetManyPayload, + GetPayload, + IncPayload, + MathPayload, + PushPayload, + RemoveByHookPayload, + RemoveByValuePayload, + RemovePayload, + SetManyPayload, + SetPayload, + UpdatePayload +} from '../lib/payloads'; +import { Middleware } from '../lib/structures/Middleware'; +import { BuiltInMiddleware, Method } from '../lib/types'; + +@ApplyMiddlewareOptions({ + name: BuiltInMiddleware.AutoEnsure, + position: 0, + conditions: { + pre: [Method.Dec, Method.Inc, Method.Push, Method.Remove, Method.Set, Method.SetMany], + post: [Method.Get, Method.GetMany, Method.Update] + } +}) +export class CoreAutoEnsure extends Middleware { + public async [Method.Dec](payload: DecPayload): Promise { + if (!this.context) return payload; + + const { defaultValue } = this.context; + const { key } = payload; + + await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + return payload; + } + + public async [Method.Get](payload: GetPayload): Promise> { + if (payload.data !== undefined) return payload; + if (!this.context) return payload; + + const { defaultValue } = this.context; + const { key } = payload; + const { data } = await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + Reflect.set(payload, 'data', data); + + return payload; + } + + public async [Method.GetMany](payload: GetManyPayload): Promise> { + if (Object.keys(payload.data).length !== 0) return payload; + if (!this.context) return payload; + + const { defaultValue } = this.context; + + for (const [key] of payload.keys) { + if (payload.data[key] !== null) continue; + + const { data } = await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + Reflect.set(payload, 'data', data); + } + + return payload; + } + + public async [Method.Inc](payload: IncPayload): Promise { + if (!this.context) return payload; + + const { defaultValue } = this.context; + const { key } = payload; + + await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + return payload; + } + + public async [Method.Push](payload: PushPayload): Promise> { + if (!this.context) return payload; + + const { defaultValue } = this.context; + const { key } = payload; + + await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + return payload; + } + + public async [Method.Math](payload: MathPayload): Promise { + if (!this.context) return payload; + + const { defaultValue } = this.context; + const { key } = payload; + + await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + return payload; + } + + public async [Method.Remove](payload: RemoveByHookPayload): Promise>; + public async [Method.Remove](payload: RemoveByValuePayload): Promise; + public async [Method.Remove](payload: RemovePayload): Promise> { + if (!this.context) return payload; + + const { defaultValue } = this.context; + const { key } = payload; + + await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + return payload; + } + + public async [Method.Set](payload: SetPayload): Promise> { + if (!this.context) return payload; + + const { defaultValue } = this.context; + const { key } = payload; + + await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + return payload; + } + + public async [Method.SetMany](payload: SetManyPayload): Promise> { + if (!this.context) return payload; + + const { defaultValue } = this.context; + + for (const [{ key }] of payload.data) await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + return payload; + } + + public async [Method.Update]( + payload: UpdatePayload + ): Promise> { + if (!this.context) return payload; + + const { defaultValue } = this.context; + const { key } = payload; + + await this.provider.ensure({ method: Method.Ensure, key, data: defaultValue, defaultValue }); + + return payload; + } + + private get context(): CoreAutoEnsure.ContextData | undefined { + return this.instance.options.middlewareContextData?.[BuiltInMiddleware.AutoEnsure]; + } +} + +export namespace CoreAutoEnsure { + export interface ContextData extends Middleware.ContextData { + defaultValue: Value; + } +} diff --git a/src/tsconfig.json b/src/tsconfig.json new file mode 100644 index 00000000..c3340014 --- /dev/null +++ b/src/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./", + "outDir": "../dist", + "composite": true, + "preserveConstEnums": true, + "useDefineForClassFields": false + }, + "include": ["."] +} diff --git a/tests/lib/functions/convertLegacyExportJSON.test.ts b/tests/lib/functions/convertLegacyExportJSON.test.ts new file mode 100644 index 00000000..79ecf270 --- /dev/null +++ b/tests/lib/functions/convertLegacyExportJSON.test.ts @@ -0,0 +1,24 @@ +import { convertLegacyExportJSON } from '../../../src'; + +describe('convertLegacyExportJSON', () => { + describe('is a function', () => { + test('GIVEN typeof ... THEN returns function', () => { + expect(typeof convertLegacyExportJSON).toBe('function'); + }); + }); + + describe('converts legacy json properly', () => { + test('GIVEN legacy json THEN converts json', () => { + const exportedTimestamp = Date.now(); + + expect( + convertLegacyExportJSON({ name: 'test', version: '1.0.0', exportDate: exportedTimestamp, keys: [{ key: 'key', value: 'value' }] }) + ).toEqual({ + name: 'test', + version: '1.0.0', + exportedTimestamp, + entries: [['key', 'value']] + }); + }); + }); +}); diff --git a/tests/lib/functions/isNodeEnvironment.test.ts b/tests/lib/functions/isNodeEnvironment.test.ts new file mode 100644 index 00000000..f72c9d4c --- /dev/null +++ b/tests/lib/functions/isNodeEnvironment.test.ts @@ -0,0 +1,15 @@ +import { isNodeEnvironment } from '../../../src'; + +describe('isNodeEnvironment', () => { + describe('is a function', () => { + test('GIVEN typeof ... THEN returns function', () => { + expect(typeof isNodeEnvironment).toBe('function'); + }); + }); + + describe('checks proper environment', () => { + test('GIVEN node environment THEN returns true', () => { + expect(isNodeEnvironment()).toBe(true); + }); + }); +}); diff --git a/tests/lib/structures/Josh.test.ts b/tests/lib/structures/Josh.test.ts new file mode 100644 index 00000000..0d024c03 --- /dev/null +++ b/tests/lib/structures/Josh.test.ts @@ -0,0 +1,13 @@ +import { Josh } from '../../../src'; + +describe('Josh', () => { + describe('is a class', () => { + test('GIVEN typeof Josh THEN returns function', () => { + expect(typeof Josh).toBe('function'); + }); + + test('GIVEN typeof ...prototype THEN returns object', () => { + expect(typeof Josh.prototype).toBe('object'); + }); + }); +}); diff --git a/tests/lib/structures/JoshProvider.test.ts b/tests/lib/structures/JoshProvider.test.ts new file mode 100644 index 00000000..6715ef6d --- /dev/null +++ b/tests/lib/structures/JoshProvider.test.ts @@ -0,0 +1,13 @@ +import { JoshProvider } from '../../../src'; + +describe('JoshProvider', () => { + describe('is a class', () => { + test('GIVEN typeof JoshProvider THEN returns function', () => { + expect(typeof JoshProvider).toBe('function'); + }); + + test('GIVEN typeof ...prototype THEN returns object', () => { + expect(typeof JoshProvider.prototype).toBe('object'); + }); + }); +}); diff --git a/tests/lib/structures/Middleware.test.ts b/tests/lib/structures/Middleware.test.ts new file mode 100644 index 00000000..8d90a8ed --- /dev/null +++ b/tests/lib/structures/Middleware.test.ts @@ -0,0 +1,13 @@ +import { Middleware } from '../../../src'; + +describe('Middleware', () => { + describe('is a class', () => { + test('GIVEN typeof Middleware THEN returns function', () => { + expect(typeof Middleware).toBe('function'); + }); + + test('GIVEN typeof ...prototype THEN returns object', () => { + expect(typeof Middleware.prototype).toBe('object'); + }); + }); +}); diff --git a/tests/lib/structures/MiddlewareStore.test.ts b/tests/lib/structures/MiddlewareStore.test.ts new file mode 100644 index 00000000..b86355b3 --- /dev/null +++ b/tests/lib/structures/MiddlewareStore.test.ts @@ -0,0 +1,13 @@ +import { MiddlewareStore } from '../../../src'; + +describe('MiddlewareStore', () => { + describe('is a class', () => { + test('GIVEN typeof MiddlewareStore THEN returns function', () => { + expect(typeof MiddlewareStore).toBe('function'); + }); + + test('GIVEN typeof ...prototype THEN returns object', () => { + expect(typeof MiddlewareStore.prototype).toBe('object'); + }); + }); +}); diff --git a/tests/lib/structures/default-provider/MapProvider.test.ts b/tests/lib/structures/default-provider/MapProvider.test.ts new file mode 100644 index 00000000..d2ce7c02 --- /dev/null +++ b/tests/lib/structures/default-provider/MapProvider.test.ts @@ -0,0 +1,1682 @@ +import { JoshProvider, MapProvider, MapProviderError, MathOperator, Method, Payload } from '../../../../src'; + +describe('MapProvider', () => { + describe('is a class', () => { + test('GIVEN typeof MapProvider THEN returns function', () => { + expect(typeof MapProvider).toBe('function'); + }); + + test('GIVEN typeof ...prototype THEN returns object', () => { + expect(typeof MapProvider.prototype).toBe('object'); + }); + }); + + describe('can manipulate provider data', () => { + const provider = new MapProvider({}); + + beforeEach(() => { + provider.clear({ method: Method.Clear }); + }); + + describe('with autoKey method', () => { + test('GIVEN ... THEN returns payload w/ generated key as data AND increments autoKeyCount', () => { + const payload = provider.autoKey({ method: Method.AutoKey, data: '0' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.AutoKey); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toBe('1'); + + expect(provider['autoKeyCount']).toBe(1); + }); + }); + + describe('with clear method', () => { + test('GIVEN provider w/o data THEN provider data cleared', () => { + const sizeBefore = provider.size({ method: Method.Size, data: 0 }); + + expect(sizeBefore.data).toBe(0); + + const payload = provider.clear({ method: Method.Clear }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error } = payload; + + expect(method).toBe(Method.Clear); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + + const sizeAfter = provider.size({ method: Method.Size, data: 0 }); + + expect(sizeAfter.data).toBe(0); + }); + + test('GIVEN provider w/ data THEN provider data cleared', () => { + provider.set({ method: Method.Set, key: 'test:clear', path: [], value: 'value' }); + + const sizeBefore = provider.size({ method: Method.Size, data: 0 }); + + expect(sizeBefore.data).toBe(1); + + const payload = provider.clear({ method: Method.Clear }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error } = payload; + + expect(method).toBe(Method.Clear); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + + const sizeAfter = provider.size({ method: Method.Size, data: 0 }); + + expect(sizeAfter.data).toBe(0); + }); + }); + + describe('with dec method', () => { + test('GIVEN provider w/o data at key THEN returns payload w/ missing data error', () => { + const payload = provider.dec({ method: Method.Dec, key: 'test:dec', path: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Dec); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.DecMissingData); + expect(key).toBe('test:dec'); + expect(path).toEqual([]); + }); + + test('GIVEN provider w/o data at path THEN returns payload w/ missing data error', () => { + const payload = provider.dec({ method: Method.Dec, key: 'test:dec', path: ['path'] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Dec); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.DecMissingData); + expect(key).toBe('test:dec'); + expect(path).toEqual(['path']); + }); + + test('GIVEN provider w/ invalid type at key THEN returns payload w/ invalid type error', () => { + provider.set({ method: Method.Set, key: 'test:dec', path: [], value: 'value' }); + + const payload = provider.dec({ method: Method.Dec, key: 'test:dec', path: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Dec); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.DecInvalidType); + expect(key).toBe('test:dec'); + expect(path).toEqual([]); + }); + + test('GIVEN provider w/ invalid type at path THEN returns payload w/ invalid type error', () => { + provider.set({ method: Method.Set, key: 'test:dec', path: ['path'], value: 'value' }); + + const payload = provider.dec({ method: Method.Dec, key: 'test:dec', path: ['path'] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Dec); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.DecInvalidType); + expect(key).toBe('test:dec'); + expect(path).toEqual(['path']); + }); + + test('GIVEN provider w/ number at key THEN decremented number at key', () => { + provider.set({ method: Method.Set, key: 'test:dec', path: [], value: 1 }); + + const payload = provider.dec({ method: Method.Dec, key: 'test:dec', path: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Dec); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:dec'); + expect(path).toEqual([]); + }); + + test('GIVEN provider w/ number at path THEN decremented number at path', () => { + provider.set({ method: Method.Set, key: 'test:dec', path: ['path'], value: 1 }); + + const payload = provider.dec({ method: Method.Dec, key: 'test:dec', path: ['path'] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Dec); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:dec'); + expect(path).toEqual(['path']); + }); + }); + + describe('with delete method', () => { + test('GIVEN provider w/ value at key THEN deletes value at key', () => { + provider.set({ method: Method.Set, key: 'test:delete', path: [], value: 'value' }); + + const hasBefore = provider.has({ method: Method.Has, key: 'test:delete', path: [], data: false }); + + expect(hasBefore.data).toBe(true); + + const payload = provider.delete({ method: Method.Delete, key: 'test:delete', path: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error } = payload; + + expect(method).toBe(Method.Delete); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + + const hasAfter = provider.has({ method: Method.Has, key: 'test:delete', path: [], data: false }); + + expect(hasAfter.data).toBe(false); + }); + + test('GIVEN provider w/ value at path THEN deletes value at path', () => { + provider.set({ method: Method.Set, key: 'test:delete', path: ['path'], value: 'value' }); + + const hasBefore = provider.has({ method: Method.Has, key: 'test:delete', path: ['path'], data: false }); + + expect(hasBefore.data).toBe(true); + + const payload = provider.delete({ method: Method.Delete, key: 'test:delete', path: ['path'] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error } = payload; + + expect(method).toBe(Method.Delete); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + + const hasAfter = provider.has({ method: Method.Has, key: 'test:delete', path: ['path'], data: false }); + + expect(hasAfter.data).toBe(false); + }); + + test('GIVEN provider w/ value at nested path THEN deletes value at nested path', () => { + provider.set({ method: Method.Set, key: 'test:delete', path: ['path', 'nested'], value: 'value' }); + + const hasBefore = provider.has({ method: Method.Has, key: 'test:delete', path: ['path', 'nested'], data: false }); + + expect(hasBefore.data).toBe(true); + + const payload = provider.delete({ method: Method.Delete, key: 'test:delete', path: ['path', 'nested'] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error } = payload; + + expect(method).toBe(Method.Delete); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + + const hasAfter = provider.has({ method: Method.Has, key: 'test:delete', path: ['path', 'nested'], data: false }); + + expect(hasAfter.data).toBe(false); + }); + }); + + describe('with ensure method', () => { + test('GIVEN provider w/o data at key THEN returns payload w/ data as defaultValue AND sets default value at key', () => { + const sizeBefore = provider.size({ method: Method.Size, data: 0 }); + + expect(sizeBefore.data).toBe(0); + + const payload = provider.ensure({ method: Method.Ensure, key: 'test:ensure', defaultValue: 'defaultValue', data: 'defaultValue' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, defaultValue, data } = payload; + + expect(method).toBe(Method.Ensure); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:ensure'); + expect(defaultValue).toBe('defaultValue'); + expect(data).toBe('defaultValue'); + + const sizeAfter = provider.size({ method: Method.Size, data: 0 }); + + expect(sizeAfter.data).toBe(1); + }); + + test('GIVEN provider w/ value at key THEN returns payload w/ data as value at key', () => { + provider.set({ method: Method.Set, key: 'test:ensure', path: [], value: 'value' }); + + const payload = provider.ensure({ method: Method.Ensure, key: 'test:ensure', defaultValue: 'defaultValue', data: 'defaultValue' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, defaultValue, data } = payload; + + expect(method).toBe(Method.Ensure); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:ensure'); + expect(defaultValue).toBe('defaultValue'); + expect(data).toBe('value'); + }); + }); + + describe('with every method', () => { + describe('hook type', () => { + test('GIVEN provider w/o data THEN returns payload(true)', async () => { + const payload = await provider.every({ method: Method.Every, type: Payload.Type.Hook, hook: (value) => value === 'value', data: true }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Every); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toBe(false); + }); + + test('GIVEN provider w/ data THEN returns payload(true)', async () => { + provider.setMany({ + method: Method.SetMany, + data: [ + [{ key: 'firstKey', path: [] }, 'value'], + [{ key: 'secondKey', path: [] }, 'value'] + ] + }); + + const payload = await provider.every({ method: Method.Every, type: Payload.Type.Hook, hook: (value) => value === 'value', data: true }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Every); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toBe(true); + }); + }); + + describe('value type', () => { + test('GIVEN provider w/o data THEN returns payload(false)', async () => { + const payload = await provider.every({ method: Method.Every, type: Payload.Type.Value, path: ['path'], value: 'value', data: true }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, value, data } = payload; + + expect(method).toBe(Method.Every); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + expect(data).toBe(false); + }); + + test('GIVEN provider w/ data THEN returns payload(true)', async () => { + provider.setMany({ + method: Method.SetMany, + data: [ + [{ key: 'firstKey', path: ['path'] }, 'value'], + [{ key: 'secondKey', path: ['path'] }, 'value'] + ] + }); + + const payload = await provider.every({ method: Method.Every, type: Payload.Type.Value, path: ['path'], value: 'value', data: true }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, value, data } = payload; + + expect(method).toBe(Method.Every); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + expect(data).toBe(true); + }); + }); + }); + + describe('with filter method', () => { + describe('hook type', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from filter', async () => { + const payload = await provider.filter({ method: Method.Filter, type: Payload.Type.Hook, hook: (value) => value === 'value', data: {} }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Filter); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toEqual({}); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from filter', async () => { + provider.set({ method: Method.Set, key: 'test:filter', path: [], value: 'value' }); + + const payload = await provider.filter({ method: Method.Filter, type: Payload.Type.Hook, hook: (value) => value === 'value', data: {} }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Filter); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toEqual({ 'test:filter': 'value' }); + }); + }); + + describe('value type', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from filter', async () => { + const payload = await provider.filter({ method: Method.Filter, type: Payload.Type.Value, path: ['path'], value: 'value', data: {} }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, value, data } = payload; + + expect(method).toBe(Method.Filter); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + expect(data).toEqual({}); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from filter', async () => { + provider.set({ method: Method.Set, key: 'test:filter', path: ['path'], value: 'value' }); + + const payload = await provider.filter({ method: Method.Filter, type: Payload.Type.Value, path: ['path'], value: 'value', data: {} }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, value, data } = payload; + + expect(method).toBe(Method.Filter); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + expect(data).toEqual({ 'test:filter': { path: 'value' } }); + }); + }); + }); + + describe('with find method', () => { + describe('hook type', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from find', async () => { + const payload = await provider.find({ method: Method.Find, type: Payload.Type.Hook, hook: (value) => value === 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Find); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toBeUndefined(); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from find', async () => { + provider.set({ method: Method.Set, key: 'test:find', path: [], value: 'value' }); + + const payload = await provider.find({ method: Method.Find, type: Payload.Type.Hook, hook: (value) => value === 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Find); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toBe('value'); + }); + }); + + describe('value type', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from find', async () => { + const payload = await provider.find({ method: Method.Find, type: Payload.Type.Value, path: ['path'], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, value, data } = payload; + + expect(method).toBe(Method.Find); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + expect(data).toBeUndefined(); + }); + + test('GIVEN provider w/ data THEN returns payload w/o data from find', async () => { + provider.set({ method: Method.Set, key: 'test:find', path: ['path'], value: 'value' }); + + const payload = await provider.find({ method: Method.Find, type: Payload.Type.Value, path: ['path'], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, value, data } = payload; + + expect(method).toBe(Method.Find); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + expect(data).toEqual({ path: 'value' }); + }); + }); + }); + + describe('with get method', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from get', () => { + const payload = provider.get({ method: Method.Get, key: 'test:get', path: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, data } = payload; + + expect(method).toBe(Method.Get); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:get'); + expect(path).toEqual([]); + expect(data).toBeUndefined(); + }); + + test('GIVEN provider w/ value at key THEN returns payload w/ data from get at key', () => { + provider.set({ method: Method.Set, key: 'test:get', path: [], value: 'value' }); + + const payload = provider.get({ method: Method.Get, key: 'test:get', path: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, data } = payload; + + expect(method).toBe(Method.Get); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:get'); + expect(path).toEqual([]); + expect(data).toBe('value'); + }); + + test('GIVEN provider w/ value at path THEN returns payload w/ data from get at path', () => { + provider.set({ method: Method.Set, key: 'test:get', path: ['path'], value: 'value' }); + + const payload = provider.get({ method: Method.Get, key: 'test:get', path: ['path'] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, data } = payload; + + expect(method).toBe(Method.Get); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:get'); + expect(path).toEqual(['path']); + expect(data).toBe('value'); + }); + }); + + describe('with getAll method', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from getAll', () => { + const payload = provider.getAll({ method: Method.GetAll, data: {} }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.GetAll); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toEqual({}); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from getAll', () => { + provider.set({ method: Method.Set, key: 'test:getAll', path: [], value: 'value' }); + + const payload = provider.getAll({ method: Method.GetAll, data: {} }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.GetAll); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toEqual({ 'test:getAll': 'value' }); + }); + }); + + describe('with getMany method', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from getMany', () => { + const payload = provider.getMany({ method: Method.GetMany, keys: ['test:getMany'], data: {} }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, keys, data } = payload; + + expect(method).toBe(Method.GetMany); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(keys).toEqual(['test:getMany']); + expect(data).toEqual({ 'test:getMany': null }); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from getMany', () => { + provider.set({ method: Method.Set, key: 'test:getMany', path: [], value: 'value' }); + + const payload = provider.getMany({ method: Method.GetMany, keys: ['test:getMany'], data: {} }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, keys, data } = payload; + + expect(method).toBe(Method.GetMany); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(keys).toEqual(['test:getMany']); + expect(data).toEqual({ 'test:getMany': 'value' }); + }); + }); + + describe('with has method', () => { + test('GIVEN provider w/o data at key THEN returns payload(false)', () => { + const payload = provider.has({ method: Method.Has, key: 'test:has', path: [], data: false }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, data } = payload; + + expect(method).toBe(Method.Has); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:has'); + expect(path).toEqual([]); + expect(data).toBe(false); + }); + + test('GIVEN provider w/o data at path THEN returns payload(false)', () => { + provider.set({ method: Method.Set, key: 'test:has', path: [], value: 'value' }); + + const payload = provider.has({ method: Method.Has, key: 'test:has', path: ['path'], data: false }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, data } = payload; + + expect(method).toBe(Method.Has); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:has'); + expect(path).toEqual(['path']); + expect(data).toBe(false); + }); + + test('GIVEN provider w/ data at key THEN returns payload(true)', () => { + provider.set({ method: Method.Set, key: 'test:has', path: [], value: 'value' }); + + const payload = provider.has({ method: Method.Has, key: 'test:has', path: [], data: false }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, data } = payload; + + expect(method).toBe(Method.Has); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:has'); + expect(path).toEqual([]); + expect(data).toBe(true); + }); + + test('GIVEN provider w/ data at path THEN returns payload(true)', () => { + provider.set({ method: Method.Set, key: 'test:has', path: ['path'], value: 'value' }); + + const payload = provider.has({ method: Method.Has, key: 'test:has', path: ['path'], data: false }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, data } = payload; + + expect(method).toBe(Method.Has); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:has'); + expect(path).toEqual(['path']); + expect(data).toBe(true); + }); + }); + + describe('with inc method', () => { + test('GIVEN provider w/o data at key THEN returns payload w/ missing data error', () => { + const payload = provider.inc({ method: Method.Inc, key: 'test:inc', path: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Inc); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.IncMissingData); + expect(key).toBe('test:inc'); + expect(path).toEqual([]); + }); + + test('GIVEN provider w/o data at path THEN returns payload w/ missing data error', () => { + const payload = provider.inc({ method: Method.Inc, key: 'test:inc', path: ['path'] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Inc); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.IncMissingData); + expect(key).toBe('test:inc'); + expect(path).toEqual(['path']); + }); + + test('GIVEN provider w/ invalid type at key THEN returns payload w/ invalid type error', () => { + provider.set({ method: Method.Set, key: 'test:inc', path: [], value: 'value' }); + + const payload = provider.inc({ method: Method.Inc, key: 'test:inc', path: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Inc); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.IncInvalidType); + expect(key).toBe('test:inc'); + expect(path).toEqual([]); + }); + + test('GIVEN provider w/ invalid type at path THEN returns payload w/ invalid type error', () => { + provider.set({ method: Method.Set, key: 'test:inc', path: ['path'], value: 'value' }); + + const payload = provider.inc({ method: Method.Inc, key: 'test:inc', path: ['path'] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Inc); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.IncInvalidType); + expect(key).toBe('test:inc'); + expect(path).toEqual(['path']); + }); + + test('GIVEN provider w/ number at key THEN incremented number at key', () => { + provider.set({ method: Method.Set, key: 'test:inc', path: [], value: 0 }); + + const payload = provider.inc({ method: Method.Inc, key: 'test:inc', path: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Inc); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:inc'); + expect(path).toEqual([]); + }); + + test('GIVEN provider w/ number at path THEN incremented number at key and path', () => { + provider.set({ method: Method.Set, key: 'test:inc', path: ['path'], value: 0 }); + + const payload = provider.inc({ method: Method.Inc, key: 'test:inc', path: ['path'] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path } = payload; + + expect(method).toBe(Method.Inc); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:inc'); + expect(path).toEqual(['path']); + }); + }); + + describe('with keys method', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from keys', () => { + const payload = provider.keys({ method: Method.Keys, data: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.Keys); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toEqual([]); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from keys', () => { + provider.set({ method: Method.Set, key: 'test:keys', path: [], value: 'value' }); + + const payload = provider.keys({ method: Method.Keys, data: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.Keys); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toEqual(['test:keys']); + }); + }); + + describe('with map method', () => { + describe('hook type', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from map', async () => { + const payload = await provider.map({ method: Method.Map, type: Payload.Type.Hook, hook: (value) => value, data: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Map); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toEqual([]); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from map', async () => { + provider.set({ method: Method.Set, key: 'test:map', path: [], value: 'value' }); + + const payload = await provider.map({ method: Method.Map, type: Payload.Type.Hook, hook: (value) => value, data: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Map); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toEqual(['value']); + }); + }); + + describe('path type', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from map', async () => { + const payload = await provider.map({ method: Method.Map, type: Payload.Type.Path, path: [], data: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, data } = payload; + + expect(method).toBe(Method.Map); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual([]); + expect(data).toEqual([]); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from map', async () => { + provider.set({ method: Method.Set, key: 'test:map', path: [], value: 'value' }); + + const payload = await provider.map({ method: Method.Map, type: Payload.Type.Path, path: [], data: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, data } = payload; + + expect(method).toBe(Method.Map); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual([]); + expect(data).toEqual(['value']); + }); + + test('GIVEN provider w/ data at path THEN returns payload w/ data from map', async () => { + provider.set({ method: Method.Set, key: 'test:map', path: ['path'], value: 'value' }); + + const payload = await provider.map({ method: Method.Map, type: Payload.Type.Path, path: ['path'], data: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, data } = payload; + + expect(method).toBe(Method.Map); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual(['path']); + expect(data).toEqual(['value']); + }); + }); + }); + + describe('with math method', () => { + test('GIVEN provider w/o data THEN returns payload w/ error', () => { + const payload = provider.math({ method: Method.Math, key: 'test:math', path: [], operator: MathOperator.Addition, operand: 1 }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, operator, operand } = payload; + + expect(method).toBe(Method.Math); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.MathMissingData); + expect(key).toBe('test:math'); + expect(path).toEqual([]); + expect(operator).toBe(MathOperator.Addition); + expect(operand).toBe(1); + }); + + test('GIVEN provider w/o data at path THEN returns payload w/ error', () => { + provider.set({ method: Method.Set, key: 'test:math', path: [], value: 0 }); + + const payload = provider.math({ method: Method.Math, key: 'test:math', path: ['path'], operator: MathOperator.Addition, operand: 1 }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, operator, operand } = payload; + + expect(method).toBe(Method.Math); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.MathMissingData); + expect(key).toBe('test:math'); + expect(path).toEqual(['path']); + expect(operator).toBe(MathOperator.Addition); + expect(operand).toBe(1); + }); + + test('GIVEN provider w/ invalid type at key THEN returns payload w/ error', () => { + provider.set({ method: Method.Set, key: 'test:math', path: [], value: 'value' }); + + const payload = provider.math({ method: Method.Math, key: 'test:math', path: [], operator: MathOperator.Addition, operand: 1 }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, operator, operand } = payload; + + expect(method).toBe(Method.Math); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.MathInvalidType); + expect(key).toBe('test:math'); + expect(path).toEqual([]); + expect(operator).toBe(MathOperator.Addition); + expect(operand).toBe(1); + }); + + test('GIVEN provider w/ invalid type at path THEN returns payload w/ error', () => { + provider.set({ method: Method.Set, key: 'test:math', path: ['path'], value: 'value' }); + + const payload = provider.math({ method: Method.Math, key: 'test:math', path: ['path'], operator: MathOperator.Addition, operand: 1 }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, operator, operand } = payload; + + expect(method).toBe(Method.Math); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.MathInvalidType); + expect(key).toBe('test:math'); + expect(path).toEqual(['path']); + expect(operator).toBe(MathOperator.Addition); + expect(operand).toBe(1); + }); + }); + + describe('with partition method', () => { + describe('hook type', () => { + test('GIVEN provider w/o data THEN returns payload w/o data', async () => { + const payload = await provider.partition({ + method: Method.Partition, + type: Payload.Type.Hook, + hook: (value) => value === 'value', + data: { truthy: {}, falsy: {} } + }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, hook, data } = payload; + + expect(method).toBe(Method.Partition); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(type).toBe(Payload.Type.Hook); + expect(typeof hook).toBe('function'); + expect(data.truthy).toEqual({}); + expect(data.falsy).toEqual({}); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data', async () => { + provider.set({ method: Method.Set, key: 'test:partition', path: [], value: 'value' }); + + const payload = await provider.partition({ + method: Method.Partition, + type: Payload.Type.Hook, + hook: (value) => value === 'value', + data: { truthy: {}, falsy: {} } + }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, hook, data } = payload; + + expect(method).toBe(Method.Partition); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(type).toBe(Payload.Type.Hook); + expect(typeof hook).toBe('function'); + expect(data.truthy).toEqual({ 'test:partition': 'value' }); + expect(data.falsy).toEqual({}); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data', async () => { + provider.set({ method: Method.Set, key: 'test:partition', path: [], value: 'value' }); + + const payload = await provider.partition({ + method: Method.Partition, + type: Payload.Type.Hook, + hook: (value) => value !== 'value', + data: { truthy: {}, falsy: {} } + }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, hook, data } = payload; + + expect(method).toBe(Method.Partition); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(type).toBe(Payload.Type.Hook); + expect(typeof hook).toBe('function'); + expect(data.truthy).toEqual({}); + expect(data.falsy).toEqual({ 'test:partition': 'value' }); + }); + }); + + describe('value type', () => { + test('GIVEN provider w/o data THEN returns payload w/o data', async () => { + const payload = await provider.partition({ + method: Method.Partition, + type: Payload.Type.Value, + path: [], + value: 'value', + data: { truthy: {}, falsy: {} } + }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, path, value, data } = payload; + + expect(method).toBe(Method.Partition); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(type).toBe(Payload.Type.Value); + expect(path).toEqual([]); + expect(value).toBe('value'); + expect(data.truthy).toEqual({}); + expect(data.falsy).toEqual({}); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data', async () => { + provider.set({ method: Method.Set, key: 'test:partition', path: [], value: 'value' }); + + const payload = await provider.partition({ + method: Method.Partition, + type: Payload.Type.Value, + path: [], + value: 'value', + data: { truthy: {}, falsy: {} } + }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, path, value, data } = payload; + + expect(method).toBe(Method.Partition); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(type).toBe(Payload.Type.Value); + expect(path).toEqual([]); + expect(value).toBe('value'); + expect(data.truthy).toEqual({ 'test:partition': 'value' }); + expect(data.falsy).toEqual({}); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data', async () => { + provider.set({ method: Method.Set, key: 'test:partition', path: [], value: 'value' }); + + const payload = await provider.partition({ + method: Method.Partition, + type: Payload.Type.Value, + path: [], + value: 'anotherValue', + data: { truthy: {}, falsy: {} } + }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, path, value, data } = payload; + + expect(method).toBe(Method.Partition); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(type).toBe(Payload.Type.Value); + expect(path).toEqual([]); + expect(value).toBe('anotherValue'); + expect(data.truthy).toEqual({}); + expect(data.falsy).toEqual({ 'test:partition': 'value' }); + }); + }); + }); + + describe('with push method', () => { + test('GIVEN provider w/o data THEN returns payload w/ missing data error', () => { + const payload = provider.push({ method: Method.Push, key: 'test:push', path: [], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, value } = payload; + + expect(method).toBe(Method.Push); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.PushMissingData); + expect(key).toBe('test:push'); + expect(path).toEqual([]); + expect(value).toBe('value'); + }); + + test('GIVEN provider w/o data at path THEN returns payload w/ missing data error', () => { + provider.set({ method: Method.Set, key: 'test:push', path: [], value: {} }); + + const payload = provider.push({ method: Method.Push, key: 'test:push', path: ['path'], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, value } = payload; + + expect(method).toBe(Method.Push); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.PushMissingData); + expect(key).toBe('test:push'); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + }); + + test('GIVEN provider w/ invalid type at key THEN returns payload w/ invalid type error', () => { + provider.set({ method: Method.Set, key: 'test:push', path: [], value: 'value' }); + + const payload = provider.push({ method: Method.Push, key: 'test:push', path: [], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, value } = payload; + + expect(method).toBe(Method.Push); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.PushInvalidType); + expect(key).toBe('test:push'); + expect(path).toEqual([]); + expect(value).toBe('value'); + }); + + test('GIVEN provider w/ invalid type at path THEN returns payload w/ invalid type error', () => { + provider.set({ method: Method.Set, key: 'test:push', path: ['path'], value: 'value' }); + + const payload = provider.push({ method: Method.Push, key: 'test:push', path: ['path'], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, value } = payload; + + expect(method).toBe(Method.Push); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.PushInvalidType); + expect(key).toBe('test:push'); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + }); + + test('GIVEN provider w/ array at key THEN returns payload AND pushes value to array at key', () => { + provider.set({ method: Method.Set, key: 'test:push', path: [], value: [] }); + + const payload = provider.push({ method: Method.Push, key: 'test:push', path: [], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, value } = payload; + + expect(method).toBe(Method.Push); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:push'); + expect(path).toEqual([]); + expect(value).toBe('value'); + }); + + test('GIVEN provider w/ array at path THEN returns payload AND pushes value to array at path', () => { + provider.set({ method: Method.Set, key: 'test:push', path: ['path'], value: [] }); + + const payload = provider.push({ method: Method.Push, key: 'test:push', path: ['path'], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, value } = payload; + + expect(method).toBe(Method.Push); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:push'); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + }); + }); + + describe('with random method', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from random', () => { + const payload = provider.random({ method: Method.Random }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.Random); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toBeUndefined(); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from random', () => { + provider.set({ method: Method.Set, key: 'test:random', path: [], value: 'value' }); + + const payload = provider.random({ method: Method.Random }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.Random); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toBe('value'); + }); + }); + + describe('with randomKey', () => { + test('GIVEN provider w/o data THEN returns payload w/o data from randomKey', () => { + const payload = provider.randomKey({ method: Method.RandomKey }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.RandomKey); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toBeUndefined(); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data from randomKey', () => { + provider.set({ method: Method.Set, key: 'test:randomKey', path: [], value: 'value' }); + + const payload = provider.randomKey({ method: Method.RandomKey }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.RandomKey); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toBe('test:randomKey'); + }); + }); + + describe('with remove method', () => { + describe('hook type', () => { + test('GIVEN provider w/o data at key THEN returns payload w/ missing data error', async () => { + const payload = await provider.remove({ + method: Method.Remove, + type: Payload.Type.Hook, + key: 'test:remove', + path: [], + hook: (value) => value === 'value' + }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, key, path, hook } = payload; + + expect(method).toBe(Method.Remove); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.RemoveMissingData); + expect(type).toBe(Payload.Type.Hook); + expect(key).toBe('test:remove'); + expect(path).toEqual([]); + expect(typeof hook).toBe('function'); + }); + + test('GIVEN provider w/ invalid type at key THEN returns payload w/ invalid type error', async () => { + provider.set({ method: Method.Set, key: 'test:remove', path: [], value: 'value' }); + + const payload = await provider.remove({ + method: Method.Remove, + type: Payload.Type.Hook, + key: 'test:remove', + path: [], + hook: (value) => value === 'value' + }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, key, path, hook } = payload; + + expect(method).toBe(Method.Remove); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.RemoveInvalidType); + expect(type).toBe(Payload.Type.Hook); + expect(key).toBe('test:remove'); + expect(path).toEqual([]); + expect(typeof hook).toBe('function'); + }); + + test('GIVEN provider w/ array at key THEN returns payload AND removes value from array at key', async () => { + provider.set({ method: Method.Set, key: 'test:remove', path: [], value: ['value'] }); + + const getBefore = provider.get({ method: Method.Get, key: 'test:remove', path: [] }); + + expect(getBefore.data).toEqual(['value']); + + const payload = await provider.remove({ + method: Method.Remove, + type: Payload.Type.Hook, + key: 'test:remove', + path: [], + hook: (value) => value === 'value' + }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, key, path, hook } = payload; + + expect(method).toBe(Method.Remove); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(type).toBe(Payload.Type.Hook); + expect(key).toBe('test:remove'); + expect(path).toEqual([]); + expect(typeof hook).toBe('function'); + + const getAfter = provider.get({ method: Method.Get, key: 'test:remove', path: [] }); + + expect(getAfter.data).toEqual([]); + }); + }); + + describe('value type', () => { + test('GIVEN provider w/o data at key THEN returns payload w/ missing data error', async () => { + const payload = await provider.remove({ method: Method.Remove, type: Payload.Type.Value, key: 'test:remove', path: [], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, key, path, value } = payload; + + expect(method).toBe(Method.Remove); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.RemoveMissingData); + expect(type).toBe(Payload.Type.Value); + expect(key).toBe('test:remove'); + expect(path).toEqual([]); + expect(value).toBe('value'); + }); + + test('GIVEN provider w/ invalid type at key THEN returns payload w/ invalid type error', async () => { + provider.set({ method: Method.Set, key: 'test:remove', path: [], value: 'value' }); + + const payload = await provider.remove({ method: Method.Remove, type: Payload.Type.Value, key: 'test:remove', path: [], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, key, path, value } = payload; + + expect(method).toBe(Method.Remove); + expect(trigger).toBeUndefined(); + expect(error).toBeInstanceOf(MapProviderError); + expect(error?.identifier).toBe(JoshProvider.CommonIdentifiers.RemoveInvalidType); + expect(type).toBe(Payload.Type.Value); + expect(key).toBe('test:remove'); + expect(path).toEqual([]); + expect(value).toBe('value'); + }); + + test('GIVEN provider w/ array at key THEN returns payload AND removes value from array at key', async () => { + provider.set({ method: Method.Set, key: 'test:remove', path: [], value: ['value'] }); + + const getBefore = provider.get({ method: Method.Get, key: 'test:remove', path: [] }); + + expect(getBefore.data).toEqual(['value']); + + const payload = await provider.remove({ method: Method.Remove, type: Payload.Type.Value, key: 'test:remove', path: [], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, type, key, path, value } = payload; + + expect(method).toBe(Method.Remove); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(type).toBe(Payload.Type.Value); + expect(key).toBe('test:remove'); + expect(path).toEqual([]); + expect(value).toBe('value'); + + const getAfter = provider.get({ method: Method.Get, key: 'test:remove', path: [] }); + + expect(getAfter.data).toEqual([]); + }); + }); + }); + + describe('with set method', () => { + test('GIVEN provider w/o data THEN returns payload AND sets value at key', () => { + const hasBefore = provider.has({ method: Method.Has, key: 'test:set', path: [], data: false }); + + expect(hasBefore.data).toBe(false); + + const payload = provider.set({ method: Method.Set, key: 'test:set', path: [], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, value } = payload; + + expect(method).toBe(Method.Set); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:set'); + expect(path).toEqual([]); + expect(value).toBe('value'); + + const hasAfter = provider.has({ method: Method.Has, key: 'test:set', path: [], data: false }); + + expect(hasAfter.data).toBe(true); + }); + + test('GIVEN provider w/o data THEN returns payload AND sets value at key and path', () => { + const hasBefore = provider.has({ method: Method.Has, key: 'test:set', path: ['path'], data: false }); + + expect(hasBefore.data).toBe(false); + + const payload = provider.set({ method: Method.Set, key: 'test:set', path: ['path'], value: 'value' }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, value } = payload; + + expect(method).toBe(Method.Set); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:set'); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + + const hasAfter = provider.has({ method: Method.Has, key: 'test:set', path: ['path'], data: false }); + + expect(hasAfter.data).toBe(true); + }); + }); + + describe('with setMany method', () => { + test('GIVEN provider w/o data THEN returns payload AND sets value at key', () => { + const hasBefore = provider.has({ method: Method.Has, key: 'test:setMany', path: [], data: false }); + + expect(hasBefore.data).toBe(false); + + const payload = provider.setMany({ method: Method.SetMany, data: [[{ key: 'test:setMany', path: [] }, 'value']] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.SetMany); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toEqual([[{ key: 'test:setMany', path: [] }, 'value']]); + }); + }); + + describe('with size method', () => { + test('GIVEN provider w/o data THEN returns payload(0)', () => { + const payload = provider.size({ method: Method.Size, data: 0 }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.Size); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toBe(0); + }); + + test('GIVEN provider w/ data THEN returns payload(1)', () => { + provider.set({ method: Method.Set, key: 'test:size', path: [], value: 'value' }); + + const payload = provider.size({ method: Method.Size, data: 0 }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.Size); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toBe(1); + }); + }); + + describe('with some method', () => { + describe('hook type', () => { + test('GIVEN provider w/o data THEN returns payload(false)', async () => { + const payload = await provider.some({ method: Method.Some, type: Payload.Type.Hook, hook: (value) => value === 'value', data: false }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Some); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toBe(false); + }); + + test('GIVEN provider w/ data THEN returns payload(true)', async () => { + provider.set({ method: Method.Set, key: 'test:some', path: [], value: 'value' }); + + const payload = await provider.some({ method: Method.Some, type: Payload.Type.Hook, hook: (value) => value === 'value', data: false }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, hook, data } = payload; + + expect(method).toBe(Method.Some); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(typeof hook).toBe('function'); + expect(data).toBe(true); + }); + }); + + describe('value type', () => { + test('GIVEN provider w/o data THEN returns payload(false)', async () => { + const payload = await provider.some({ method: Method.Some, type: Payload.Type.Value, path: ['path'], value: 'value', data: false }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, value, data } = payload; + + expect(method).toBe(Method.Some); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + expect(data).toBe(false); + }); + + test('GIVEN provider w/ data THEN returns payload(true)', async () => { + provider.set({ method: Method.Set, key: 'test:some', path: ['path'], value: 'value' }); + + const payload = await provider.some({ method: Method.Some, type: Payload.Type.Value, path: ['path'], value: 'value', data: false }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, path, value, data } = payload; + + expect(method).toBe(Method.Some); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(path).toEqual(['path']); + expect(value).toBe('value'); + expect(data).toBe(true); + }); + }); + }); + + describe('with update method', () => { + test('GIVEN provider w/o data THEN returns payload w/o data', async () => { + const payload = await provider.update({ method: Method.Update, key: 'test:update', path: [], hook: (value) => value }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, hook, data } = payload; + + expect(method).toBe(Method.Update); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:update'); + expect(path).toEqual([]); + expect(typeof hook).toBe('function'); + expect(data).toBeUndefined(); + }); + + test('GIVEN provider w/ data at key THEN returns payload w/ data AND updates value at key', async () => { + provider.set({ method: Method.Set, key: 'test:update', path: [], value: 'value' }); + + const payload = await provider.update({ method: Method.Update, key: 'test:update', path: [], hook: (value) => value }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, hook, data } = payload; + + expect(method).toBe(Method.Update); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:update'); + expect(path).toEqual([]); + expect(typeof hook).toBe('function'); + expect(data).toBe('value'); + }); + + test('GIVEN provider w/ data at path THEN returns payload w/ data AND updates value at path', async () => { + provider.set({ method: Method.Set, key: 'test:update', path: ['path'], value: 'value' }); + + const payload = await provider.update({ method: Method.Update, key: 'test:update', path: ['path'], hook: (value) => value }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, key, path, hook, data } = payload; + + expect(method).toBe(Method.Update); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(key).toBe('test:update'); + expect(path).toEqual(['path']); + expect(typeof hook).toBe('function'); + expect(data).toBe('value'); + }); + }); + + describe('with values method', () => { + test('GIVEN provider w/o data THEN returns payload w/o data', () => { + const payload = provider.values({ method: Method.Values, data: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.Values); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toEqual([]); + }); + + test('GIVEN provider w/ data THEN returns payload w/ data', () => { + provider.set({ method: Method.Set, key: 'test:values', path: [], value: 'value' }); + + const payload = provider.values({ method: Method.Values, data: [] }); + + expect(typeof payload).toBe('object'); + + const { method, trigger, error, data } = payload; + + expect(method).toBe(Method.Values); + expect(trigger).toBeUndefined(); + expect(error).toBeUndefined(); + expect(data).toEqual(['value']); + }); + }); + }); +}); diff --git a/tests/lib/structures/default-provider/MapProviderError.test.ts b/tests/lib/structures/default-provider/MapProviderError.test.ts new file mode 100644 index 00000000..37dcb7df --- /dev/null +++ b/tests/lib/structures/default-provider/MapProviderError.test.ts @@ -0,0 +1,13 @@ +import { MapProviderError } from '../../../../src'; + +describe('MapProviderError', () => { + describe('is a class', () => { + test('GIVEN typeof MapProviderError THEN returns function', () => { + expect(typeof MapProviderError).toBe('function'); + }); + + test('GIVEN typeof ...prototype THEN returns object', () => { + expect(typeof MapProviderError.prototype).toBe('object'); + }); + }); +}); diff --git a/tests/tsconfig.json b/tests/tsconfig.json new file mode 100644 index 00000000..4eb37fee --- /dev/null +++ b/tests/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../tsconfig.base.json" +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 00000000..85bbc3c0 --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,9 @@ +{ + "extends": "@sapphire/ts-config", + "compilerOptions": { + "importHelpers": true, + "noEmitHelpers": true, + "target": "ES2021", + "module": "ESNext" + } +} diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 00000000..7a3baf92 --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.base.json", + "include": ["src", "tests", "jest.config.ts", "rollup.bundle.ts"] +} diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 00000000..afd1f742 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,5 @@ +{ + "entryPoints": ["src/index.ts"], + "json": "docs/api.json", + "tsconfig": "src/tsconfig.json" +} diff --git a/typings/index.d.ts b/typings/index.d.ts deleted file mode 100644 index ad38dcae..00000000 --- a/typings/index.d.ts +++ /dev/null @@ -1,114 +0,0 @@ -declare module "@joshdb/core" { - export interface JoshOptions { - name: string; - provider: unknown, - ensureProps?: boolean; - autoEnsure?: T; - serializer?: (data: T) => Promise; - deserializer?: (data: T) => Promise; - providerOptions?: object; - } - - export default class Josh { - public constructor(options: JoshOptions); - - public all: symbol; - - public get keys(): Promise; - - public get values(): Promise; - - public get size(): Promise; - - public get(keyOrPath: string): Promise; - - public getMany( - keyOrPaths: string[] - ): Promise; - - public random(count: number): Promise<[string, T][]>; - - public randomKey(count: number): Promise; - - public has(keyOrPath: string): Promise; - - public set( - keyOrPath: string, - value: K - ): Promise>; - - public setMany(data: [string, T][], overwrite?: boolean): Promise>; - - public update = Partial>( - keyOrPath: string, - input: K - ): Promise; - - public ensure(keyOrPath: string, defaultValue: T): Promise; - - public delete(keyOrPath: string | symbol): Promise>; - - public push( - keyOrPath: string, - value: K, - allowDupes: boolean - ): Promise>; - - public remove( - keyOrPath: string, - value: K - ): Promise>; - - public inc(keyOrPath: string): Promise>; - - public dec(keyOrPath: string): Promise>; - - public find( - pathOrFn: string | ((value: K) => Promise | boolean), - predicate?: string - ): Promise; - - public filter( - pathOrFn: string | ((value: K) => Promise | boolean), - predicate?: string - ): Promise<[string, T][]>; - - public map( - pathOrFn: string | ((value: T) => Promise | K) - ): Promise; - - public includes( - keyOrPath: string, - value: K - ): Promise; - - public some( - keyOrPath: string, - value: string | number | boolean | null - ): Promise; - - public every( - pathOrFn: string, - value: string | number | boolean | null - ): Promise; - - public math( - keyOrPath: string, - operation: string, - operand: number, - path?: string - ): Promise>; - - public get autoId(): Promise; - - public import( - data: string, - overwrite?: boolean, - clear?: boolean - ): Promise>; - - public export(): Promise; - - static multi(names: string[], options: Omit): Josh[]; - } -} diff --git a/yarn.lock b/yarn.lock index 51c175f5..8275dda7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,151 +2,195 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" - integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.10" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.10" - "@babel/types" "^7.12.10" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" + integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.7" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" - semver "^5.4.1" + semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.12.10", "@babel/generator@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" - integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== - dependencies: - "@babel/types" "^7.12.11" - jsesc "^2.5.1" +"@babel/core@^7.8.0": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" + integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.12" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.10" + "@babel/types" "^7.16.8" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" source-map "^0.5.0" -"@babel/helper-function-name@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" - integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== - dependencies: - "@babel/helper-get-function-arity" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/types" "^7.12.11" - -"@babel/helper-get-function-arity@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" - integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== - dependencies: - "@babel/types" "^7.12.10" - -"@babel/helper-member-expression-to-functions@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" - integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== - dependencies: - "@babel/types" "^7.12.7" - -"@babel/helper-module-imports@^7.12.1": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" - integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== - dependencies: - "@babel/types" "^7.12.5" - -"@babel/helper-module-transforms@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" - integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== - dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-simple-access" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/helper-validator-identifier" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - lodash "^4.17.19" - -"@babel/helper-optimise-call-expression@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" - integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== - dependencies: - "@babel/types" "^7.12.10" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-replace-supers@^7.12.1": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz#ea511658fc66c7908f923106dd88e08d1997d60d" - integrity sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.7" - "@babel/helper-optimise-call-expression" "^7.12.10" - "@babel/traverse" "^7.12.10" - "@babel/types" "^7.12.11" - -"@babel/helper-simple-access@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" - integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== +"@babel/generator@^7.16.7", "@babel/generator@^7.7.2": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.7.tgz#b42bf46a3079fa65e1544135f32e7958f048adbb" + integrity sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.16.7" + jsesc "^2.5.1" + source-map "^0.5.0" -"@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a" - integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== +"@babel/generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== dependencies: - "@babel/types" "^7.12.11" - -"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/types" "^7.16.8" + jsesc "^2.5.1" + source-map "^0.5.0" -"@babel/helpers@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" - integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + 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" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/highlight@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.9.4": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" - integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.7.tgz#d372dda9c89fcec340a82630a9f533f2fe15877e" + integrity sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA== + +"@babel/parser@^7.16.10", "@babel/parser@^7.16.12": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" + integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -163,11 +207,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" - integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -226,43 +270,74 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" - integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.16.10": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" + integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@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.16.10" + "@babel/types" "^7.16.8" + debug "^4.1.0" + globals "^11.1.0" -"@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.3.3": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" - integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" - integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== - dependencies: - "@babel/code-frame" "^7.12.11" - "@babel/generator" "^7.12.11" - "@babel/helper-function-name" "^7.12.11" - "@babel/helper-split-export-declaration" "^7.12.11" - "@babel/parser" "^7.12.11" - "@babel/types" "^7.12.12" +"@babel/traverse@^7.16.7", "@babel/traverse@^7.7.2": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.7.tgz#dac01236a72c2560073658dd1a285fe4e0865d76" + integrity sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.7" + "@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.16.7" + "@babel/types" "^7.16.7" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" - integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== +"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.7.tgz#4ed19d51f840ed4bd5645be6ce40775fecf03159" + integrity sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -270,13 +345,210 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== +"@commitlint/cli@^16.1.0": + version "16.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-16.1.0.tgz#022ad86008374b02974c9f3faf86affb785f4574" + integrity sha512-x5L1knvA3isRWBRVQx+Q6D45pA9139a2aZQYpxkljMG0dj4UHZkCnsYWpnGalxPxASI7nrI0KedKfS2YeQ55cQ== + dependencies: + "@commitlint/format" "^16.0.0" + "@commitlint/lint" "^16.0.0" + "@commitlint/load" "^16.1.0" + "@commitlint/read" "^16.0.0" + "@commitlint/types" "^16.0.0" + lodash "^4.17.19" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^17.0.0" + +"@commitlint/config-conventional@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-16.0.0.tgz#f42d9e1959416b5e691c8b5248fc2402adb1fc03" + integrity sha512-mN7J8KlKFn0kROd+q9PB01sfDx/8K/R25yITspL1No8PB4oj9M1p77xWjP80hPydqZG9OvQq+anXK3ZWeR7s3g== + dependencies: + conventional-changelog-conventionalcommits "^4.3.1" + +"@commitlint/config-validator@^16.1.0": + version "16.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-16.1.0.tgz#410979f713ed55cbb85504d46295c1fd2419dc4d" + integrity sha512-2cHeZPNTuf1JWbMqyA46MkExor5HMSgv8JrdmzEakUbJHUreh35/wN00FJf57qGs134exQW2thiSQ1IJUsVx2Q== + dependencies: + "@commitlint/types" "^16.0.0" + ajv "^6.12.6" + +"@commitlint/ensure@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-16.0.0.tgz#fdac1e60a944a1993deb33b5e8454c559abe9866" + integrity sha512-WdMySU8DCTaq3JPf0tZFCKIUhqxaL54mjduNhu8v4D2AMUVIIQKYMGyvXn94k8begeW6iJkTf9cXBArayskE7Q== + dependencies: + "@commitlint/types" "^16.0.0" + lodash "^4.17.19" + +"@commitlint/execute-rule@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-16.0.0.tgz#824e11ba5b208c214a474ae52a51780d32d31ebc" + integrity sha512-8edcCibmBb386x5JTHSPHINwA5L0xPkHQFY8TAuDEt5QyRZY/o5DF8OPHSa5Hx2xJvGaxxuIz4UtAT6IiRDYkw== + +"@commitlint/format@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-16.0.0.tgz#6a6fb2c1e6460aff63cc6eca30a7807a96b0ce73" + integrity sha512-9yp5NCquXL1jVMKL0ZkRwJf/UHdebvCcMvICuZV00NQGYSAL89O398nhqrqxlbjBhM5EZVq0VGcV5+7r3D4zAA== + dependencies: + "@commitlint/types" "^16.0.0" + chalk "^4.0.0" + +"@commitlint/is-ignored@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-16.0.0.tgz#5ab4c4a9c7444c1a8540f50a0f1a907dfd78eb70" + integrity sha512-gmAQcwIGC/R/Lp0CEb2b5bfGC7MT5rPe09N8kOGjO/NcdNmfFSZMquwrvNJsq9hnAP0skRdHIsqwlkENkN4Lag== + dependencies: + "@commitlint/types" "^16.0.0" + semver "7.3.5" + +"@commitlint/lint@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-16.0.0.tgz#87151a935941073027907fd4752a2e3c83cebbfe" + integrity sha512-HNl15bRC0h+pLzbMzQC3tM0j1aESXsLYhElqKnXcf5mnCBkBkHzu6WwJW8rZbfxX+YwJmNljN62cPhmdBo8x0A== + dependencies: + "@commitlint/is-ignored" "^16.0.0" + "@commitlint/parse" "^16.0.0" + "@commitlint/rules" "^16.0.0" + "@commitlint/types" "^16.0.0" + +"@commitlint/load@^16.1.0": + version "16.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-16.1.0.tgz#7a884072ab915611080c5e99a1f1d999c05f4360" + integrity sha512-MtlEhKjP8jAF85jjX4mw8DUUwCxKsCgAc865hhpnwxjrfBcmGP7Up2AFE/M3ZMGDmSl1X1TMybQk/zohj8Cqdg== + dependencies: + "@commitlint/config-validator" "^16.1.0" + "@commitlint/execute-rule" "^16.0.0" + "@commitlint/resolve-extends" "^16.1.0" + "@commitlint/types" "^16.0.0" + chalk "^4.0.0" + cosmiconfig "^7.0.0" + cosmiconfig-typescript-loader "^1.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + typescript "^4.4.3" + +"@commitlint/message@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-16.0.0.tgz#4a467341fc6bc49e5a3ead005dd6aa36fa856b87" + integrity sha512-CmK2074SH1Ws6kFMEKOKH/7hMekGVbOD6vb4alCOo2+33ZSLUIX8iNkDYyrw38Jwg6yWUhLjyQLUxREeV+QIUA== + +"@commitlint/parse@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-16.0.0.tgz#5ce05af14edff806effc702ba910fcb32fcb192a" + integrity sha512-F9EjFlMw4MYgBEqoRrWZZKQBzdiJzPBI0qFDFqwUvfQsMmXEREZ242T4R5bFwLINWaALFLHEIa/FXEPa6QxCag== + dependencies: + "@commitlint/types" "^16.0.0" + conventional-changelog-angular "^5.0.11" + conventional-commits-parser "^3.2.2" + +"@commitlint/read@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-16.0.0.tgz#92fab45d4e0e4d7d049427306500270b3e459221" + integrity sha512-H4T2zsfmYQK9B+JtoQaCXWBHUhgIJyOzWZjSfuIV9Ce69/OgHoffNpLZPF2lX6yKuDrS1SQFhI/kUCjVc/e4ew== + dependencies: + "@commitlint/top-level" "^16.0.0" + "@commitlint/types" "^16.0.0" + fs-extra "^10.0.0" + git-raw-commits "^2.0.0" + +"@commitlint/resolve-extends@^16.1.0": + version "16.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-16.1.0.tgz#4b199197c45ddb436b59ef319662de6870f68fd5" + integrity sha512-8182s6AFoUFX6+FT1PgQDt15nO2ogdR/EN8SYVAdhNXw1rLz8kT5saB/ICw567GuRAUgFTUMGCXy3ctMOXPEDg== + dependencies: + "@commitlint/config-validator" "^16.1.0" + "@commitlint/types" "^16.0.0" + import-fresh "^3.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/rules@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-16.0.0.tgz#79d28c3678d2d1f7f1cdbedaedb30b01a86ee75b" + integrity sha512-AOl0y2SBTdJ1bvIv8nwHvQKRT/jC1xb09C5VZwzHoT8sE8F54KDeEzPCwHQFgUcWdGLyS10kkOTAH2MyA8EIlg== + dependencies: + "@commitlint/ensure" "^16.0.0" + "@commitlint/message" "^16.0.0" + "@commitlint/to-lines" "^16.0.0" + "@commitlint/types" "^16.0.0" + execa "^5.0.0" + +"@commitlint/to-lines@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-16.0.0.tgz#799980a89072302445baf595e20092fb86f0a58a" + integrity sha512-iN/qU38TCKU7uKOg6RXLpD49wNiuI0TqMqybHbjefUeP/Jmzxa8ishryj0uLyVdrAl1ZjGeD1ukXGMTtvqz8iA== + +"@commitlint/top-level@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-16.0.0.tgz#7c2efc33cc37df839b3de558c0bc2eaddb64efe6" + integrity sha512-/Jt6NLxyFkpjL5O0jxurZPCHURZAm7cQCqikgPCwqPAH0TLgwqdHjnYipl8J+AGnAMGDip4FNLoYrtgIpZGBYw== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-16.0.0.tgz#3c133f106d36132756c464071a7f2290966727a3" + integrity sha512-+0FvYOAS39bJ4aKjnYn/7FD4DfWkmQ6G/06I4F0Gvu4KS5twirEg8mIcLhmeRDOOKn4Tp8PwpLwBiSA6npEMQA== + dependencies: + chalk "^4.0.0" + +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" + "@cspotcode/source-map-consumer" "0.8.0" + +"@eslint/eslintrc@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318" + integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.2.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@favware/rollup-type-bundler@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@favware/rollup-type-bundler/-/rollup-type-bundler-1.0.7.tgz#d8d1ca8d77f6aa17a2df24bb215bc01f43a8afd1" + integrity sha512-KWHyx/tllQ6hR3QzsQUdWzmZiyTcmjBl7pjBiEY+FcffagFxdaYhosXFhUwIy8lyTkrKUaD8rhop9esc2r6CHQ== + dependencies: + "@sapphire/utilities" "^3.1.0" + colorette "^2.0.16" + commander "^8.3.0" + js-yaml "^4.1.0" + rollup "^2.63.0" + rollup-plugin-dts "^4.1.0" + typescript "^4.5.4" + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.2.tgz#68be55c737023009dfc5fe245d51181bb6476914" + integrity sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -290,199 +562,290 @@ resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== +"@jest/console@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.4.6.tgz#0742e6787f682b22bdad56f9db2a8a77f6a86107" + integrity sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.4.6" + jest-util "^27.4.2" slash "^3.0.0" -"@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== +"@jest/core@^27.4.7": + version "27.4.7" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.4.7.tgz#84eabdf42a25f1fa138272ed229bcf0a1b5e6913" + integrity sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg== dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.4.6" + "@jest/reporters" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" + emittery "^0.8.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" + jest-changed-files "^27.4.2" + jest-config "^27.4.7" + jest-haste-map "^27.4.6" + jest-message-util "^27.4.6" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.6" + jest-resolve-dependencies "^27.4.6" + jest-runner "^27.4.6" + jest-runtime "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + jest-validate "^27.4.6" + jest-watcher "^27.4.6" + micromatch "^4.0.4" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== +"@jest/environment@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.4.6.tgz#1e92885d64f48c8454df35ed9779fbcf31c56d8b" + integrity sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg== dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/fake-timers" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^26.6.2" + jest-mock "^27.4.6" -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== +"@jest/fake-timers@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.4.6.tgz#e026ae1671316dbd04a56945be2fa251204324e8" + integrity sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A== dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" + "@jest/types" "^27.4.2" + "@sinonjs/fake-timers" "^8.0.1" "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.4.6" + jest-mock "^27.4.6" + jest-util "^27.4.2" -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== +"@jest/globals@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.4.6.tgz#3f09bed64b0fd7f5f996920258bd4be8f52f060a" + integrity sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw== dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" + "@jest/environment" "^27.4.6" + "@jest/types" "^27.4.2" + expect "^27.4.6" -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== +"@jest/reporters@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.4.6.tgz#b53dec3a93baf9b00826abf95b932de919d6d8dd" + integrity sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" graceful-fs "^4.2.4" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" + istanbul-reports "^3.1.3" + jest-haste-map "^27.4.6" + jest-resolve "^27.4.6" + jest-util "^27.4.2" + jest-worker "^27.4.6" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" + v8-to-istanbul "^8.1.0" -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== +"@jest/source-map@^27.4.0": + version "27.4.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.4.0.tgz#2f0385d0d884fb3e2554e8f71f8fa957af9a74b6" + integrity sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ== dependencies: callsites "^3.0.0" graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== +"@jest/test-result@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.4.6.tgz#b3df94c3d899c040f602cea296979844f61bdf69" + integrity sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ== dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.4.6" + "@jest/types" "^27.4.2" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== +"@jest/test-sequencer@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz#447339b8a3d7b5436f50934df30854e442a9d904" + integrity sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw== dependencies: - "@jest/test-result" "^26.6.2" + "@jest/test-result" "^27.4.6" graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" + jest-haste-map "^27.4.6" + jest-runtime "^27.4.6" -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== +"@jest/transform@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.6.tgz#153621940b1ed500305eacdb31105d415dc30231" + integrity sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" + "@jest/types" "^27.4.2" + babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" + jest-haste-map "^27.4.6" + jest-regex-util "^27.4.0" + jest-util "^27.4.2" + micromatch "^4.0.4" + pirates "^4.0.4" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== +"@jest/types@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.4.2.tgz#96536ebd34da6392c2b7c7737d693885b5dd44a5" + integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^15.0.0" + "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@realware/utilities@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@realware/utilities/-/utilities-2.0.2.tgz#bb3192284218162825c2faf3772f5494aed5301b" + integrity sha512-d3OgIbSLiUBwfs4P0IQDLEqF58S4j8mZXZ3XwBAJSg+uKIzhGZ8X4Pa+ksfTJaVwnwRq2mlpLQdCGi2PYxzzQw== + +"@rollup/pluginutils@^4.1.0": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.2.tgz#ed5821c15e5e05e32816f5fb9ec607cdf5a75751" + integrity sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@sapphire/eslint-config@^4.0.11": + version "4.0.11" + resolved "https://registry.yarnpkg.com/@sapphire/eslint-config/-/eslint-config-4.0.11.tgz#a5738916fd705035920a2b73119d09065e012998" + integrity sha512-RlEVXwsaG+Srtw8C/ltt2gYiOAdL3EXqTXlxE3YkRHWWGdm9qIFoC9IMax18R2whnEwXMxd54fUBJAUTeJIuQA== + dependencies: + "@typescript-eslint/eslint-plugin" "^5.9.1" + "@typescript-eslint/parser" "^5.9.1" + eslint "~8.6.0" + eslint-config-prettier "^8.3.0" + eslint-plugin-prettier "^4.0.0" + prettier "^2.5.1" + typescript "^4.5.4" + +"@sapphire/ts-config@^3.1.8": + version "3.1.8" + resolved "https://registry.yarnpkg.com/@sapphire/ts-config/-/ts-config-3.1.8.tgz#83d57518db75a71f2a4b37dc499b97051b4ffd78" + integrity sha512-LAmX2/wlbG75FamaZbHsQL7XUMqgL4AYpYdBuboOScSsH3VpY4k3NrY5dgenzm02RF7XG5mTZ6Z0/dUtjCk51g== + dependencies: + tslib "^2.3.1" + typescript "^4.5.4" + +"@sapphire/utilities@^3.1.0", "@sapphire/utilities@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@sapphire/utilities/-/utilities-3.2.1.tgz#dbbffef1daf0fdc29481881aaac940a87341067e" + integrity sha512-y00aaBzKNwCIVE2a444zdPvHZmStpbVXE7iRC1NsbF1USXnQtNhgAGxq0PWZkBzHxpD9boKsUNS2Z+XzTXZvvQ== + "@sinonjs/commons@^1.7.0": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b" - integrity sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw== + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== dependencies: "@sinonjs/commons" "^1.7.0" -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.12" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" - integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@ts-type/package-dts@^1.0.56": + version "1.0.56" + resolved "https://registry.yarnpkg.com/@ts-type/package-dts/-/package-dts-1.0.56.tgz#b4870cdb54dbd3130c1ef3085765a431919bc45d" + integrity sha512-nBjbCaVV+R81jk7q/6sRuNYOhDAbBOmaCkPI2quK0Rnye2f4FUHX+4JL+3rDPiRPHxgX3pNfVKKHBlPAHiRddw== + dependencies: + "@types/semver" "^7.3.9" + ts-type "^2.1.2" + +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.1.18" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" + integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -491,38 +854,38 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" - integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" - integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.0.tgz#b9a1efa635201ba9bc850323a8793ee2d36c04a0" - integrity sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg== + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: "@babel/types" "^7.3.0" "@types/graceful-fs@^4.1.2": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.4.tgz#4ff9f641a7c6d1a3508ff88bc3141b152772e753" - integrity sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg== + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" @@ -532,59 +895,185 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" - integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/jest@^27.0.2": + version "27.4.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.0.tgz#037ab8b872067cae842a320841693080f9cb84ed" + integrity sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ== + dependencies: + jest-diff "^27.0.0" + pretty-format "^27.0.0" + +"@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/minimatch@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "14.14.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.21.tgz#d934aacc22424fe9622ebf6857370c052eae464e" - integrity sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A== + version "17.0.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.7.tgz#4a53d8332bb65a45470a2f9e2611f1ced637a5cb" + integrity sha512-1QUk+WAUD4t8iR+Oj+UgI8oJa6yyxaB8a8pHaC8uqM6RrS1qbL7bf3Pwl5rHv0psm2CuDErgho6v5N+G+5fwtQ== + +"@types/node@^17.0.10": + version "17.0.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.10.tgz#616f16e9d3a2a3d618136b1be244315d95bd7cab" + integrity sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog== "@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== -"@types/prettier@^2.0.0": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.6.tgz#f4b1efa784e8db479cdb8b14403e2144b1e9ff03" - integrity sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^2.1.5": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281" + integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA== + +"@types/semver@^7.3.9": + version "7.3.9" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" + integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== "@types/stack-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" - integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/yargs-parser@*": - version "20.2.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" - integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== -"@types/yargs@^15.0.0": - version "15.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.12.tgz#6234ce3e3e3fa32c5db301a170f96a599c960d74" - integrity sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw== +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== dependencies: "@types/yargs-parser" "*" -abab@^2.0.3: +"@typescript-eslint/eslint-plugin@^5.9.1": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz#e90afea96dff8620892ad216b0e4ccdf8ee32d3a" + integrity sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ== + dependencies: + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/type-utils" "5.10.0" + "@typescript-eslint/utils" "5.10.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.9.1": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.0.tgz#8f59e036f5f1cffc178cacbd5ccdd02aeb96c91c" + integrity sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw== + dependencies: + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/typescript-estree" "5.10.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz#bb5d872e8b9e36203908595507fbc4d3105329cb" + integrity sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg== + dependencies: + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" + +"@typescript-eslint/type-utils@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz#8524b9479c19c478347a7df216827e749e4a51e5" + integrity sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ== + dependencies: + "@typescript-eslint/utils" "5.10.0" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.0.tgz#beb3cb345076f5b088afe996d57bcd1dfddaa75c" + integrity sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ== + +"@typescript-eslint/typescript-estree@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz#4be24a3dea0f930bb1397c46187d0efdd955a224" + integrity sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA== + dependencies: + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.0.tgz#c3d152a85da77c400e37281355561c72fb1b5a65" + integrity sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/typescript-estree" "5.10.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz#770215497ad67cd15a572b52089991d5dfe06281" + integrity sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ== + dependencies: + "@typescript-eslint/types" "5.10.0" + eslint-visitor-keys "^3.0.0" + +"@yarn-tool/resolve-package@^1.0.36": + version "1.0.41" + resolved "https://registry.yarnpkg.com/@yarn-tool/resolve-package/-/resolve-package-1.0.41.tgz#a05cf0e414e340b73057e4c8e8270c070a026241" + integrity sha512-ybJqQztdSkTr9Z0BkPo5OlQBZoHlXHHXxssPJgFT8lFgyOxlhkjUg3WBFn7MSK6JMUoXU32wd2KKFBL/Fgsb8Q== + dependencies: + "@ts-type/package-dts" "^1.0.56" + pkg-dir "< 6 >= 5" + tslib "^2.3.1" + upath2 "^3.1.12" + +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -593,22 +1082,47 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: +acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -618,41 +1132,29 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-escape-sequences@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz#2483c8773f50dd9174dd9557e92b1718f1816097" - integrity sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw== - dependencies: - array-back "^3.0.1" +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.11.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + type-fest "^0.21.3" -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -666,34 +1168,28 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" + integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== anymatch@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" @@ -702,146 +1198,75 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-back@^1.0.2, array-back@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs= - dependencies: - typical "^2.6.0" - -array-back@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" - integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== - dependencies: - typical "^2.6.1" - -array-back@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" - integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== - -array-back@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.1.tgz#9b80312935a52062e1a233a9c7abeb5481b30e90" - integrity sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg== - -array-back@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-5.0.0.tgz#e196609edcec48376236d163958df76e659a0d36" - integrity sha512-kgVWwJReZWmVuWOQKEOohXKJX+nD02JAZ54D1RRWlv8L0NebauKAaFxACKzB74RTclt1+WNz5KHaLRDAPZbDEw== - -array-includes@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" - integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - get-intrinsic "^1.0.1" - is-string "^1.0.5" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== -array.prototype.flat@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" - integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== - dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" +babel-jest@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.6.tgz#4d024e69e241cdf4f396e453a07100f44f7ce314" + integrity sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg== + dependencies: + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.4.0" chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" -babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== +babel-plugin-jest-hoist@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz#d7831fc0f93573788d80dee7e682482da4c730d6" + integrity sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -866,43 +1291,18 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== +babel-preset-jest@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz#70d0e676a282ccb200fbabd7f415db5fdf393bca" + integrity sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg== dependencies: - babel-plugin-jest-hoist "^26.6.2" + babel-plugin-jest-hoist "^27.4.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== brace-expansion@^1.1.7: version "1.1.11" @@ -912,22 +1312,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -940,6 +1324,24 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browserslist@^4.17.5: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + 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" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -948,82 +1350,40 @@ bser@2.1.1: node-int64 "^0.4.0" buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -bulk-replace@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/bulk-replace/-/bulk-replace-0.0.1.tgz#f095682a896abd4b3d9e08de409cc222e213f9dd" - integrity sha1-8JVoKolqvUs9ngjeQJzCIuIT+d0= - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cache-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cache-point/-/cache-point-2.0.0.tgz#91e03c38da9cfba9d95ac6a34d24cfe6eff8920f" - integrity sha512-4gkeHlFpSKgm3vm2gJN5sPqfmijYRFYCQ6tv5cLw0xVmT6r1z1vd4FNnpuOREco3cBs1G709sZ72LdgddKvL5w== - dependencies: - array-back "^4.0.1" - fs-then-native "^2.0.0" - mkdirp2 "^1.0.4" - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -catharsis@^0.8.11: - version "0.8.11" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.11.tgz#d0eb3d2b82b7da7a3ce2efb1a7b00becc6643468" - integrity sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g== - dependencies: - lodash "^4.17.14" +caniuse-lite@^1.0.30001286: + version "1.0.30001295" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001295.tgz#68a60f8f0664f342b2835c5d8898b4faea7b3d51" + integrity sha512-lSP16vcyC0FEy0R4ECc9duSPoKoZy+YkpGkue9G4D81OfPnliopaZrU10+qtPdT8PbGXad/PNx43TIQrOmJZSQ== -chalk@^2.0.0, chalk@^2.1.0: +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1032,10 +1392,18 @@ chalk@^2.0.0, chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -1045,35 +1413,20 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@^3.1.0: version "3.1.0" @@ -1082,51 +1435,41 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" + wrap-ansi "^7.0.0" co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collect-all@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/collect-all/-/collect-all-1.0.4.tgz#50cd7119ac24b8e12a661f0f8c3aa0ea7222ddfc" - integrity sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA== - dependencies: - stream-connect "^1.0.2" - stream-via "^1.0.4" - collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1151,117 +1494,102 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +colorette@^2.0.16: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" -command-line-args@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a" - integrity sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg== - dependencies: - array-back "^3.0.1" - find-replace "^3.0.0" - lodash.camelcase "^4.3.0" - typical "^4.0.0" - -command-line-tool@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/command-line-tool/-/command-line-tool-0.8.0.tgz#b00290ef1dfc11cc731dd1f43a92cfa5f21e715b" - integrity sha512-Xw18HVx/QzQV3Sc5k1vy3kgtOeGmsKIqwtFFoyjI4bbcpSgnw2CWVULvtakyw4s6fhyAdI6soQQhXc2OzJy62g== - dependencies: - ansi-escape-sequences "^4.0.0" - array-back "^2.0.0" - command-line-args "^5.0.0" - command-line-usage "^4.1.0" - typical "^2.6.1" - -command-line-usage@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-4.1.0.tgz#a6b3b2e2703b4dcf8bd46ae19e118a9a52972882" - integrity sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g== - dependencies: - ansi-escape-sequences "^4.0.0" - array-back "^2.0.0" - table-layout "^0.4.2" - typical "^2.6.1" +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commander@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-1.1.1.tgz#50d1651868ae60eccff0a2d9f34595376bc6b041" - integrity sha1-UNFlGGiuYOzP8KLZ80WVN2vGsEE= - dependencies: - keypress "0.1.x" +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -common-sequence@^2.0.0: +compare-func@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/common-sequence/-/common-sequence-2.0.0.tgz#a4f01aaf5aebd0ac1ce43653e8c8fe6f0ef3a987" - integrity sha512-f0QqPLpRTgMQn/pQIynf+SdE73Lw5Q1jn4hjirHLgH/NJ71TiHjXusV16BmOyuK5rRQ1W2f++II+TFZbQOh4hA== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -config-master@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/config-master/-/config-master-3.1.0.tgz#667663590505a283bf26a484d68489d74c5485da" - integrity sha1-ZnZjWQUFooO/JqSE1oSJ10xUhdo= +conventional-changelog-angular@^5.0.11: + version "5.0.13" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" + integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== dependencies: - walk-back "^2.0.1" + compare-func "^2.0.0" + q "^1.5.1" -confusing-browser-globals@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" - integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +conventional-changelog-conventionalcommits@^4.3.1: + version "4.6.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" + integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== + dependencies: + compare-func "^2.0.0" + lodash "^4.17.15" + q "^1.5.1" -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= +conventional-commits-parser@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" + integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig-typescript-loader@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.4.tgz#2903d53aec07c8079c5ff4aa1b10bd5d2fbdff81" + integrity sha512-ulv2dvwurP/MZAIthXm69bO7EzzIUThZ6RJ1qXhdlXM6to3F+IKBL/17EnhYSG52A5N1KcAUu66vSG/3/77KrA== + dependencies: + cosmiconfig "^7" + ts-node "^10.4.0" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== +cosmiconfig@^7, cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + "@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" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-spawn@^7.0.0: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1280,19 +1608,17 @@ cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.2.0: +cssstyle@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== data-urls@^2.0.0: version "2.0.0" @@ -1303,136 +1629,77 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" +dateformat@^4.2.1: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== -debug@^3.2.6: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: - ms "^2.1.1" + ms "2.1.2" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= dependencies: - ms "2.1.2" + decamelize "^1.1.0" + map-obj "^1.0.0" -decamelize@^1.2.0: +decamelize@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decimal.js@^10.2.0: - version "10.2.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== -deep-extend@^0.6.0, deep-extend@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== - -dmd@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/dmd/-/dmd-5.0.2.tgz#a911c8dbab10ec64fbc134eeb69b933618ebeb07" - integrity sha512-npXsE2+/onRPk/LCrUmx7PcUSqcSVnbrDDMi2nBSawNZ8QXlHE/8xaEZ6pNqPD1lQZv8LGr1xEIpyxP336xyfw== - dependencies: - array-back "^4.0.1" - cache-point "^2.0.0" - common-sequence "^2.0.0" - file-set "^4.0.1" - handlebars "^4.7.6" - marked "^1.1.0" - object-get "^2.1.1" - reduce-flatten "^3.0.0" - reduce-unique "^2.0.1" - reduce-without "^1.0.1" - test-value "^3.0.0" - walk-back "^4.0.0" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +diff-sequences@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5" + integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - esutils "^2.0.2" - isarray "^1.0.0" + path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" @@ -1448,29 +1715,38 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" + is-obj "^2.0.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== +electron-to-chromium@^1.4.17: + version "1.4.32" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.32.tgz#7ad1e76692b307da454b7380cc882784962648b8" + integrity sha512-7QRVfMlccTFs7cZV3lB0k9Wcm6R6F+w1yBPX+xBAlAP/1oJIstxTev3A4r8REnUUAFph/cIB8y/EBU7PDbJTQw== -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -1478,44 +1754,24 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -entities@~2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" - integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.1: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^1.0.5: version "1.0.5" @@ -1527,98 +1783,36 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.14.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" - estraverse "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -eslint-config-airbnb-base@^14.2.0: - version "14.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" - integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.2" - -eslint-config-standard@^14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" - integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== - dependencies: - debug "^2.6.9" - resolve "^1.13.1" - -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-es@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" - integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.22.0: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-node@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" - integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== - dependencies: - eslint-plugin-es "^3.0.0" - eslint-utils "^2.0.0" - ignore "^5.1.1" - minimatch "^3.0.4" - resolve "^1.10.1" - semver "^6.1.0" + prettier-linter-helpers "^1.0.0" -eslint-plugin-promise@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" - integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== - -eslint-plugin-standard@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== - -eslint-scope@^5.0.0: +eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -1626,86 +1820,93 @@ eslint-scope@^5.0.0: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== +eslint-scope@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153" + integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: - eslint-visitor-keys "^1.1.0" + eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz#eee4acea891814cda67a7d8812d9647dd0179af2" + integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA== -eslint@6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint@~8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.6.0.tgz#4318c6a31c5584838c1a2e940c478190f58d558e" + integrity sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw== dependencies: - "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^1.0.5" + "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.0" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.1.0" + espree "^9.3.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^6.0.1" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" + levn "^0.4.1" + lodash.merge "^4.6.2" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.3" + optionator "^0.9.1" progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" + regexpp "^3.2.0" + semver "^7.2.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== +espree@^9.2.0, espree@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8" + integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ== dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.1.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" @@ -1716,39 +1917,26 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - 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" - execa@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -1764,104 +1952,74 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== - dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== +expect@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.4.6.tgz#f335e128b0335b6ceb4fcab67ece7cbd14c942e6" + integrity sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag== dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + "@jest/types" "^27.4.2" + jest-get-type "^27.4.0" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-json-stable-stringify@^2.0.0: +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -1869,37 +2027,12 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-set@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/file-set/-/file-set-4.0.1.tgz#d8a4485a89c8db7ca414f05a043bce44a2d6a913" - integrity sha512-tRzX4kGPmxS2HDK2q2L4qcPopTl/gcyahve2/O8l8hHNJgJ7m+r/ZncCJ1MmFWEMp1yHxJGIU9gAcsWu5jPMpg== - dependencies: - array-back "^4.0.1" - glob "^7.1.6" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" @@ -1908,19 +2041,14 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-replace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" - integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== - dependencies: - array-back "^3.0.1" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: - locate-path "^2.0.0" + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" @@ -1930,67 +2058,63 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + locate-path "^6.0.0" + path-exists "^4.0.0" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +flatted@^3.1.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= +fs-extra@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: - map-cache "^0.2.2" + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== dependencies: - minipass "^2.6.0" - -fs-then-native@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fs-then-native/-/fs-then-native-2.0.0.tgz#19a124d94d90c22c8e045f2e8dd6ebea36d48c67" - integrity sha1-GaEk2U2QwiyOBF8ujdbr6jbUjGc= + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.1.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" - integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -2002,51 +2126,21 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gensync@^1.0.0-beta.1: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" - integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - get-stream@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -2054,29 +2148,40 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= +git-raw-commits@^2.0.0: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== dependencies: - assert-plus "^1.0.0" + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" -glob-parent@^5.0.0: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2085,52 +2190,46 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== dependencies: - type-fest "^0.8.1" - -graceful-fs@^4.1.2, graceful-fs@^4.1.9, graceful-fs@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + type-fest "^0.20.2" -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -handlebars@^4.7.6: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== +globby@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== has-flag@^3.0.0: version "3.0.0" @@ -2142,47 +2241,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -2190,18 +2248,18 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hepburn@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/hepburn/-/hepburn-1.2.0.tgz#81d01bf3dc7ea83370fac5bbcbfa0f9f1a0f819f" - integrity sha512-xWjHb03dN/ivNcqG2vqA//sHQ0oapYGZ9QV/2TR7m2+cggxzoVpbDxZn9s/Zm1tF88/7a1IpdZyn00tNP5oABA== - dependencies: - bulk-replace "0.0.1" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + dependencies: + lru-cache "^6.0.0" + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -2214,45 +2272,56 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + agent-base "6" + debug "4" human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +husky@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== + +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.1.4, ignore@^5.1.8: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -import-fresh@^3.0.0: +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -2261,9 +2330,9 @@ import-fresh@^3.0.0: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" + integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -2273,6 +2342,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2281,286 +2355,118 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.3: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@~1.3.0: +ini@^1.3.4: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== +is-core-module@^2.2.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== +is-core-module@^2.5.0, is-core-module@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== dependencies: - is-plain-object "^2.0.4" + has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" - integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= - -is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-stream@^1.1.0: +is-plain-obj@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= dependencies: - has-symbols "^1.0.1" + text-extensions "^1.0.0" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== dependencies: - "@babel/core" "^7.7.5" + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" + istanbul-lib-coverage "^3.2.0" semver "^6.3.0" istanbul-lib-report@^3.0.0: @@ -2573,216 +2479,252 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== +istanbul-reports@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" + integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== +jest-changed-files@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.4.2.tgz#da2547ea47c6e6a5f6ed336151bd2075736eb4a5" + integrity sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A== dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" + "@jest/types" "^27.4.2" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.4.6.tgz#d3af34c0eb742a967b1919fbb351430727bcea6c" + integrity sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.4.6" + is-generator-fn "^2.0.0" + jest-each "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + jest-runtime "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + pretty-format "^27.4.6" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" -jest-cli@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== +jest-cli@^27.4.7: + version "27.4.7" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.4.7.tgz#d00e759e55d77b3bcfea0715f527c394ca314e5a" + integrity sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw== dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/core" "^27.4.7" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-config "^27.4.7" + jest-util "^27.4.2" + jest-validate "^27.4.6" prompts "^2.0.1" - yargs "^15.4.1" + yargs "^16.2.0" -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== +jest-config@^27.4.7: + version "27.4.7" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.4.7.tgz#4f084b2acbd172c8b43aa4cdffe75d89378d3972" + integrity sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw== dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.4.6" + "@jest/types" "^27.4.2" + babel-jest "^27.4.6" chalk "^4.0.0" + ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.1" graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" - -jest-diff@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + jest-circus "^27.4.6" + jest-environment-jsdom "^27.4.6" + jest-environment-node "^27.4.6" + jest-get-type "^27.4.0" + jest-jasmine2 "^27.4.6" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.6" + jest-runner "^27.4.6" + jest-util "^27.4.2" + jest-validate "^27.4.6" + micromatch "^4.0.4" + pretty-format "^27.4.6" + slash "^3.0.0" + +jest-diff@^27.0.0: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.2.tgz#786b2a5211d854f848e2dcc1e324448e9481f36f" + integrity sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q== dependencies: chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + diff-sequences "^27.4.0" + jest-get-type "^27.4.0" + pretty-format "^27.4.2" -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== +jest-diff@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d" + integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.4.0" + jest-get-type "^27.4.0" + pretty-format "^27.4.6" + +jest-docblock@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.4.0.tgz#06c78035ca93cbbb84faf8fce64deae79a59f69f" + integrity sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg== dependencies: detect-newline "^3.0.0" -jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== +jest-each@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.4.6.tgz#e7e8561be61d8cc6dbf04296688747ab186c40ff" + integrity sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" - -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + jest-get-type "^27.4.0" + jest-util "^27.4.2" + pretty-format "^27.4.6" + +jest-environment-jsdom@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz#c23a394eb445b33621dfae9c09e4c8021dea7b36" + integrity sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" - -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + jest-mock "^27.4.6" + jest-util "^27.4.2" + jsdom "^16.6.0" + +jest-environment-node@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.4.6.tgz#ee8cd4ef458a0ef09d087c8cd52ca5856df90242" + integrity sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-mock "^27.4.6" + jest-util "^27.4.2" -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" + integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== +jest-haste-map@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.6.tgz#c60b5233a34ca0520f325b7e2cc0a0140ad0862a" + integrity sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" "@types/graceful-fs" "^4.1.2" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" + jest-regex-util "^27.4.0" + jest-serializer "^27.4.0" + jest-util "^27.4.2" + jest-worker "^27.4.6" + micromatch "^4.0.4" walker "^1.0.7" optionalDependencies: - fsevents "^2.1.2" - -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + fsevents "^2.3.2" + +jest-jasmine2@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz#109e8bc036cb455950ae28a018f983f2abe50127" + integrity sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/source-map" "^27.4.0" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^26.6.2" + expect "^27.4.6" is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" - -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== - dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + jest-each "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + jest-runtime "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + pretty-format "^27.4.6" + throat "^6.0.1" + +jest-leak-detector@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz#ed9bc3ce514b4c582637088d9faf58a33bd59bf4" + integrity sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA== + dependencies: + jest-get-type "^27.4.0" + pretty-format "^27.4.6" + +jest-matcher-utils@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz#53ca7f7b58170638590e946f5363b988775509b8" + integrity sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA== dependencies: chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + jest-diff "^27.4.6" + jest-get-type "^27.4.0" + pretty-format "^27.4.6" -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== +jest-message-util@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.6.tgz#9fdde41a33820ded3127465e1a5896061524da31" + integrity sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA== dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.4.2" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" + micromatch "^4.0.4" + pretty-format "^27.4.6" slash "^3.0.0" - stack-utils "^2.0.2" + stack-utils "^2.0.3" -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== +jest-mock@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.4.6.tgz#77d1ba87fbd33ccb8ef1f061697e7341b7635195" + integrity sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -2790,177 +2732,182 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +jest-regex-util@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.4.0.tgz#e4c45b52653128843d07ad94aec34393ea14fbca" + integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg== -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== +jest-resolve-dependencies@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz#fc50ee56a67d2c2183063f6a500cc4042b5e2327" + integrity sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw== dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" + "@jest/types" "^27.4.2" + jest-regex-util "^27.4.0" + jest-snapshot "^27.4.6" -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== +jest-resolve@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.4.6.tgz#2ec3110655e86d5bfcfa992e404e22f96b0b5977" + integrity sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" chalk "^4.0.0" graceful-fs "^4.2.4" + jest-haste-map "^27.4.6" jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" + jest-util "^27.4.2" + jest-validate "^27.4.6" + resolve "^1.20.0" + resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== +jest-runner@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.4.6.tgz#1d390d276ec417e9b4d0d081783584cbc3e24773" + integrity sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg== dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.4.6" + "@jest/environment" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" - emittery "^0.7.1" + emittery "^0.8.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" + jest-docblock "^27.4.0" + jest-environment-jsdom "^27.4.6" + jest-environment-node "^27.4.6" + jest-haste-map "^27.4.6" + jest-leak-detector "^27.4.6" + jest-message-util "^27.4.6" + jest-resolve "^27.4.6" + jest-runtime "^27.4.6" + jest-util "^27.4.2" + jest-worker "^27.4.6" source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" + throat "^6.0.1" + +jest-runtime@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.4.6.tgz#83ae923818e3ea04463b22f3597f017bb5a1cffa" + integrity sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" + "@jest/globals" "^27.4.6" + "@jest/source-map" "^27.4.0" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" chalk "^4.0.0" - cjs-module-lexer "^0.6.0" + cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - exit "^0.1.2" + execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-haste-map "^27.4.6" + jest-message-util "^27.4.6" + jest-mock "^27.4.6" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.4.1" -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== +jest-serializer@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.4.0.tgz#34866586e1cae2388b7d12ffa2c7819edef5958a" + integrity sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ== dependencies: "@types/node" "*" graceful-fs "^4.2.4" -jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== +jest-snapshot@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.4.6.tgz#e2a3b4fff8bdce3033f2373b2e525d8b6871f616" + integrity sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ== dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^26.6.2" + expect "^27.4.6" graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" + jest-diff "^27.4.6" + jest-get-type "^27.4.0" + jest-haste-map "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + jest-util "^27.4.2" natural-compare "^1.4.0" - pretty-format "^26.6.2" + pretty-format "^27.4.6" semver "^7.3.2" -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== +jest-util@^27.0.0, jest-util@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.4.2.tgz#ed95b05b1adfd761e2cda47e0144c6a58e05a621" + integrity sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" + ci-info "^3.2.0" graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" + picomatch "^2.2.3" -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== +jest-validate@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.4.6.tgz#efc000acc4697b6cf4fa68c7f3f324c92d0c4f1f" + integrity sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ== dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" + "@jest/types" "^27.4.2" + camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^26.3.0" + jest-get-type "^27.4.0" leven "^3.1.0" - pretty-format "^26.6.2" + pretty-format "^27.4.6" -jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== +jest-watcher@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.4.6.tgz#673679ebeffdd3f94338c24f399b85efc932272d" + integrity sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw== dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.6.2" + jest-util "^27.4.2" string-length "^4.0.1" -jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== +jest-worker@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" + integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== dependencies: "@types/node" "*" merge-stream "^2.0.0" - supports-color "^7.0.0" + supports-color "^8.0.0" -jest@^26.2.2: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" - integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== +jest@^27.4.7: + version "27.4.7" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.4.7.tgz#87f74b9026a1592f2da05b4d258e57505f28eca4" + integrity sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg== dependencies: - "@jest/core" "^26.6.3" + "@jest/core" "^27.4.7" import-local "^3.0.2" - jest-cli "^26.6.3" + jest-cli "^27.4.7" js-tokens@^4.0.0: version "4.0.0" @@ -2975,108 +2922,44 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js2xmlparser@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.1.tgz#670ef71bc5661f089cc90481b99a05a1227ae3bd" - integrity sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw== - dependencies: - xmlcreate "^2.0.3" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdoc-api@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/jsdoc-api/-/jsdoc-api-6.0.0.tgz#fbba403ef59de0480b7e5aadd563a7bb715b0187" - integrity sha512-zvfB63nAc9e+Rv2kKmJfE6tmo4x8KFho5vKr6VfYTlCCgqtrfPv0McCdqT4betUT9rWtw0zGkNUVkVqeQipY6Q== - dependencies: - array-back "^4.0.1" - cache-point "^2.0.0" - collect-all "^1.0.3" - file-set "^4.0.1" - fs-then-native "^2.0.0" - jsdoc "^3.6.4" - object-to-spawn-args "^2.0.0" - temp-path "^1.0.0" - walk-back "^4.0.0" - -jsdoc-parse@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/jsdoc-parse/-/jsdoc-parse-5.0.0.tgz#01fb96e04955df05bca1ad722d76e969a30108f7" - integrity sha512-Khw8c3glrTeA3/PfUJUBvhrMhWpSClORBUvL4pvq2wFcqvUVmA96wxnMkCno2GfZY4pnd8BStK5WGKGyn4Vckg== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - array-back "^4.0.1" - lodash.omit "^4.5.0" - lodash.pick "^4.4.0" - reduce-extract "^1.0.0" - sort-array "^4.1.1" - test-value "^3.0.0" - -jsdoc-to-markdown@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jsdoc-to-markdown/-/jsdoc-to-markdown-6.0.1.tgz#55640eea7a4f56fa9353316648bf0775531811ff" - integrity sha512-hUI2PAR5n/KlmQU3mAWO9i3D7jVbhyvUHfQ6oYVBt+wnnsyxpsAuhCODY1ryLOb2U9OPJd4GIK9mL2hqy7fHDg== - dependencies: - array-back "^4.0.1" - command-line-tool "^0.8.0" - config-master "^3.1.0" - dmd "^5.0.1" - jsdoc-api "^6.0.0" - jsdoc-parse "^5.0.0" - walk-back "^4.0.0" - -jsdoc@^3.6.4: - version "3.6.6" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.6.tgz#9fe162bbdb13ee7988bf74352b5147565bcfd8e1" - integrity sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ== - dependencies: - "@babel/parser" "^7.9.4" - bluebird "^3.7.2" - catharsis "^0.8.11" - escape-string-regexp "^2.0.0" - js2xmlparser "^4.0.1" - klaw "^3.0.0" - markdown-it "^10.0.0" - markdown-it-anchor "^5.2.7" - marked "^0.8.2" - mkdirp "^1.0.4" - requizzle "^0.2.3" - strip-json-comments "^3.1.0" - taffydb "2.6.2" - underscore "~1.10.2" + argparse "^2.0.1" -jsdom@^16.4.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" - integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: - abab "^2.0.3" - acorn "^7.1.1" + abab "^2.0.5" + acorn "^8.2.4" acorn-globals "^6.0.0" cssom "^0.4.4" - cssstyle "^2.2.0" + cssstyle "^2.3.0" data-urls "^2.0.0" - decimal.js "^10.2.0" + decimal.js "^10.2.1" domexception "^2.0.1" - escodegen "^1.14.1" + escodegen "^2.0.0" + form-data "^3.0.0" html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" - parse5 "5.1.1" - request "^2.88.2" - request-promise-native "^1.0.8" - saxes "^5.0.0" + parse5 "6.0.1" + saxes "^5.0.1" symbol-tree "^3.2.4" - tough-cookie "^3.0.1" + tough-cookie "^4.0.0" w3c-hr-time "^1.0.2" w3c-xmlserializer "^2.0.0" webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - ws "^7.2.3" + whatwg-url "^8.5.0" + ws "^7.4.6" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -3094,81 +2977,49 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== +json5@2.x, json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -keypress@0.1.x: - version "0.1.0" - resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.1.0.tgz#4a3188d4291b66b4f65edb99f806aa9ae293592a" - integrity sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo= - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" +jsonc-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== -kind-of@^4.0.0: +jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - is-buffer "^1.1.5" + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" - integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== - dependencies: - graceful-fs "^4.1.9" - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -3179,7 +3030,15 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.3.0, levn@~0.3.0: +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -3187,44 +3046,48 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -limax@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/limax/-/limax-2.1.0.tgz#97ecbac8bcd9567ebf22eb9900d331ac9223750f" - integrity sha512-OQdMI5PlkGb/UYQz/AiF7C8ybx7JV2LV3FubzIHRB/amFuzuM+//wxGyUrdG6eutIfDTsD7C9hLDFMuB8+HG5Q== - dependencies: - hepburn "^1.1.3" - pinyin "^2.9.1" - speakingurl "^14.0.1" +lilconfig@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" + integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -linkify-it@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" - integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== - dependencies: - uc.micro "^1.0.1" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^12.3.1: + version "12.3.1" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-12.3.1.tgz#d475b0c0d0a12d91dde58a429ac6268dea485f06" + integrity sha512-Ocht/eT+4/siWOZDJpNUKcKX2UeWW/pDbohJ4gRsrafAjBi79JK8kiNVk2ciIVNKdw0Q4ABptl2nr6uQAlRImw== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.16" + commander "^8.3.0" + debug "^4.3.3" + execa "^5.1.1" + lilconfig "2.0.4" + listr2 "^4.0.1" + micromatch "^4.0.4" + normalize-path "^3.0.0" + object-inspect "^1.12.0" + string-argv "^0.3.1" + supports-color "^9.2.1" + yaml "^1.10.2" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" +listr2@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.1.tgz#e050c1fd390276e191f582603d6e3531cd6fd2b3" + integrity sha512-D65Nl+zyYHL2jQBGmxtH/pU8koPZo5C8iCNE8EoB04RwPgQG1wuaKwVbeZv9LJpiH4Nxs0FCp+nNcG8OqpniiA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.2" + through "^2.3.8" + wrap-ansi "^7.0.0" locate-path@^5.0.0: version "5.0.0" @@ -3233,36 +3096,38 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.omit@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= - -lodash.padend@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - integrity sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4= - -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20: +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -3270,112 +3135,109 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -make-dir@^3.0.0: +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - object-visit "^1.0.0" - -markdown-it-anchor@^5.2.7: - version "5.3.0" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744" - integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA== + tmpl "1.0.5" -markdown-it@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" - integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== - dependencies: - argparse "^1.0.7" - entities "~2.0.0" - linkify-it "^2.0.0" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -marked@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355" - integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw== - -marked@^1.1.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.7.tgz#6e14b595581d2319cdcf033a24caaf41455a01fb" - integrity sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA== - -mdurl@^1.0.1: +map-obj@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +marked@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.10.tgz#423e295385cc0c3a70fa495e0df68b007b879423" + integrity sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw== + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" - picomatch "^2.0.5" + picomatch "^2.2.3" -mime-db@1.45.0: - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.28" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" - integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== +mime-types@^2.1.12: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.45.0" + mime-db "1.51.0" mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -3383,172 +3245,57 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp2@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp2/-/mkdirp2-1.0.4.tgz#56de1f8f5c93cf2199906362eba0f9f262ee4437" - integrity sha512-Q2PKB4ZR4UPtjLl76JfzlgSCUZhSV1AXQgAZa1qt5RiaALFjP/CDrGvFBrOz7Ck6McPcwMAxTsJvWOUjOU8XMw== - -mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +mri@^1.1.5: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +multimatch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" + integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" - integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-addon-api@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" - integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1" - integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - -node-pre-gyp@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - 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.4.2" - -nodejieba@^2.2.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/nodejieba/-/nodejieba-2.5.1.tgz#626cc93a104b96de6ce85f59b640fb316d4b763c" - integrity sha512-VnJBQSl2G8swDf3ZAXMbXrMCrGFO+kVKbkB93OaBthGbEG5BrxfD8I2m7auaRX8E5C1t+hlwo3HCmQOWKkiZ9A== - dependencies: - node-addon-api "^3.0.2" - node-pre-gyp "^0.14.0" - -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -3558,155 +3305,37 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: - remove-trailing-separator "^1.0.1" + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-get@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-get/-/object-get-2.1.1.tgz#1dad63baf6d94df184d1c58756cc9be55b174dac" - integrity sha512-7n4IpLMzGGcLEMiQKsNR7vCe+N5E9LORFrtNUVy4sO3dj9a3HedZCxEL2T7QuLhcHN1NBuBsMOKaOsAYI9IIvg== - -object-inspect@^1.8.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-to-spawn-args@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/object-to-spawn-args/-/object-to-spawn-args-2.0.0.tgz#00484be684e9213fb5a67f988b18a9d11ad5fcbd" - integrity sha512-ZMT4owlXg3JGegecLlAgAA/6BsdKHn63R3ayXcAa3zFkF7oUBHcSb0oxszeutYe0FO2c1lT5pwCuidLkC4Gx3g== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.1, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.entries@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" - integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" +object-inspect@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -3715,14 +3344,14 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1, optionator@^0.8.3: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -3734,40 +3363,17 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" p-limit@^2.2.0: version "2.3.0" @@ -3776,12 +3382,12 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-limit "^1.1.0" + yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" @@ -3790,10 +3396,19 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" p-try@^2.0.0: version "2.2.0" @@ -3807,37 +3422,20 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" - integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== path-exists@^4.0.0: version "4.0.0" @@ -3849,98 +3447,116 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-is-network-drive@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/path-is-network-drive/-/path-is-network-drive-1.0.13.tgz#c9aa0183eb72c328aa83f43def93ddcb9d7ec4d4" + integrity sha512-Hg74mRN6mmXV+gTm3INjFK40ncAmC/Lo4qoQaSZ+GT3hZzlKdWQSqAjqyPeW0SvObP2W073WyYEBWY9d3wOm3A== + dependencies: + tslib "^2.3.1" path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= +path-strip-sep@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/path-strip-sep/-/path-strip-sep-1.0.10.tgz#2be4e789406b298af8709ff79af716134b733b98" + integrity sha512-JpCy+8LAJQQTO1bQsb/84s1g+/Stm3h39aOpPRBQ/paMUGVPPZChLTOTKHoaCkc/6sKuF7yVsnq5Pe1S6xQGcA== dependencies: - pify "^2.0.0" + tslib "^2.3.1" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picomatch@^2.0.4, picomatch@^2.0.5: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -pinyin@^2.9.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/pinyin/-/pinyin-2.9.1.tgz#4570d3e03f1430f69c08d4166b087392c9227718" - integrity sha512-U7kHlVP6yUYl2DV2bX4brlYWdgaAlwtqJrdkboiyri9ixRDVqVO3LD98te3PT5deN5EA9W8ywuG9GaYZfiiIlw== - dependencies: - commander "~1.1.1" - object-assign "^4.0.1" - optionalDependencies: - nodejieba "^2.2.1" +picomatch@^2.0.4, picomatch@^2.2.2, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= +"pkg-dir@< 6 >= 5": + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== dependencies: - find-up "^2.1.0" + find-up "^5.0.0" -pkg-dir@^4.2.0: +pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" + fast-diff "^1.1.2" + +prettier@^2.4.1, prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +pretty-format@^27.0.0, pretty-format@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.2.tgz#e4ce92ad66c3888423d332b40477c87d1dac1fb8" + integrity sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw== + dependencies: + "@jest/types" "^27.4.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" react-is "^17.0.1" -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +pretty-format@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7" + integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-quick@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" + integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA== + dependencies: + chalk "^3.0.0" + execa "^4.0.0" + find-up "^4.1.0" + ignore "^5.1.4" + mri "^1.1.5" + multimatch "^4.0.0" progress@^2.0.0: version "2.0.3" @@ -3948,14 +3564,14 @@ progress@^2.0.0: integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prompts@^2.0.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" -psl@^1.1.28: +psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -3973,40 +3589,25 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== react-is@^17.0.1: - version "17.0.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" - integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== read-pkg-up@^7.0.1: version "7.0.1" @@ -4017,15 +3618,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -4036,140 +3628,33 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -reduce-extract@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/reduce-extract/-/reduce-extract-1.0.0.tgz#67f2385beda65061b5f5f4312662e8b080ca1525" - integrity sha1-Z/I4W+2mUGG19fQxJmLosIDKFSU= +readable-stream@3, readable-stream@^3.0.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: - test-value "^1.0.1" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" -reduce-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-1.0.1.tgz#258c78efd153ddf93cb561237f61184f3696e327" - integrity sha1-JYx479FT3fk8tWEjf2EYTzaW4yc= - -reduce-flatten@^3.0.0: +redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-3.0.0.tgz#da477d68453fd9510f9a5fbef86e0fa04b4fd315" - integrity sha512-eczl8wAYBxJ6Egl6I1ECIF+8z6sHu+KE7BzaEDZTpPXKXfy9SUDQlVYwkRcNTjJLC3Iakxbhss50KuT/R6SYfg== - -reduce-unique@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/reduce-unique/-/reduce-unique-2.0.1.tgz#fb34b90e89297c1e08d75dcf17e9a6443ea71081" - integrity sha512-x4jH/8L1eyZGR785WY+ePtyMNhycl1N2XOLxhCbzZFaqF4AXjLzqSxa2UHgJ2ZVR/HHyPOvl1L7xRnW8ye5MdA== - -reduce-without@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/reduce-without/-/reduce-without-1.0.1.tgz#68ad0ead11855c9a37d4e8256c15bbf87972fc8c" - integrity sha1-aK0OrRGFXJo31OglbBW7+Hly/Iw= - dependencies: - test-value "^2.0.0" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: - lodash "^4.17.19" + indent-string "^4.0.0" + strip-indent "^3.0.0" -request-promise-native@^1.0.8: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requizzle@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" - integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== - dependencies: - lodash "^4.17.14" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -4177,29 +3662,45 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== +resolve@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.1.0" + is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^1.10.0, resolve@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" + integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== + dependencies: + is-core-module "^2.8.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -4208,143 +3709,126 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.1: +rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== +rollup-plugin-cleaner@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-cleaner/-/rollup-plugin-cleaner-1.0.0.tgz#9f2d7226327fca9109b68c18fea77b427e33c193" + integrity sha512-q+Zf9estkFwGede9QzmbkhKeuXzlliOvcICVNzBHAs5xYPPs1XLtfin5TMU2tC2EYjmfaF97saY9MnQM6Og4eA== + dependencies: + rimraf "^2.6.3" -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +rollup-plugin-dts@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-4.1.0.tgz#63b1e7de3970bb6d50877e60df2150a3892bc49c" + integrity sha512-rriXIm3jdUiYeiAAd1Fv+x2AxK6Kq6IybB2Z/IdoAW95fb4uRUurYsEYKa8L1seedezDeJhy8cfo8FEL9aZzqg== + dependencies: + magic-string "^0.25.7" + optionalDependencies: + "@babel/code-frame" "^7.16.0" -rxjs@^6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== +rollup-plugin-typescript2@^0.31.1: + version "0.31.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.1.tgz#3b3a0e29b29b2ed8244b1a78fd8e2cac93ab79a4" + integrity sha512-sklqXuQwQX+stKi4kDfEkneVESPi3YM/2S899vfRdF9Yi40vcC50Oq4A4cSZJNXsAQE/UsBZl5fAOsBLziKmjw== dependencies: - tslib "^1.9.0" + "@rollup/pluginutils" "^4.1.0" + "@yarn-tool/resolve-package" "^1.0.36" + find-cache-dir "^3.3.1" + fs-extra "8.1.0" + resolve "1.20.0" + tslib "2.2.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +rollup-plugin-version-injector@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-version-injector/-/rollup-plugin-version-injector-1.3.3.tgz#df1f8d371bc127592c29aeda6914745db4013a48" + integrity sha512-+Rrf0xIFHkwFGuMfphVlAOtd9FlhHFh3vrDwamJ6+YR3IxebRHGVT879qwWzZ1CpWMCLlngb2MmHW5wC5EJqvg== + dependencies: + chalk "^4.1.0" + dateformat "^4.2.1" + lodash "^4.17.20" + +rollup@^2.63.0, rollup@^2.66.0: + version "2.66.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.66.0.tgz#ee529ea15a20485d579039637fec3050bad03bbb" + integrity sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.2: + version "7.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.2.tgz#11e4a3a1dfad85dbf7fb6e33cbba17668497490b" + integrity sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w== + dependencies: + tslib "^2.1.0" -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^5.0.0: +saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: +"semver@2 || 3 || 4 || 5": version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== +semver@7.3.5, semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== shebang-command@^2.0.0: version "2.0.0" @@ -4353,25 +3837,24 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shiki@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.0.tgz#85f21ecfa95b377ff64db6c71442c22c220e9540" + integrity sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA== + dependencies: + jsonc-parser "^3.0.0" + vscode-oniguruma "^1.6.1" + vscode-textmate "5.2.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== sisteransi@^1.0.5: version "1.0.5" @@ -4383,78 +3866,41 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sort-array@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/sort-array/-/sort-array-4.1.3.tgz#ede740ab6c82c900524b157feff79bcfd610b36d" - integrity sha512-6auiM0DNob/zF+7Ae/SM4BFL5D7DPK/HVcllhVu5V+FgoCPs0A6b6ZwJDuvJpXQgFpxqLZUOD2kdxqO4Z59dkg== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - array-back "^5.0.0" - typical "^6.0.1" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -4469,6 +3915,11 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -4491,198 +3942,103 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== -speakingurl@^14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53" - integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: - extend-shallow "^3.0.0" + readable-stream "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stack-utils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: escape-string-regexp "^2.0.0" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -stream-connect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stream-connect/-/stream-connect-1.0.2.tgz#18bc81f2edb35b8b5d9a8009200a985314428a97" - integrity sha1-GLyB8u2zW4tdmoAJIAqYUxRCipc= - dependencies: - array-back "^1.0.2" - -stream-via@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stream-via/-/stream-via-1.0.4.tgz#8dccbb0ac909328eb8bc8e2a4bd3934afdaf606c" - integrity sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ== +string-argv@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== string-length@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" - integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.trimend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" + strip-ansi "^6.0.1" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= +string-width@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.0.tgz#5ab00980cfb29f43e736b113a120a73a0fb569d3" + integrity sha512-7x54QnN21P+XL/v8SuNKvfgsUre6PXpN7mc77N3HlZv+f1SBRGmjxtOud2Z6FZ8DmdkD/IdjCaf9XXbnqmTZGQ== dependencies: - ansi-regex "^2.0.0" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - ansi-regex "^3.0.0" + safe-buffer "~5.2.0" -strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^4.1.0" + ansi-regex "^5.0.1" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: - ansi-regex "^5.0.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + ansi-regex "^6.0.1" strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@^3.0.1, strip-json-comments@^3.1.0: +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -4697,63 +4053,36 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.2.1.tgz#599dc9d45acf74c6176e0d880bab1d7d718fe891" + integrity sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ== + supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table-layout@^0.4.2: - version "0.4.5" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-0.4.5.tgz#d906de6a25fa09c0c90d1d08ecd833ecedcb7378" - integrity sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw== - dependencies: - array-back "^2.0.0" - deep-extend "~0.6.0" - lodash.padend "^4.6.1" - typical "^2.6.1" - wordwrapjs "^3.0.0" - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -taffydb@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" - integrity sha1-fLy2S1oUG2ou/CxdLGe04VCyomg= - -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -temp-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-path/-/temp-path-1.0.0.tgz#24b1543973ab442896d9ad367dd9cbdbfafe918b" - integrity sha1-JLFUOXOrRCiW2a02fdnL2/r+kYs= - terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -4771,77 +4100,43 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -test-value@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-1.1.0.tgz#a09136f72ec043d27c893707c2b159bfad7de93f" - integrity sha1-oJE29y7AQ9J8iTcHwrFZv6196T8= - dependencies: - array-back "^1.0.2" - typical "^2.4.2" - -test-value@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= - dependencies: - array-back "^1.0.3" - typical "^2.6.0" - -test-value@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-3.0.0.tgz#9168c062fab11a86b8d444dd968bb4b73851ce92" - integrity sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ== - dependencies: - array-back "^2.0.0" - typical "^2.6.1" +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" -through@^2.3.6: +"through@>=2.2.7 <3", through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -4849,66 +4144,95 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.1.2" -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" punycode "^2.1.1" -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +ts-jest@^27.1.3: + version "27.1.3" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.3.tgz#1f723e7e74027c4da92c0ffbd73287e8af2b2957" + integrity sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + +ts-node@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" + integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== + dependencies: + "@cspotcode/source-map-support" "0.7.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" + yn "3.1.1" + +ts-type@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ts-type/-/ts-type-2.1.2.tgz#2e7734e729806729d41b4071b4fd513c9cd5cfac" + integrity sha512-64/2XoaipFXa/bidwXChQCSJ3VaCUVKrEaRPXiP5gLIlkPoAHfnwOMC0EWr42DsTm/+qYYuNwzxc0VQroeDs+g== dependencies: - punycode "^2.1.1" + tslib "^2.3.1" + typedarray-dts "^1.0.0" -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" +tslib@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== -tslib@^1.9.0: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= +tslib@^2.1.0, tslib@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: - safe-buffer "^5.0.1" + tslib "^1.8.1" -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" @@ -4922,10 +4246,20 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.6.0: version "0.6.0" @@ -4937,6 +4271,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +typedarray-dts@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typedarray-dts/-/typedarray-dts-1.0.0.tgz#9dec9811386dbfba964c295c2606cf9a6b982d06" + integrity sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -4944,53 +4283,45 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typical@^2.4.2, typical@^2.6.0, typical@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= - -typical@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" - integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== - -typical@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-6.0.1.tgz#89bd1a6aa5e5e96fa907fb6b7579223bff558a06" - integrity sha512-+g3NEp7fJLe9DPa1TArHm9QAA7YciZmWnfAqEaFrBihQ7epOv9i99rjtgb6Iz0wh3WuQDjsCTDfgRoGnmHN81A== +typedoc@^0.22.11: + version "0.22.11" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.11.tgz#a3d7f4577eef9fc82dd2e8f4e2915e69f884c250" + integrity sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA== + dependencies: + glob "^7.2.0" + lunr "^2.3.9" + marked "^4.0.10" + minimatch "^3.0.4" + shiki "^0.10.0" -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +typescript@^4.4.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" + integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== -uglify-js@^3.1.4: - version "3.13.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.10.tgz#a6bd0d28d38f592c3adb6b180ea6e07e1e540a8d" - integrity sha512-57H3ACYFXeo1IaZ1w02sfA71wI60MGco/IQFjOqK+WtKoprh7Go2/yvd2HPtoJILO2Or84ncLccI4xoHMTSbGg== +typescript@^4.5.4, typescript@^4.5.5: + version "4.5.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== -underscore@~1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" - integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== +universalify@^0.1.0, universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= +upath2@^3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/upath2/-/upath2-3.1.12.tgz#441b3dfbadde21731017bd1b7beb169498efd0a9" + integrity sha512-yC3eZeCyCXFWjy7Nu4pgjLhXNYjuzuUmJiRgSSw6TJp8Emc+E4951HGPJf+bldFC5SL7oBLeNbtm1fGzXn2gxw== dependencies: - has-value "^0.3.1" - isobject "^3.0.0" + path-is-network-drive "^1.0.13" + path-strip-sep "^1.0.10" + tslib "^2.3.1" uri-js@^4.2.2: version "4.4.1" @@ -4999,40 +4330,20 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@~1.0.1: +util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - v8-compile-cache@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" - integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz#5b95cef45c0f83217ec79f8fc7ee1c8b486aee07" - integrity sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g== +v8-to-istanbul@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" + integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -5046,14 +4357,15 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" +vscode-oniguruma@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz#2bf4dfcfe3dd2e56eb549a3068c8ee39e6c30ce5" + integrity sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ== + +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== w3c-hr-time@^1.0.2: version "1.0.2" @@ -5069,22 +4381,12 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -walk-back@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-2.0.1.tgz#554e2a9d874fac47a8cb006bf44c2f0c4998a0a4" - integrity sha1-VU4qnYdPrEeoywBr9EwvDEmYoKQ= - -walk-back@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-4.0.0.tgz#9e4ad2bd72038f3beed2d83180f9fd40b233bfab" - integrity sha512-kudCA8PXVQfrqv2mFTG72vDBRi8BKWxGgFLwPpzHcpZnSwZk93WMwUDVcLHWNsnm+Y0AC4Vb6MUNRgaHfyV2DQ== - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - makeerror "1.0.x" + makeerror "1.0.12" webidl-conversions@^5.0.0: version "5.0.0" @@ -5108,59 +4410,27 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^8.0.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" - integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.2" + lodash "^4.7.0" + tr46 "^2.1.0" webidl-conversions "^6.1.0" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wordwrapjs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-3.0.0.tgz#c94c372894cadc6feb1a66bff64e1d9af92c5d1e" - integrity sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw== - dependencies: - reduce-flatten "^1.0.1" - typical "^2.6.1" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -5170,6 +4440,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -5185,17 +4464,10 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@^7.2.3: - version "7.5.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" - integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== +ws@^7.4.6: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== xml-name-validator@^3.0.0: version "3.0.0" @@ -5207,47 +4479,63 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmlcreate@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.3.tgz#df9ecd518fd3890ab3548e1b811d040614993497" - integrity sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ== - -y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== - -yallist@^3.0.0, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" -yargs@^15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== +yargs@^17.0.0: + version "17.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" 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" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==