diff --git a/.editorconfig b/.editorconfig index 52129378e7..0718e1bad5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,7 +5,6 @@ end_of_line = lf insert_final_newline = true charset = utf-8 indent_style = tab -indent_size = 4 trim_trailing_whitespace = true [{package.json,*.yml,*.yaml}] @@ -13,9 +12,7 @@ indent_style = space indent_size = 2 [Dockerfile] -indent_size = 2 indent_style = tab [Makefile] -indent_size = 2 indent_style = tab diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000..41f12ae35e --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,31 @@ +module.exports = { + root: true, + env: { + node: true, + }, + extends: ['plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'], + plugins: ['@typescript-eslint', 'prettier'], + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + '@typescript-eslint/camelcase': 0, + '@typescript-eslint/no-use-before-define': 0, + '@typescript-eslint/ban-ts-ignore': 0, + '@typescript-eslint/no-explicit-any': 0, + '@typescript-eslint/no-var-requires': 0, + 'prettier/prettier': ['error', { singleQuote: true }], + 'comma-dangle': [ + 'error', + { + arrays: 'always-multiline', + exports: 'always-multiline', + functions: 'never', + imports: 'always-multiline', + objects: 'always-multiline', + }, + ], + }, + parserOptions: { + parser: '@typescript-eslint/parser', + }, +}; diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..303ee72363 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,8 @@ +# These are supported funding model platforms + +github: [directus, benhaynes, rijkvanzanten] +patreon: directus # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +custom: # Replace with a single custom sponsorship URL diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..29f2050896 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,30 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' +--- + + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..81fe603a02 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Feature Request + url: https://github.com/directus/directus/discussions/new + about: Share your ideas on how to make Directus better. + - name: Directus Community Support + url: https://directus.chat/ + about: Please ask and answer questions here. diff --git a/.github/actions/Makefile b/.github/actions/Makefile index 73f4947538..4e2a6ac09e 100644 --- a/.github/actions/Makefile +++ b/.github/actions/Makefile @@ -5,7 +5,7 @@ tag=$(version) cmd= user=directus registry=ghcr.io -repository=directus/next +repository=directus/directus .PHONY: build diff --git a/.github/actions/build-images/rootfs/directus/images/main/examples/docker-compose.yml b/.github/actions/build-images/rootfs/directus/images/main/examples/docker-compose.yml new file mode 100644 index 0000000000..cd6ddf8568 --- /dev/null +++ b/.github/actions/build-images/rootfs/directus/images/main/examples/docker-compose.yml @@ -0,0 +1,33 @@ +version: "3" +services: + database: + image: postgres:12 + networks: + - "directus" + environment: + POSTGRES_DB: "directus" + POSTGRES_USER: "directus" + POSTGRES_PASSWORD: "directus" + + directus: + build: + context: "../" + args: + VERSION: "v9.0.0-rc.5" + REPOSITORY: "directus/directus" + ports: + - 8055:8055 + networks: + - "directus" + environment: + KEY: mykey + SECRET: mysecret + DB_CLIENT: "pg" + DB_HOST: "database" + DB_PORT: "5432" + DB_USER: "directus" + DB_PASSWORD: "directus" + DB_DATABASE: "directus" + +networks: + directus: diff --git a/.github/actions/build-images/rootfs/directus/images/main/rootfs/usr/bin/entrypoint b/.github/actions/build-images/rootfs/directus/images/main/rootfs/usr/bin/entrypoint index faeab35fcf..7b2d1a6298 100644 --- a/.github/actions/build-images/rootfs/directus/images/main/rootfs/usr/bin/entrypoint +++ b/.github/actions/build-images/rootfs/directus/images/main/rootfs/usr/bin/entrypoint @@ -2,40 +2,6 @@ set -e -function seed() { - # TODO: move users to a separate check, outside database installation - local show=false - local email=${DIRECTUS_ADMIN_EMAIL:-"admin@example.com"} - local password=${DIRECTUS_ADMIN_PASSWORD:-""} - - if [ "${password}" == "" ] ; then - password=$(node -e 'console.log(require("nanoid").nanoid(12))') - show=true - fi - - print --level=info "Creating administrator role" - local role=$(npx directus roles create --name Administrator --admin) - - print --level=info "Creating administrator user" - local user=$(npx directus users create --email "${email}" --password "${password}" --role "${role}") - - if [ "${show}" == "true" ] ; then - print --level=info --stdin < -> Email: $email -> Password: $password -> -MSG - else - print --level=info --stdin < -> Email: $email -> Password: -> -MSG - fi -} - function bootstrap() { local warn=false @@ -52,20 +18,20 @@ function bootstrap() { if [ "${warn}" == "true" ] ; then print --level=warn --stdin < -> WARNING! +> WARNING! > -> The KEY and SECRET environment variables are not set. -> Some temporar -y variables were generated to fill the gap, -> but in production this is going to cause problems. +> The KEY and SECRET environment variables are not set. Some +> temporary variables were generated to fill the gap, but in +> production this is going to cause problems. +> +> Reference: +> https://docs.directus.io/reference/environment-variables.html > -> Please refer to the docs at https://docs.directus.io/ -> on how and why to configure them properly > WARN fi - # Install database if using sqlite and file doesn't exist + # Create folder if using sqlite and file doesn't exist if [ "${DB_CLIENT}" == "sqlite3" ] ; then if [ "${DB_FILENAME}" == "" ] ; then print --level=error "Missing DB_FILENAME environment variable" @@ -77,19 +43,7 @@ WARN fi fi - should_seed=false - - set +e - npx directus database install &>/dev/null - if [ "$?" == "0" ] ; then - print --level=info "Database installed" - should_seed=true - fi - set -e - - if [ "${should_seed}" == "true" ] ; then - seed - fi + npx directus bootstrap } command="" diff --git a/.github/actions/build-images/rootfs/usr/bin/entrypoint b/.github/actions/build-images/rootfs/usr/bin/entrypoint index eb07e51086..d08bc87bb2 100644 --- a/.github/actions/build-images/rootfs/usr/bin/entrypoint +++ b/.github/actions/build-images/rootfs/usr/bin/entrypoint @@ -69,7 +69,7 @@ function main() { registry=$(argument registry "") registry=$(echo "${registry}" | tr '[:upper:]' '[:lower:]') - repository=$(argument repository "directus/next") + repository=$(argument repository "directus/directus") repository=$(echo "${repository}" | tr '[:upper:]' '[:lower:]') version=$(argument version "") diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml index aa9fa3ecf7..e2fa5898da 100644 --- a/.github/workflows/build-images.yml +++ b/.github/workflows/build-images.yml @@ -8,6 +8,11 @@ jobs: build: runs-on: ubuntu-latest steps: + - name: Sleep for 30 seconds + uses: jakejarvis/wait-action@master + with: + time: '30s' + - name: Checkout uses: actions/checkout@v2 diff --git a/.github/workflows/website-docs-deploy.yml b/.github/workflows/website-docs-deploy.yml new file mode 100644 index 0000000000..031aca12ba --- /dev/null +++ b/.github/workflows/website-docs-deploy.yml @@ -0,0 +1,21 @@ +name: Deploy Website / Docs + +on: + schedule: + - cron: '59 23 * * *' + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: satak/webrequest-action@master + with: + url: ${{ secrets.BUILD_HOOK_WEBSITE }} + method: POST + + - uses: satak/webrequest-action@master + with: + url: ${{ secrets.BUILD_HOOK_DOCS }} + method: POST diff --git a/.gitignore b/.gitignore index fec535c68f..78fe13fe78 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .DS_Store node_modules -.vs_code +.vscode .env .secrets npm-debug.log @@ -8,3 +8,7 @@ lerna-debug.log .nova *.code-workspace dist +*.sublime-settings +*.db +.nyc_output +/.idea/ diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index f8d45edb52..0000000000 --- a/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "printWidth": 100, - "singleQuote": true, - "useTabs": true -} diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000000..758f6fe2bb --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,7 @@ +module.exports = { + htmlWhitespaceSensitivity: 'ignore', + printWidth: 120, + singleQuote: true, + useTabs: true, + proseWrap: 'always', +}; diff --git a/api/.editorconfig b/api/.editorconfig index d2cb980c62..2f07b05d31 100644 --- a/api/.editorconfig +++ b/api/.editorconfig @@ -5,7 +5,6 @@ end_of_line = lf insert_final_newline = true charset = utf-8 indent_style = tab -indent_size = 4 trim_trailing_whitespace = true [{package.json,*.yml,*.yaml}] diff --git a/api/.eslintrc.js b/api/.eslintrc.js new file mode 100644 index 0000000000..89a445f26c --- /dev/null +++ b/api/.eslintrc.js @@ -0,0 +1,5 @@ +const parentConfig = require('../.eslintrc.js'); + +module.exports = { + ...parentConfig, +}; diff --git a/api/.prettierrc.js b/api/.prettierrc.js new file mode 100644 index 0000000000..e5beaf60cd --- /dev/null +++ b/api/.prettierrc.js @@ -0,0 +1,5 @@ +const parentConfig = require('../.prettierrc.js'); + +module.exports = { + ...parentConfig, +}; diff --git a/api/README.md b/api/README.md index 525ef891ab..24c2ab7275 100644 --- a/api/README.md +++ b/api/README.md @@ -1,31 +1,56 @@ -Logo +

 

-## 🐰 Introduction +Logo -Welcome to the preview release of the next major version of Directus. +

 

-**NOTE:** This is pre-release software and should be treated as such. DO NOT use this in production. -Migrations between versions aren't provided, and breaking changes might happen at any release. +## Introduction -## ⚙️ Installation +**Directus is a free and open-source data platform for headless content management**. It can be installed on top of any +new or existing SQL database, instantly providing a dynamic API (REST+GraphQL) and accompanying App for managing +content. Built entirely in TypeScript (in Node and Vue), Directus is completely modular and end-to-end extensible... +with absolutely no paywalls or artificial limitations. -_Directus requires NodeJS 10+_ +Modern and intuitive, the Directus App enables no-code data discovery, allowing for even the most non-technical users to +view, author, and manage your raw database content. Our performant and flexible API is able to adapt to any relational +schema, and includes rule-based permissions, event/web hooks, custom endpoints, numerous auth options, configurable +storage adapters, and much more. -We've created a little CLI tool you can use to quickly start up a Directus project. You can use it by running: +Current database support includes: PostgreSQL, MySQL, SQLite, MS-SQL Server, OracleDB, MariaDB, and varients such as AWS +Aurora/Redshift or Google Cloud Platform SQL. + +Learn more at... + +- [Website](https://directus.io/) +- [GitHub](https://github.com/directus/directus) +- [Community](https://directus.chat/) +- [Twitter](https://twitter.com/directus) +- [Docs](https://docs.directus.io/) +- [Marketplace](https://directus.market/) +- [Cloud](http://directus.cloud/) + +

 

+ +## Installing + +Directus requires NodeJS 10+. Create a new project with our simple CLI tool: ``` npx create-directus-project my-project ``` -or using yarn: +Or using yarn: ``` yarn create directus-project my-project ``` -on the command line. This will create the given directory, setup the configuration, and install the database. +The above command will create a directory with your project name, then walk you through the database configuration and +creation of your first admin user. -## ✨ Updating +

 

+ +## Updating To update an existing Directus project, navigate to your project directory and run: @@ -33,19 +58,31 @@ To update an existing Directus project, navigate to your project directory and r npm update ``` -## 🔧 Contributing +

 

-Please report any and all quirks / issues you come across as [an issue](https://github.com/directus/next/issues/new). +## Contributing -Pull requests are more than welcome and always appreciated. Seeing this is in active development, please make sure to reach out a member of the core team in an issue or [on Discord](http://discord.gg/directus) before you start working on a feature or bug to ensure you don't work on the same thing as somebody else :) +Please report any and all issues [on our GitHub](https://github.com/directus/directus/issues/new). -## ❤️ Supporting Directus +Pull-requests are more than welcome, and always appreciated. Please read our +[Contributors Guide](https://docs.directus.io/getting-started/contributing.html) before starting work on a new feature +or bug, or reach out a member of the Core Team via [GitHub](https://github.com/directus/directus/discussions) or +[Discord](https://directus.chat) with any questions. -Directus is a GPLv3-licensed open source project with development made possible by support from our core team, contributors, and sponsors. It's not easy building premium open-source software; if you would like to help ensure Directus stays free, please consider becoming a sponsor. +

 

-- [Support us through GitHub Sponsors](https://github.com/sponsors/directus) -- [One-time donation through PayPal](https://www.paypal.me/supportdirectus) +## Supporting -## 📄 License +Directus is a free and open-source project with development made possible by support from our passionate core team, +amazing contributors, and generous sponsors. It's not easy building premium open-source software; if you would like to +help ensure Directus stays free, please consider becoming a sponsor. -Directus is released under [the GPLv3 license](./license). Monospace Inc. owns all Directus trademarks and logos on behalf of our project's community. Copyright © 2006-2020, Monospace Inc. +- [Support us through GitHub Sponsors](https://github.com/sponsors/directus) +- [One-time donation through PayPal](https://www.paypal.me/supportdirectus) + +

 

+ +## License + +Directus is released under the [GPLv3 license](./license). Monospace Inc owns all Directus trademarks, logos, and +intellectual property on behalf of our project's community. Copyright © 2004-2020, Monospace Inc. diff --git a/api/example.env b/api/example.env index 2e20fdafb2..84903cff76 100644 --- a/api/example.env +++ b/api/example.env @@ -53,6 +53,9 @@ CACHE_ENABLED=true CACHE_TTL="30m" CACHE_NAMESPACE="directus-cache" CACHE_STORE=memory # memory | redis | memcache +CACHE_AUTO_PURGE=true + +ASSETS_CACHE_TTL="30m" # CACHE_REDIS="redis://:authpassword@127.0.0.1:6380/4" # --OR-- diff --git a/api/index.js b/api/index.js new file mode 100644 index 0000000000..e7df18e8f0 --- /dev/null +++ b/api/index.js @@ -0,0 +1,5 @@ +module.exports = { + createApp: require('./dist/app').default, + ...require('./dist/exceptions'), + ...require('./dist/services'), +}; diff --git a/api/package-lock.json b/api/package-lock.json deleted file mode 100644 index 21b348ee9a..0000000000 --- a/api/package-lock.json +++ /dev/null @@ -1,12229 +0,0 @@ -{ - "name": "directus", - "version": "9.0.0-rc.2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@azure/ms-rest-azure-env": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-env/-/ms-rest-azure-env-1.1.2.tgz", - "integrity": "sha512-l7z0DPCi2Hp88w12JhDTtx5d0Y3+vhfE7JKJb9O7sEz71Cwp053N8piTtTnnk/tUor9oZHgEKi/p3tQQmLPjvA==", - "optional": true - }, - "@azure/ms-rest-js": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-1.8.15.tgz", - "integrity": "sha512-kIB71V3DcrA4iysBbOsYcxd4WWlOE7OFtCUYNfflPODM0lbIR23A236QeTn5iAeYwcHmMjR/TAKp5KQQh/WqoQ==", - "optional": true, - "requires": { - "@types/tunnel": "0.0.0", - "axios": "^0.19.0", - "form-data": "^2.3.2", - "tough-cookie": "^2.4.3", - "tslib": "^1.9.2", - "tunnel": "0.0.6", - "uuid": "^3.2.1", - "xml2js": "^0.4.19" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "optional": true - } - } - }, - "@azure/ms-rest-nodeauth": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@azure/ms-rest-nodeauth/-/ms-rest-nodeauth-2.0.2.tgz", - "integrity": "sha512-KmNNICOxt3EwViAJI3iu2VH8t8BQg5J2rSAyO4IUYLF9ZwlyYsP419pdvl4NBUhluAP2cgN7dfD2V6E6NOMZlQ==", - "optional": true, - "requires": { - "@azure/ms-rest-azure-env": "^1.1.2", - "@azure/ms-rest-js": "^1.8.7", - "adal-node": "^0.1.28" - } - }, - "@directus/app": { - "version": "file:../app", - "requires": { - "@directus/docs": "file:../docs", - "@directus/format-title": "file:../packages/format-title", - "@popperjs/core": "^2.4.3", - "@sindresorhus/slugify": "^1.0.0", - "@tinymce/tinymce-vue": "^3.2.2", - "@types/codemirror": "^0.0.97", - "@types/color": "^3.0.1", - "@types/color-string": "^1.5.0", - "@types/debug": "^4.1.5", - "@types/htmlhint": "^0.9.1", - "@types/js-yaml": "^3.12.5", - "@types/lodash": "^4.14.158", - "@types/mousetrap": "^1.6.3", - "@vue/composition-api": "^0.6.7", - "axios": "^0.19.2", - "base-64": "^0.1.0", - "bytes": "^3.1.0", - "codemirror": "^5.56.0", - "color": "^3.1.2", - "color-string": "^1.5.3", - "cropperjs": "^1.5.7", - "date-fns": "^2.14.0", - "diff": "^4.0.2", - "highlight.js": "^10.2.0", - "htmlhint": "^0.14.1", - "joi": "^17.2.1", - "js-yaml": "^3.14.0", - "jshint": "^2.11.1", - "jsonlint": "^1.6.3", - "jsonlint-mod": "^1.7.5", - "lodash": "^4.17.19", - "marked": "^1.1.1", - "micromustache": "^7.1.0", - "mime-types": "^2.1.27", - "mitt": "^2.1.0", - "mousetrap": "^1.6.5", - "nanoid": "^3.1.10", - "pinia": "^0.0.7", - "portal-vue": "^2.1.7", - "pretty-ms": "^7.0.0", - "qrcode": "^1.4.4", - "resize-observer": "^1.0.0", - "semver": "^7.3.2", - "stylelint-config-prettier": "^8.0.2", - "tinymce": "^5.4.1", - "vue": "^2.6.11", - "vue-i18n": "^8.18.2", - "vue-router": "^3.3.4", - "vuedraggable": "^2.24.1" - }, - "dependencies": { - "@directus/docs": { - "version": "file:../docs" - }, - "@directus/format-title": { - "version": "file:../packages/format-title" - }, - "@hapi/address": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz", - "integrity": "sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@hapi/formula": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", - "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==" - }, - "@hapi/hoek": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz", - "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==" - }, - "@hapi/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==" - }, - "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@popperjs/core": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.5.3.tgz", - "integrity": "sha512-RFwCobxsvZ6j7twS7dHIZQZituMIDJJNHS/qY6iuthVebxS3zhRY+jaC2roEKiAYaVuTcGmX6Luc6YBcf6zJVg==" - }, - "@sindresorhus/slugify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.0.tgz", - "integrity": "sha512-ujZRbmmizX26yS/HnB3P9QNlNa4+UvHh+rIse3RbOXLp8yl6n1TxB4t7NHggtVgS8QmmOtzXo48kCxZGACpkPw==", - "requires": { - "@sindresorhus/transliterate": "^0.1.1", - "escape-string-regexp": "^4.0.0" - } - }, - "@sindresorhus/transliterate": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.1.tgz", - "integrity": "sha512-QSdIQ5keUFAZ3KLbfbsntW39ox0Ym8183RqTwBq/ZEFoN3NQAtGV+qWaNdzKpIDHgj9J2CQ2iNDRVU11Zyr7MQ==", - "requires": { - "escape-string-regexp": "^2.0.0", - "lodash.deburr": "^4.1.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "@tinymce/tinymce-vue": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@tinymce/tinymce-vue/-/tinymce-vue-3.2.3.tgz", - "integrity": "sha512-SMjpAQg2BLtYmnx4s3rKiAFxgXCx4uKWu8XmcvsZoYl5kvF4yaoqx70ovYJvT83ucpO7n6pewnQL3O4lR2WF3Q==" - }, - "@types/codemirror": { - "version": "0.0.97", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.97.tgz", - "integrity": "sha512-n5d7o9nWhC49DjfhsxANP7naWSeTzrjXASkUDQh7626sM4zK9XP2EVcHp1IcCf/IPV6c7ORzDUDF3Bkt231VKg==", - "requires": { - "@types/tern": "*" - } - }, - "@types/color": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.1.tgz", - "integrity": "sha512-oeUWVaAwI+xINDUx+3F2vJkl/vVB03VChFF/Gl3iQCdbcakjuoJyMOba+3BXRtnBhxZ7uBYqQBi9EpLnvSoztA==", - "requires": { - "@types/color-convert": "*" - } - }, - "@types/color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha512-OKGEfULrvSL2VRbkl/gnjjgbbF7ycIlpSsX7Nkab4MOWi5XxmgBYvuiQ7lcCFY5cPDz7MUNaKgxte2VRmtr4Fg==", - "requires": { - "@types/color-name": "*" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/color-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/color-string/-/color-string-1.5.0.tgz", - "integrity": "sha512-17/8LWbkfvoKgfnnBvKbUnPTzPtzBlSELf5FPvVt9dRTQW88igOYZZ78us9dmbY1301VtTBEnuPTKspvmtGDxA==" - }, - "@types/debug": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", - "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" - }, - "@types/estree": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", - "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==" - }, - "@types/htmlhint": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@types/htmlhint/-/htmlhint-0.9.1.tgz", - "integrity": "sha1-4C1lojs4iD01utEkmzA7hJ45RrE=" - }, - "@types/js-yaml": { - "version": "3.12.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.5.tgz", - "integrity": "sha512-JCcp6J0GV66Y4ZMDAQCXot4xprYB+Zfd3meK9+INSJeVZwJmHAW30BBEEkPzXswMXuiyReUGOP3GxrADc9wPww==" - }, - "@types/lodash": { - "version": "4.14.161", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.161.tgz", - "integrity": "sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA==" - }, - "@types/mousetrap": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.4.tgz", - "integrity": "sha512-+Y900DGhe+f+4lRwHm9krsKfsiXcbdOhzTsLbytU4MiG8wE9xOw7CFKtgYKfqEAcUdWEGZRyuTxoyFl2Gx6Rdg==" - }, - "@types/tern": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.3.tgz", - "integrity": "sha512-imDtS4TAoTcXk0g7u4kkWqedB3E4qpjXzCpD2LU5M5NAXHzCDsypyvXSaG7mM8DKYkCRa7tFp4tS/lp/Wo7Q3w==", - "requires": { - "@types/estree": "*" - } - }, - "@vue/composition-api": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@vue/composition-api/-/composition-api-0.6.7.tgz", - "integrity": "sha512-WAWEQK4urEsMNe3OyOp7VnMmegRZT2yRB3fDGLRXPMdfuo4+nM+uMEhUgDiUg9LFSXfLWhjwuFOJ2hnS2X7AUw==", - "requires": { - "tslib": "^2.0.0" - } - }, - "JSV": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", - "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=" - }, - "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - }, - "dependencies": { - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" - }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "requires": { - "follow-redirects": "1.5.10" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base-64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", - "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "codemirror": { - "version": "5.58.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.58.1.tgz", - "integrity": "sha512-UGb/ueu20U4xqWk8hZB3xIfV2/SFqnSLYONiM3wTMDqko0bsYrsAkGGhqUzbRkYm89aBKPyHtuNEbVWF9FTFzw==" - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cropperjs": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.5.9.tgz", - "integrity": "sha512-aPWlg43sLIcYN4GBXIdyvM09wNPgn1ug+vNVwV8jlb3dbgEX/B34Iw6hrjGSajkUDQBmaCi6uPOevFb7N0yUsw==" - }, - "csslint": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/csslint/-/csslint-1.0.5.tgz", - "integrity": "sha1-Gcw+2jIhYP0/cjKvHLKjYOiYouk=", - "requires": { - "clone": "~2.1.0", - "parserlib": "~1.1.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-fns": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz", - "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==" - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" - }, - "dijkstrajs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", - "integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs=" - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", - "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==" - }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "highlight.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.2.1.tgz", - "integrity": "sha512-A+sckVPIb9zQTUydC9lpRX1qRFO/N0OKEh0NwIr65ckvWA/oMY8v9P3+kGRK3w2ULSh9E8v5MszXafodQ6039g==" - }, - "htmlhint": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-0.14.1.tgz", - "integrity": "sha512-VWKrljlwF8tEKH48YPfC30zYKhrsMqm70d7vXswivEqd3DSva8ZlIzfeCa3YWFEFRIIhiXKgKurlqEpCtYMCAA==", - "requires": { - "async": "3.2.0", - "chalk": "4.0.0", - "commander": "5.1.0", - "glob": "7.1.6", - "parse-glob": "3.0.4", - "request": "2.88.2", - "strip-json-comments": "3.1.0", - "xml": "1.0.1" - } - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "joi": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.2.1.tgz", - "integrity": "sha512-YT3/4Ln+5YRpacdmfEfrrKh50/kkgX3LgBltjqnlMPIYiZ4hxXZuVJcxmsvxsdeHg9soZfE3qXxHC2tMpCCBOA==", - "requires": { - "@hapi/address": "^4.1.0", - "@hapi/formula": "^2.0.0", - "@hapi/hoek": "^9.0.0", - "@hapi/pinpoint": "^2.0.0", - "@hapi/topo": "^5.0.0" - } - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jshint": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.12.0.tgz", - "integrity": "sha512-TwuuaUDmra0JMkuqvqy+WGo2xGHSNjv1BA1nTIgtH2K5z1jHuAEeAgp7laaR+hLRmajRjcrM71+vByBDanCyYA==", - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.19", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=" - } - } - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonlint": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.3.tgz", - "integrity": "sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A==", - "requires": { - "JSV": "^4.0.x", - "nomnom": "^1.5.x" - } - }, - "jsonlint-mod": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/jsonlint-mod/-/jsonlint-mod-1.7.6.tgz", - "integrity": "sha512-oGuk6E1ehmIpw0w9ttgb2KsDQQgGXBzZczREW8OfxEm9eCQYL9/LCexSnh++0z3AiYGcXpBgqDSx9AAgzl/Bvg==", - "requires": { - "JSV": "^4.0.2", - "chalk": "^2.4.2", - "underscore": "^1.9.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "underscore": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz", - "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==" - } - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.deburr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s=" - }, - "marked": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.0.tgz", - "integrity": "sha512-tiRxakgbNPBr301ihe/785NntvYyhxlqcL3YaC8CaxJQh7kiaEtrN9B/eK2I2943Yjkh5gw25chYFDQhOMCwMA==" - }, - "micromustache": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/micromustache/-/micromustache-7.1.0.tgz", - "integrity": "sha512-DXUYQI8qPsfOx3AkiGzyOx0cn7NgCqFYsV0Asa/ZQUna2Er4mwpAdA9iANA92WYvUowHf+jBsVvIZxiRe1z1Ig==" - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mitt": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz", - "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==" - }, - "mousetrap": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", - "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==" - }, - "nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "requires": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" - }, - "parserlib": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-1.1.1.tgz", - "integrity": "sha1-pkz6ckBiQ0/fw1HJpOwtkrlMBvQ=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pinia": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-0.0.7.tgz", - "integrity": "sha512-zvoVqW+8AwswQAh2GtJP7JD/X/cciZmeH++cH6oekG3EpMCIQba7cHsBSayw08RTfPuT3vMErtKMDegz4bxzLQ==" - }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" - }, - "portal-vue": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.7.tgz", - "integrity": "sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==" - }, - "pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "requires": { - "parse-ms": "^2.1.0" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qrcode": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", - "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", - "requires": { - "buffer": "^5.4.3", - "buffer-alloc": "^1.2.0", - "buffer-from": "^1.1.1", - "dijkstrajs": "^1.0.1", - "isarray": "^2.0.1", - "pngjs": "^3.3.0", - "yargs": "^13.2.4" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "resize-observer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resize-observer/-/resize-observer-1.0.0.tgz", - "integrity": "sha512-D7UFShDm2TgrEDEyeg+/tTEbvOgPWlvPAfJtxiKp+qutu6HowmcGJKjECgGru0PPDIj3SAucn3ZPpOx54fF7DQ==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=" - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "sortablejs": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.12.0.tgz", - "integrity": "sha512-bPn57rCjBRlt2sC24RBsu40wZsmLkSo2XeqG8k6DC1zru5eObQUIPPZAQG7W2SJ8FZQYq+BEJmvuw1Zxb3chqg==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" - }, - "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==" - }, - "stylelint-config-prettier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz", - "integrity": "sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "tinymce": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-5.5.1.tgz", - "integrity": "sha512-z03C8/0TBby68Kp7YUTSCZ0QJINsFCv9U+Cv3TNHg+T1spZ4V6vOIgD0zeTd/xKqkru0P7IOHoeAnOjfpTLq7g==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tslib": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.2.tgz", - "integrity": "sha512-wAH28hcEKwna96/UacuWaVspVLkg4x1aDM9JlzqaQTOFczCktkVAb5fmXChgandR1EraDPs2w8P+ozM+oafwxg==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vue": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", - "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==" - }, - "vue-i18n": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.22.0.tgz", - "integrity": "sha512-2tYS0bYDPJHKAWPy01aDe5h3wcXDGjhJmboHKOfi2OEYR+6gyXaIzdua1smZCQwOeWdlGsLntwdIgkXWrnLjxg==" - }, - "vue-router": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.6.tgz", - "integrity": "sha512-kaXnB3pfFxhAJl/Mp+XG1HJMyFqrL/xPqV7oXlpXn4AwMmm6VNgf0nllW8ksflmZANfI4kdo0bVn/FYSsAolPQ==" - }, - "vuedraggable": { - "version": "2.24.1", - "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.1.tgz", - "integrity": "sha512-G1fxO1oshx+WLdieSGl6jSJdlHOQFga1FpjuUpgXldbpKNzxpjsGn4xYNnRHVrOAqm8aG5FfpdQlh5LHesxCeA==", - "requires": { - "sortablejs": "^1.10.1" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "@directus/format-title": { - "version": "file:../packages/format-title", - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" - }, - "@jest/console": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.5.2.tgz", - "integrity": "sha512-lJELzKINpF1v74DXHbCRIkQ/+nUV1M+ntj+X1J8LxCgpmJZjfLmhFejiMSbjjD66fayxl5Z06tbs3HMyuik6rw==", - "requires": { - "@jest/types": "^26.5.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.5.2", - "jest-util": "^26.5.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.5.3.tgz", - "integrity": "sha512-CiU0UKFF1V7KzYTVEtFbFmGLdb2g4aTtY0WlyUfLgj/RtoTnJFhh50xKKr7OYkdmBUlGFSa2mD1TU3UZ6OLd4g==", - "requires": { - "@jest/console": "^26.5.2", - "@jest/reporters": "^26.5.3", - "@jest/test-result": "^26.5.2", - "@jest/transform": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.5.2", - "jest-config": "^26.5.3", - "jest-haste-map": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.5.2", - "jest-resolve-dependencies": "^26.5.3", - "jest-runner": "^26.5.3", - "jest-runtime": "^26.5.3", - "jest-snapshot": "^26.5.3", - "jest-util": "^26.5.2", - "jest-validate": "^26.5.3", - "jest-watcher": "^26.5.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.5.2.tgz", - "integrity": "sha512-YjhCD/Zhkz0/1vdlS/QN6QmuUdDkpgBdK4SdiVg4Y19e29g4VQYN5Xg8+YuHjdoWGY7wJHMxc79uDTeTOy9Ngw==", - "requires": { - "@jest/fake-timers": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/node": "*", - "jest-mock": "^26.5.2" - } - }, - "@jest/fake-timers": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.5.2.tgz", - "integrity": "sha512-09Hn5Oraqt36V1akxQeWMVL0fR9c6PnEhpgLaYvREXZJAh2H2Y+QLCsl0g7uMoJeoWJAuz4tozk1prbR1Fc1sw==", - "requires": { - "@jest/types": "^26.5.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.5.2", - "jest-mock": "^26.5.2", - "jest-util": "^26.5.2" - } - }, - "@jest/globals": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.5.3.tgz", - "integrity": "sha512-7QztI0JC2CuB+Wx1VdnOUNeIGm8+PIaqngYsZXQCkH2QV0GFqzAYc9BZfU0nuqA6cbYrWh5wkuMzyii3P7deug==", - "requires": { - "@jest/environment": "^26.5.2", - "@jest/types": "^26.5.2", - "expect": "^26.5.3" - } - }, - "@jest/reporters": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.5.3.tgz", - "integrity": "sha512-X+vR0CpfMQzYcYmMFKNY9n4jklcb14Kffffp7+H/MqitWnb0440bW2L76NGWKAa+bnXhNoZr+lCVtdtPmfJVOQ==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.5.2", - "@jest/test-result": "^26.5.2", - "@jest/transform": "^26.5.2", - "@jest/types": "^26.5.2", - "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-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.5.2", - "jest-resolve": "^26.5.2", - "jest-util": "^26.5.2", - "jest-worker": "^26.5.0", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^6.0.1" - } - }, - "@jest/source-map": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz", - "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.5.2.tgz", - "integrity": "sha512-E/Zp6LURJEGSCWpoMGmCFuuEI1OWuI3hmZwmULV0GsgJBh7u0rwqioxhRU95euUuviqBDN8ruX/vP/4bwYolXw==", - "requires": { - "@jest/console": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.5.3.tgz", - "integrity": "sha512-Wqzb7aQ13L3T47xHdpUqYMOpiqz6Dx2QDDghp5AV/eUDXR7JieY+E1s233TQlNyl+PqtqgjVokmyjzX/HA51BA==", - "requires": { - "@jest/test-result": "^26.5.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.5.2", - "jest-runner": "^26.5.3", - "jest-runtime": "^26.5.3" - } - }, - "@jest/transform": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.5.2.tgz", - "integrity": "sha512-AUNjvexh+APhhmS8S+KboPz+D3pCxPvEAGduffaAJYxIFxGi/ytZQkrqcKDUU0ERBAo5R7087fyOYr2oms1seg==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.5.2", - "babel-plugin-istanbul": "^6.0.0", - "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.5.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.5.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.5.2.tgz", - "integrity": "sha512-QDs5d0gYiyetI8q+2xWdkixVQMklReZr4ltw7GFDtb4fuJIBCE6mzj2LnitGqCuAlLap6wPyb8fpoHgwZz5fdg==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@types/babel__core": { - "version": "7.1.10", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", - "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", - "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", - "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/node": { - "version": "14.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", - "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==" - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" - }, - "@types/prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-IiPhNnenzkqdSdQH3ifk9LoX7oQe61ZlDdDO4+MUv6FyWdPGDPr26gCPVs3oguZEMq//nFZZpwUZcVuNJsG+DQ==" - }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" - }, - "@types/yargs": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.8.tgz", - "integrity": "sha512-b0BYzFUzBpOhPjpl1wtAHU994jBeKF4TKVlT7ssFv44T617XNcPdRoG4AzHLVshLzlrF7i3lTelH7UbuNYV58Q==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" - }, - "babel-jest": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.5.2.tgz", - "integrity": "sha512-U3KvymF3SczA3vOL/cgiUFOznfMET+XDIXiWnoJV45siAp2pLMG8i2+/MGZlAC3f/F6Q40LR4M4qDrWZ9wkK8A==", - "requires": { - "@jest/transform": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.5.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@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", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz", - "integrity": "sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw==", - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", - "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz", - "integrity": "sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA==", - "requires": { - "babel-plugin-jest-hoist": "^26.5.0", - "babel-preset-current-node-syntax": "^0.1.3" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "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" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - }, - "diff-sequences": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", - "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==" - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emittery": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", - "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expect": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.5.3.tgz", - "integrity": "sha512-kkpOhGRWGOr+TEFUnYAjfGvv35bfP+OlPtqPIJpOCR9DVtv8QV+p8zG0Edqafh80fsjeE+7RBcVUq1xApnYglw==", - "requires": { - "@jest/types": "^26.5.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-regex-util": "^26.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "requires": { - "bser": "2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "optional": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.5.3.tgz", - "integrity": "sha512-uJi3FuVSLmkZrWvaDyaVTZGLL8WcfynbRnFXyAHuEtYiSZ+ijDDIMOw1ytmftK+y/+OdAtsG9QrtbF7WIBmOyA==", - "requires": { - "@jest/core": "^26.5.3", - "import-local": "^3.0.2", - "jest-cli": "^26.5.3" - }, - "dependencies": { - "jest-cli": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.5.3.tgz", - "integrity": "sha512-HkbSvtugpSXBf2660v9FrNVUgxvPkssN8CRGj9gPM8PLhnaa6zziFiCEKQAkQS4uRzseww45o0TR+l6KeRYV9A==", - "requires": { - "@jest/core": "^26.5.3", - "@jest/test-result": "^26.5.2", - "@jest/types": "^26.5.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.5.3", - "jest-util": "^26.5.2", - "jest-validate": "^26.5.3", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - } - } - }, - "jest-changed-files": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.5.2.tgz", - "integrity": "sha512-qSmssmiIdvM5BWVtyK/nqVpN3spR5YyvkvPqz1x3BR1bwIxsWmU/MGwLoCrPNLbkG2ASAKfvmJpOduEApBPh2w==", - "requires": { - "@jest/types": "^26.5.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.5.3.tgz", - "integrity": "sha512-NVhZiIuN0GQM6b6as4CI5FSCyXKxdrx5ACMCcv/7Pf+TeCajJhJc+6dwgdAVPyerUFB9pRBIz3bE7clSrRge/w==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.5.3", - "@jest/types": "^26.5.2", - "babel-jest": "^26.5.2", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.5.2", - "jest-environment-node": "^26.5.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.5.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.5.2", - "jest-util": "^26.5.2", - "jest-validate": "^26.5.3", - "micromatch": "^4.0.2", - "pretty-format": "^26.5.2" - } - }, - "jest-diff": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.5.2.tgz", - "integrity": "sha512-HCSWDUGwsov5oTlGzrRM+UPJI/Dpqi9jzeV0fdRNi3Ch5bnoXhnyJMmVg2juv9081zLIy3HGPI5mcuGgXM2xRA==", - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.5.0", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.5.2" - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.5.2.tgz", - "integrity": "sha512-w7D9FNe0m2D3yZ0Drj9CLkyF/mGhmBSULMQTypzAKR746xXnjUrK8GUJdlLTWUF6dd0ks3MtvGP7/xNFr9Aphg==", - "requires": { - "@jest/types": "^26.5.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.5.2", - "pretty-format": "^26.5.2" - } - }, - "jest-environment-jsdom": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.5.2.tgz", - "integrity": "sha512-fWZPx0bluJaTQ36+PmRpvUtUlUFlGGBNyGX1SN3dLUHHMcQ4WseNEzcGGKOw4U5towXgxI4qDoI3vwR18H0RTw==", - "requires": { - "@jest/environment": "^26.5.2", - "@jest/fake-timers": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/node": "*", - "jest-mock": "^26.5.2", - "jest-util": "^26.5.2", - "jsdom": "^16.4.0" - } - }, - "jest-environment-node": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.5.2.tgz", - "integrity": "sha512-YHjnDsf/GKFCYMGF1V+6HF7jhY1fcLfLNBDjhAOvFGvt6d8vXvNdJGVM7uTZ2VO/TuIyEFhPGaXMX5j3h7fsrA==", - "requires": { - "@jest/environment": "^26.5.2", - "@jest/fake-timers": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/node": "*", - "jest-mock": "^26.5.2", - "jest-util": "^26.5.2" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" - }, - "jest-haste-map": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.5.2.tgz", - "integrity": "sha512-lJIAVJN3gtO3k4xy+7i2Xjtwh8CfPcH08WYjZpe9xzveDaqGw9fVNCpkYu6M525wKFVkLmyi7ku+DxCAP1lyMA==", - "requires": { - "@jest/types": "^26.5.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.5.0", - "jest-util": "^26.5.2", - "jest-worker": "^26.5.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.5.3.tgz", - "integrity": "sha512-nFlZOpnGlNc7y/+UkkeHnvbOM+rLz4wB1AimgI9QhtnqSZte0wYjbAm8hf7TCwXlXgDwZxAXo6z0a2Wzn9FoOg==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.5.2", - "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.5.3", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.5.2", - "jest-matcher-utils": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-runtime": "^26.5.3", - "jest-snapshot": "^26.5.3", - "jest-util": "^26.5.2", - "pretty-format": "^26.5.2", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.5.2.tgz", - "integrity": "sha512-h7ia3dLzBFItmYERaLPEtEKxy3YlcbcRSjj0XRNJgBEyODuu+3DM2o62kvIFvs3PsaYoIIv+e+nLRI61Dj1CNw==", - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.5.2" - } - }, - "jest-matcher-utils": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.5.2.tgz", - "integrity": "sha512-W9GO9KBIC4gIArsNqDUKsLnhivaqf8MSs6ujO/JDcPIQrmY+aasewweXVET8KdrJ6ADQaUne5UzysvF/RR7JYA==", - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.5.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.5.2" - } - }, - "jest-message-util": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.5.2.tgz", - "integrity": "sha512-Ocp9UYZ5Jl15C5PNsoDiGEk14A4NG0zZKknpWdZGoMzJuGAkVt10e97tnEVMYpk7LnQHZOfuK2j/izLBMcuCZw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.5.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - } - }, - "jest-mock": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.5.2.tgz", - "integrity": "sha512-9SiU4b5PtO51v0MtJwVRqeGEroH66Bnwtq4ARdNP7jNXbpT7+ByeWNAk4NeT/uHfNSVDXEXgQo1XRuwEqS6Rdw==", - "requires": { - "@jest/types": "^26.5.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" - }, - "jest-resolve": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.5.2.tgz", - "integrity": "sha512-XsPxojXGRA0CoDD7Vis59ucz2p3cQFU5C+19tz3tLEAlhYKkK77IL0cjYjikY9wXnOaBeEdm1rOgSJjbZWpcZg==", - "requires": { - "@jest/types": "^26.5.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.5.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.5.3.tgz", - "integrity": "sha512-+KMDeke/BFK+mIQ2IYSyBz010h7zQaVt4Xie6cLqUGChorx66vVeQVv4ErNoMwInnyYHi1Ud73tDS01UbXbfLQ==", - "requires": { - "@jest/types": "^26.5.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.5.3" - } - }, - "jest-runner": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.5.3.tgz", - "integrity": "sha512-qproP0Pq7IIule+263W57k2+8kWCszVJTC9TJWGUz0xJBr+gNiniGXlG8rotd0XxwonD5UiJloYoSO5vbUr5FQ==", - "requires": { - "@jest/console": "^26.5.2", - "@jest/environment": "^26.5.2", - "@jest/test-result": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.5.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.5.2", - "jest-leak-detector": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-resolve": "^26.5.2", - "jest-runtime": "^26.5.3", - "jest-util": "^26.5.2", - "jest-worker": "^26.5.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - } - }, - "jest-runtime": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.5.3.tgz", - "integrity": "sha512-IDjalmn2s/Tc4GvUwhPHZ0iaXCdMRq5p6taW9P8RpU+FpG01O3+H8z+p3rDCQ9mbyyyviDgxy/LHPLzrIOKBkQ==", - "requires": { - "@jest/console": "^26.5.2", - "@jest/environment": "^26.5.2", - "@jest/fake-timers": "^26.5.2", - "@jest/globals": "^26.5.3", - "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.5.2", - "@jest/transform": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.5.3", - "jest-haste-map": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-mock": "^26.5.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.5.2", - "jest-snapshot": "^26.5.3", - "jest-util": "^26.5.2", - "jest-validate": "^26.5.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - } - }, - "jest-serializer": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", - "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.5.3.tgz", - "integrity": "sha512-ZgAk0Wm0JJ75WS4lGaeRfa0zIgpL0KD595+XmtwlIEMe8j4FaYHyZhP1LNOO+8fXq7HJ3hll54+sFV9X4+CGVw==", - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.5.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.5.3", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.5.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.5.2", - "jest-matcher-utils": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-resolve": "^26.5.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.5.2", - "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - } - } - }, - "jest-util": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.5.2.tgz", - "integrity": "sha512-WTL675bK+GSSAYgS8z9FWdCT2nccO1yTIplNLPlP0OD8tUk/H5IrWKMMRudIQQ0qp8bb4k+1Qa8CxGKq9qnYdg==", - "requires": { - "@jest/types": "^26.5.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - } - }, - "jest-validate": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.5.3.tgz", - "integrity": "sha512-LX07qKeAtY+lsU0o3IvfDdN5KH9OulEGOMN1sFo6PnEf5/qjS1LZIwNk9blcBeW94pQUI9dLN9FlDYDWI5tyaA==", - "requires": { - "@jest/types": "^26.5.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.5.2" - }, - "dependencies": { - "camelcase": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", - "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==" - } - } - }, - "jest-watcher": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.5.2.tgz", - "integrity": "sha512-i3m1NtWzF+FXfJ3ljLBB/WQEp4uaNhX7QcQUWMokcifFTUQBDFyUMEwk0JkJ1kopHbx7Een3KX0Q7+9koGM/Pw==", - "requires": { - "@jest/test-result": "^26.5.2", - "@jest/types": "^26.5.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.5.2", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", - "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "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", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "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" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", - "optional": true, - "requires": { - "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" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "optional": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "pretty-format": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.5.2.tgz", - "integrity": "sha512-VizyV669eqESlkOikKJI8Ryxl/kPpbdLwNdPs2GrbQs18MpySB5S0Yo0N7zkg2xTRiFq4CFw8ct5Vg4a0xP0og==", - "requires": { - "@jest/types": "^26.5.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.4" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.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" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.30.0.tgz", - "integrity": "sha512-j4K1hUZfgFM03DUpayd3c7kZW+2wDbI6rj7ssQxpCpL1vsGpaM0vSorxBuePFwQDFq9O2DI6AOQbm174Awsq4w==", - "requires": { - "fsevents": "~2.1.2" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@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" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "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" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "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" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "optional": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "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" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "requires": { - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "optional": true - }, - "v8-to-istanbul": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-6.0.1.tgz", - "integrity": "sha512-PzM1WlqquhBvsV+Gco6WSFeg1AGdD53ccMRkFeyHRE/KRZaVacPOmQYP3EeVgDBtKD2BJ8kgynBQ5OtKiHCH+w==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "requires": { - "makeerror": "1.0.x" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "@directus/specs": { - "version": "file:../packages/spec" - }, - "@godaddy/terminus": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@godaddy/terminus/-/terminus-4.4.1.tgz", - "integrity": "sha512-ZPwsG7xN+B2bvnEu6+o0rBPAFbXmm6Bk/RAR4b/nhjNOSJtbVFYTd+JSaJYL/jyESqcTcAyzlWO0dmbT4YsckQ==", - "requires": { - "es6-promisify": "^6.0.2", - "stoppable": "^1.1.0" - } - }, - "@google-cloud/common": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.4.1.tgz", - "integrity": "sha512-e5z0CwsM0RXky+PnyPtQ3QK46ksqm+kE7kX8pm8X+ddBwZJipHchKeazMM5fLlGCS+AALalzXb+uYmH72TRnpQ==", - "requires": { - "@google-cloud/projectify": "^2.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.1", - "duplexify": "^4.1.1", - "ent": "^2.2.0", - "extend": "^3.0.2", - "google-auth-library": "^6.1.1", - "retry-request": "^4.1.1", - "teeny-request": "^7.0.0" - }, - "dependencies": { - "duplexify": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", - "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - } - } - }, - "@google-cloud/paginator": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.5.tgz", - "integrity": "sha512-N4Uk4BT1YuskfRhKXBs0n9Lg2YTROZc6IMpkO/8DIHODtm5s3xY8K5vVBo23v/2XulY3azwITQlYWgT4GdLsUw==", - "requires": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - } - }, - "@google-cloud/projectify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.0.1.tgz", - "integrity": "sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ==" - }, - "@google-cloud/promisify": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.3.tgz", - "integrity": "sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==" - }, - "@google-cloud/storage": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.3.0.tgz", - "integrity": "sha512-3t5UF3SZ14Bw2kcBHubCai6EIugU2GnQOstYWVSFuoO8IJ94RAaIOPq/dtexvQbUTpBTAGpd5smVR9WPL1mJVw==", - "requires": { - "@google-cloud/common": "^3.3.0", - "@google-cloud/paginator": "^3.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.0", - "compressible": "^2.0.12", - "concat-stream": "^2.0.0", - "date-and-time": "^0.14.0", - "duplexify": "^3.5.0", - "extend": "^3.0.2", - "gaxios": "^3.0.0", - "gcs-resumable-upload": "^3.1.0", - "hash-stream-validation": "^0.2.2", - "mime": "^2.2.0", - "mime-types": "^2.0.8", - "onetime": "^5.1.0", - "p-limit": "^3.0.1", - "pumpify": "^2.0.0", - "snakeize": "^0.1.0", - "stream-events": "^1.0.1", - "xdg-basedir": "^4.0.0" - } - }, - "@hapi/address": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz", - "integrity": "sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@hapi/formula": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", - "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==" - }, - "@hapi/hoek": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz", - "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==" - }, - "@hapi/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==" - }, - "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@keyv/redis": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@keyv/redis/-/redis-2.1.2.tgz", - "integrity": "sha512-D6vNOuyH/5cBNfHcyxzck1l7V+Qd4RAT7uz2SHYAjutbXQ03o3SSneRyvrp76H4/uvHyutPWTJ1Za3EpGSVe5g==", - "optional": true, - "requires": { - "ioredis": "~4.17.1" - } - }, - "@otplib/core": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/core/-/core-12.0.1.tgz", - "integrity": "sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==" - }, - "@otplib/plugin-crypto": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/plugin-crypto/-/plugin-crypto-12.0.1.tgz", - "integrity": "sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==", - "requires": { - "@otplib/core": "^12.0.1" - } - }, - "@otplib/plugin-thirty-two": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/plugin-thirty-two/-/plugin-thirty-two-12.0.1.tgz", - "integrity": "sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==", - "requires": { - "@otplib/core": "^12.0.1", - "thirty-two": "^1.0.2" - } - }, - "@otplib/preset-default": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/preset-default/-/preset-default-12.0.1.tgz", - "integrity": "sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==", - "requires": { - "@otplib/core": "^12.0.1", - "@otplib/plugin-crypto": "^12.0.1", - "@otplib/plugin-thirty-two": "^12.0.1" - } - }, - "@otplib/preset-v11": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/preset-v11/-/preset-v11-12.0.1.tgz", - "integrity": "sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==", - "requires": { - "@otplib/core": "^12.0.1", - "@otplib/plugin-crypto": "^12.0.1", - "@otplib/plugin-thirty-two": "^12.0.1" - } - }, - "@phc/format": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@phc/format/-/format-0.5.0.tgz", - "integrity": "sha512-JWtZ5P1bfXU0bAtTzCpOLYHDXuxSVdtL/oqz4+xa97h8w9E5IlVN333wugXVFv8vZ1hbXObKQf1ptXmFFcMByg==", - "requires": { - "safe-buffer": "^5.1.2" - } - }, - "@slynova/flydrive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@slynova/flydrive/-/flydrive-1.0.3.tgz", - "integrity": "sha512-XJ8tfijqfXUuFPwrceCgXr/GqwkO49u4fBYsXZV7lBt9/9HqbdEG2E//R3pOIp2L35zqxrOe3Vk/getnYibjAA==", - "requires": { - "fs-extra": "^9.0.0", - "node-exceptions": "^4.0.1" - } - }, - "@slynova/flydrive-gcs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@slynova/flydrive-gcs/-/flydrive-gcs-1.0.3.tgz", - "integrity": "sha512-EsDfExQtpmeGNrgXdbgk1wEBeCb+f8skoK4Q5xT3l96CFWkmfDC/mkjjWfSjrlkqVWbwq+hwzt+Z9gNaElQ0qA==", - "requires": { - "@google-cloud/storage": "^5.0.0" - } - }, - "@slynova/flydrive-s3": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@slynova/flydrive-s3/-/flydrive-s3-1.0.3.tgz", - "integrity": "sha512-mSLuQ+YqJTlW+64D+bVKQCF0W8FKKAeOkhrWWc7NIE35AWxrI7eLbaOBqe1GHBiy29xRP8v+aHGMIelGsi1bDQ==", - "requires": { - "aws-sdk": "^2.680.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" - }, - "@types/node": { - "version": "12.12.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.64.tgz", - "integrity": "sha512-UV1/ZJMC+HcP902wWdpC43cAcGu0IQk/I5bXjP2aSuCjsk3cE74mDvFrLKga7oDC170ugOAYBwfT4DSQW3akDA==", - "optional": true - }, - "@types/readable-stream": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.9.tgz", - "integrity": "sha512-sqsgQqFT7HmQz/V5jH1O0fvQQnXAJO46Gg9LRO/JPfjmVmGUlcx831TZZO3Y3HtWhIkzf3kTsNT0Z0kzIhIvZw==", - "optional": true, - "requires": { - "@types/node": "*", - "safe-buffer": "*" - } - }, - "@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true - }, - "@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true - }, - "@types/tunnel": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.0.tgz", - "integrity": "sha512-FGDp0iBRiBdPjOgjJmn1NH0KDLN+Z8fRmo+9J7XGBhubq1DPrGrbmG4UTlGzrpbCpesMqD0sWkzi27EYkOMHyg==", - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "adal-node": { - "version": "0.1.28", - "resolved": "https://registry.npmjs.org/adal-node/-/adal-node-0.1.28.tgz", - "integrity": "sha1-RoxLs+u9lrEnBmn0ucuk4AZepIU=", - "optional": true, - "requires": { - "@types/node": "^8.0.47", - "async": ">=0.6.0", - "date-utils": "*", - "jws": "3.x.x", - "request": ">= 2.52.0", - "underscore": ">= 1.3.1", - "uuid": "^3.1.0", - "xmldom": ">= 0.1.x", - "xpath.js": "~1.1.0" - }, - "dependencies": { - "@types/node": { - "version": "8.10.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.64.tgz", - "integrity": "sha512-/EwBIb+imu8Qi/A3NF9sJ9iuKo7yV+pryqjmeRqaU0C4wBAOhas5mdvoYeJ5PCKrh6thRSJHdoasFqh3BQGILA==", - "optional": true - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "optional": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "optional": true, - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "optional": true - } - } - }, - "agent-base": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", - "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argon2": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.26.2.tgz", - "integrity": "sha512-Tk9I/r3KIHCIHU5x2UawKsPi+g7MByAYnUZghXztQDXRp/997P31wa4qvdvokTaFBpsu6jOZACd+2qkBGGssRA==", - "requires": { - "@phc/format": "^0.5.0", - "node-addon-api": "^2.0.0", - "node-pre-gyp": "^0.14.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "optional": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "optional": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "optional": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "optional": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "optional": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" - }, - "aws-sdk": { - "version": "2.770.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.770.0.tgz", - "integrity": "sha512-CUkyXwFxEJ32AxH2tjBFfG4grjFdyDjyBaltYzaLa0U2KvGgDIj28q8psdxhALTm3c9zPEoMYpRXiTyRNmkROQ==", - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "optional": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "optional": true - }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "requires": { - "follow-redirects": "1.5.10" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "bl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", - "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==", - "optional": true, - "requires": { - "readable-stream": "^3.0.1" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "optional": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "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" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "optional": true - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "optional": true - }, - "busboy": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", - "requires": { - "dicer": "0.3.0" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "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" - } - }, - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "optional": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", - "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==" - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "cluster-key-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", - "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "codecov": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.0.tgz", - "integrity": "sha512-7E/S7hmq2CJvCMBMu+aRACO9jxQX1HJug/M3ub8+t84R+5Ai2T5sFMxS3W8P41m2A63+VSAAL4U0aBlqZXkJPw==", - "optional": true, - "requires": { - "argv": "0.0.2", - "ignore-walk": "3.0.3", - "js-yaml": "3.14.0", - "teeny-request": "7.0.1", - "urlgrey": "0.4.4" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "connection-parse": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/connection-parse/-/connection-parse-0.0.7.tgz", - "integrity": "sha1-GOcxiqsGppkmc3KxDFIm0locmmk=", - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", - "requires": { - "cookie": "0.4.0", - "cookie-signature": "1.0.6" - } - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copyfiles": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.0.tgz", - "integrity": "sha512-yGjpR3yjQdxccW8EcJ4a7ZCA6wGER6/Q2Y+b7bXbVxGeSHBf93i9d7MzTsx+VV1CpMKQa3v4ThZfXBcltMzl0w==", - "dev": true, - "requires": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "untildify": "^4.0.0", - "yargs": "^15.3.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cross-env": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", - "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-and-time": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.1.tgz", - "integrity": "sha512-M4RggEH5OF2ZuCOxgOU67R6Z9ohjKbxGvAQz48vj53wLmL0bAgumkBvycR32f30pK+Og9pIR+RFDyChbaE4oLA==" - }, - "date-fns": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz", - "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==" - }, - "date-utils": { - "version": "1.2.21", - "resolved": "https://registry.npmjs.org/date-utils/-/date-utils-1.2.21.tgz", - "integrity": "sha1-YfsWzcEnSzyayq/+n8ad+HIKK2Q=", - "optional": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "^1.0.2" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denque": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", - "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==", - "optional": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", - "requires": { - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", - "dev": true, - "requires": { - "xtend": "^4.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "optional": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - }, - "es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "eventemitter2": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", - "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "exif-reader": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/exif-reader/-/exif-reader-1.0.3.tgz", - "integrity": "sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA==" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "express-async-handler": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.1.4.tgz", - "integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ==" - }, - "express-graphql": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.11.0.tgz", - "integrity": "sha512-IMYmF2aIBKKfo8c+EENBNR8FAy91QHboxfaHe1omCyb49GJXsToUgcjjIF/PfWJdzn0Ofp6JJvcsODQJrqpz2g==", - "requires": { - "accepts": "^1.3.7", - "content-type": "^1.0.4", - "http-errors": "1.8.0", - "raw-body": "^2.4.1" - }, - "dependencies": { - "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - } - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - } - } - }, - "express-pino-logger": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/express-pino-logger/-/express-pino-logger-5.0.0.tgz", - "integrity": "sha512-pwbZ2E712evTuJfU/+svG/xdXMiS5Awjbnbg382ikQfgb/5bLwF1Auzv8QXVv/x+GixUlzfPbYTgVLhacvocKw==", - "requires": { - "pino-http": "^5.1.0" - } - }, - "express-session": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz", - "integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==", - "requires": { - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.2.0", - "uid-safe": "~2.1.5" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "optional": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "optional": true - }, - "fast-json-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", - "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "optional": true - }, - "fast-redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.0.tgz", - "integrity": "sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w==" - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "fast-text-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", - "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" - }, - "fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", - "requires": { - "punycode": "^1.3.2" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" - }, - "flatstr": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", - "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "optional": true - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaxios": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz", - "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==", - "requires": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" - } - }, - "gcp-metadata": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.0.tgz", - "integrity": "sha512-vQZD57cQkqIA6YPGXM/zc+PIZfNRFdukWGsGZ5+LcJzesi5xp6Gn7a02wRJi4eXPyArNMIYpPET4QMxGqtlk6Q==", - "requires": { - "gaxios": "^3.0.0", - "json-bigint": "^1.0.0" - } - }, - "gcs-resumable-upload": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.1.tgz", - "integrity": "sha512-RS1osvAicj9+MjCc6jAcVL1Pt3tg7NK2C2gXM5nqD1Gs0klF2kj5nnAFSBy97JrtslMIQzpb7iSuxaG8rFWd2A==", - "requires": { - "abort-controller": "^3.0.0", - "configstore": "^5.0.0", - "extend": "^3.0.2", - "gaxios": "^3.0.0", - "google-auth-library": "^6.0.0", - "pumpify": "^2.0.0", - "stream-events": "^1.0.4" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getopts": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", - "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "google-auth-library": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.1.tgz", - "integrity": "sha512-0WfExOx3FrLYnY88RICQxvpaNzdwjz44OsHqHkIoAJfjY6Jck6CZRl1ASWadk+wbJ0LhkQ8rNY4zZebKml4Ghg==", - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^3.0.0", - "gcp-metadata": "^4.1.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - } - }, - "google-p12-pem": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", - "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", - "requires": { - "node-forge": "^0.10.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "grant": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/grant/-/grant-5.4.4.tgz", - "integrity": "sha512-kfcx5bTpo5VmS/TU8JLFiBCBUjwz7E0071+7yJJ0UbSnNUUfuCCDwYq+V8fVnDnV0vf8rpKMCOkw7KruZHYKhQ==", - "requires": { - "cookie": "^0.4.1", - "cookie-signature": "^1.1.0", - "jwk-to-pem": "^2.0.3", - "jws": "^4.0.0", - "qs": "^6.9.4", - "request-compose": "^2.1.0", - "request-oauth": "^1.0.0" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "optional": true - }, - "cookie-signature": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz", - "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==", - "optional": true - }, - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" - } - } - }, - "graphql": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.3.0.tgz", - "integrity": "sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w==" - }, - "gtoken": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.4.tgz", - "integrity": "sha512-U9wnSp4GZ7ov6zRdPuRHG4TuqEWqRRgT1gfXGNArhzBUn9byrPeH8uTmBWU/ZiWJJvTEmkjhDIC3mqHWdVi3xQ==", - "requires": { - "gaxios": "^3.0.0", - "google-p12-pem": "^3.0.3", - "jws": "^4.0.0", - "mime": "^2.2.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "optional": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "optional": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-stream-validation": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", - "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==" - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "optional": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hashring": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", - "integrity": "sha1-/aTv3oqiLNuX+x0qZeiEAeHBRM4=", - "optional": true, - "requires": { - "connection-parse": "0.0.x", - "simple-lru-cache": "0.0.x" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "optional": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "icc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/icc/-/icc-2.0.0.tgz", - "integrity": "sha512-VSTak7UAcZu1E24YFvcoHVpVg/ZUVyb0G1v0wUIibfz5mHvcFeI/Gpn8C0cAUKw5jCCGx5JBcV4gULu6hX97mA==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "requires": { - "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" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" - }, - "ioredis": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.17.3.tgz", - "integrity": "sha512-iRvq4BOYzNFkDnSyhx7cmJNOi1x/HWYe+A4VXHBu4qpwJaGT1Mp+D2bVGJntH9K/Z/GeOM/Nprb8gB3bmitz1Q==", - "optional": true, - "requires": { - "cluster-key-slot": "^1.1.0", - "debug": "^4.1.1", - "denque": "^1.1.0", - "lodash.defaults": "^4.2.0", - "lodash.flatten": "^4.4.0", - "redis-commands": "1.5.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.0.1" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "optional": true - }, - "jackpot": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/jackpot/-/jackpot-0.0.6.tgz", - "integrity": "sha1-PP8GQoXL9m9OqyWTyQvOgWqCGEk=", - "optional": true, - "requires": { - "retry": "0.6.0" - } - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "joi": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.2.1.tgz", - "integrity": "sha512-YT3/4Ln+5YRpacdmfEfrrKh50/kkgX3LgBltjqnlMPIYiZ4hxXZuVJcxmsvxsdeHg9soZfE3qXxHC2tMpCCBOA==", - "requires": { - "@hapi/address": "^4.1.0", - "@hapi/formula": "^2.0.0", - "@hapi/hoek": "^9.0.0", - "@hapi/pinpoint": "^2.0.0", - "@hapi/topo": "^5.0.0" - } - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbi": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.4.tgz", - "integrity": "sha512-52QRRFSsi9impURE8ZUbzAMCLjPm4THO7H2fcuIvaaeFTbSysvkodbQQXIVsNgq/ypDbq6dJiuGKL0vZ/i9hUg==", - "optional": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "optional": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "optional": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "optional": true - }, - "json2csv": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.3.tgz", - "integrity": "sha512-e3gEZU/4fp8CVQMHlwT77RayAR7nylCzCYN7jTIbPTEqk0oTaE8GTcBudLgXrHt4ltOs9SAsbveMJT0YK/QUSg==", - "requires": { - "commander": "^6.1.0", - "jsonparse": "^1.3.1", - "lodash.get": "^4.4.2" - }, - "dependencies": { - "commander": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", - "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==" - } - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jwk-to-pem": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.4.tgz", - "integrity": "sha512-4CCK9UBHNWjWtfSHdyu3I6rA8vlN5cWqnVuwY0cOMyXtw6M1tP+yrM8GZpwk+P932Dc3cLag4d35B6CqyIf89A==", - "optional": true, - "requires": { - "asn1.js": "^5.3.0", - "elliptic": "^6.5.3", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "keyv": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", - "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "keyv-memcache": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/keyv-memcache/-/keyv-memcache-0.8.0.tgz", - "integrity": "sha512-303ARXs6vv7v8Z12L9LK58dq8oc1TGcpeOt+CLbh0V1JCQkXLxuqt89F9Owgm3W+K3EqPTrn4NOI0f92vrsFUA==", - "optional": true, - "requires": { - "codecov": "^3.5.0", - "json-buffer": "^3.0.1", - "memjs": "^1.2.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "knex": { - "version": "0.21.6", - "resolved": "https://registry.npmjs.org/knex/-/knex-0.21.6.tgz", - "integrity": "sha512-gFB2q4MamYCEqzCPNgK7DMcyyAxoHhhSDnPsNDJo50Gor5ibI2n5bNRW768IG5S06k6nE3Gik5/kcoTmbsYbZw==", - "requires": { - "colorette": "1.2.1", - "commander": "^5.1.0", - "debug": "4.1.1", - "esm": "^3.2.25", - "getopts": "2.2.5", - "inherits": "~2.0.4", - "interpret": "^2.2.0", - "liftoff": "3.1.0", - "lodash": "^4.17.20", - "mkdirp": "^1.0.4", - "pg-connection-string": "2.3.0", - "tarn": "^3.0.0", - "tildify": "2.0.0", - "uuid": "^7.0.3", - "v8flags": "^3.2.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "pg-connection-string": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.3.0.tgz", - "integrity": "sha512-ukMTJXLI7/hZIwTW7hGMZJ0Lj0S2XQBCJ4Shv4y1zgQ/vqVea+FLhzywvPj0ujSuofu+yA4MYHGZPTsgjBgJ+w==" - }, - "uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==" - } - } - }, - "knex-schema-inspector": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/knex-schema-inspector/-/knex-schema-inspector-0.0.21.tgz", - "integrity": "sha512-hroob7VPZM65ZoYCHrSNBPWFtkJTWa7D1CsqTZiptwenPhYZoNwWxbrUX96W8oZG6bY5xUQ+nyFQv0MdNOjWgA==", - "requires": { - "lodash.flatten": "^4.4.0" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "liquidjs": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-9.16.0.tgz", - "integrity": "sha512-vv8Dcg0/YLjKvVfsv2JEfVa7cRJ9TkCakiu5IDrn8lEGJRyzuXQqEJCnPJuN/emXyNxaZJ9yXJjqoKNC2UJ5VQ==" - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "optional": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memcached": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/memcached/-/memcached-2.2.2.tgz", - "integrity": "sha1-aPhsz9hLz5PMJe1G1tf8DHUhydU=", - "optional": true, - "requires": { - "hashring": "3.2.x", - "jackpot": ">=0.0.6" - } - }, - "memjs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/memjs/-/memjs-1.2.2.tgz", - "integrity": "sha512-j6I5cQsjT8izm0FcBZrwga4VmlhTMsBTPKdyKolQenLulHNvKuNcDgDmBhQvScqNLy4tjpCCFwiqFK+5l6J20g==", - "optional": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "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" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - }, - "dependencies": { - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - } - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "optional": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "mssql": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mssql/-/mssql-6.2.3.tgz", - "integrity": "sha512-4TW/fA9UgzmVTNgjl65r6ISr6aL5QHnlptEt1A3jIpdzkNbFPIkRbUNz90324HIdE+5pKc3VqikOImcTrhd4og==", - "optional": true, - "requires": { - "debug": "^4", - "tarn": "^1.1.5", - "tedious": "^6.6.2" - }, - "dependencies": { - "tarn": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-1.1.5.tgz", - "integrity": "sha512-PMtJ3HCLAZeedWjJPgGnCvcphbCOMbtZpjKgLq3qM5Qq9aQud+XHrL0WlrlgnTyS8U+jrjGbEXprFcQrxPy52g==", - "optional": true - } - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "mysql": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", - "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", - "optional": true, - "requires": { - "bignumber.js": "9.0.0", - "readable-stream": "2.3.7", - "safe-buffer": "5.1.2", - "sqlstring": "2.3.1" - }, - "dependencies": { - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", - "optional": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "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" - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "native-duplexpair": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", - "integrity": "sha1-eJkHjmS/PIo9cyYBs9QP8F21j6A=", - "optional": true - }, - "needle": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", - "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "node-abi": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.1.tgz", - "integrity": "sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A==", - "requires": { - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node-exceptions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/node-exceptions/-/node-exceptions-4.0.1.tgz", - "integrity": "sha512-KJI+FawYOv74x60H6+zrBPfO2vvp9m0pHZi6SH8BBBuc67Irv11DsqY4Le4EBFq1/T5aXFU3hkLrMgtW7RNXxA==" - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "optional": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "optional": true, - "requires": { - "abbrev": "1" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "optional": true - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-machine-id": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", - "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==" - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "nodemailer": { - "version": "6.4.13", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.13.tgz", - "integrity": "sha512-XmtiiKza2Cqtr+ZRMchMZn9s2nmwQDeakbf+yL0ODsIXOv58UZgk/MKPOkDKqY+mvxHs87PrJK7Nf/tcpKHqYQ==" - }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "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": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "openapi3-ts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-2.0.0.tgz", - "integrity": "sha512-q4p8OX/mD7qXeDKkhdLhpEz1Zh/IxPBDWmuq7f07fQJpo7exUW20sMrHfws1xzihYPktTXVV5MDOZkG/1uguEg==", - "requires": { - "yaml": "^1.10.0" - } - }, - "ora": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", - "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", - "requires": { - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.2.0", - "is-interactive": "^1.0.0", - "log-symbols": "^3.0.0", - "mute-stream": "0.0.8", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "oracledb": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/oracledb/-/oracledb-5.0.0.tgz", - "integrity": "sha512-NLE3t6KiAkpBHA1/zgjNiKaa9Z4Nnp4PuB3d0b3Kz4C8klrIrMKfHIGUySlwqgDW588m7/2hnPxU7PH6wjBd6g==", - "optional": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "otplib": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/otplib/-/otplib-12.0.1.tgz", - "integrity": "sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==", - "requires": { - "@otplib/core": "^12.0.1", - "@otplib/preset-default": "^12.0.1", - "@otplib/preset-v11": "^12.0.1" - } - }, - "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", - "optional": true - }, - "pad-left": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", - "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", - "requires": { - "repeat-string": "^1.5.4" - } - }, - "pad-right": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", - "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", - "requires": { - "repeat-string": "^1.5.2" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "optional": true - }, - "pg": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.4.1.tgz", - "integrity": "sha512-NRsH0aGMXmX1z8Dd0iaPCxWUw4ffu+lIAmGm+sTCwuDDWkpEgRCAHZYDwqaNhC5hG5DRMOjSUFasMWhvcmLN1A==", - "optional": true, - "requires": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.4.0", - "pg-pool": "^3.2.1", - "pg-protocol": "^1.3.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - } - }, - "pg-connection-string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.4.0.tgz", - "integrity": "sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ==", - "optional": true - }, - "pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "optional": true - }, - "pg-pool": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.1.tgz", - "integrity": "sha512-BQDPWUeKenVrMMDN9opfns/kZo4lxmSWhIqo+cSAF7+lfi9ZclQbr9vfnlNaPr8wYF3UYjm5X0yPAhbcgqNOdA==", - "optional": true - }, - "pg-protocol": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.3.0.tgz", - "integrity": "sha512-64/bYByMrhWULUaCd+6/72c9PMWhiVFs3EVxl9Ct6a3v/U8+rKgqP2w+kKg/BIGgMJyB+Bk/eNivT32Al+Jghw==", - "optional": true - }, - "pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "optional": true, - "requires": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - } - }, - "pgpass": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", - "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", - "optional": true, - "requires": { - "split": "^1.0.0" - } - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pino": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.7.0.tgz", - "integrity": "sha512-vPXJ4P9rWCwzlTJt+f0Ni4THc3DWyt8iDDCO4edQ8narTu6hnpzdXu8FqeSJCGndl1W6lfbYQUQihUO54y66Lw==", - "requires": { - "fast-redact": "^3.0.0", - "fast-safe-stringify": "^2.0.7", - "flatstr": "^1.0.12", - "pino-std-serializers": "^2.4.2", - "quick-format-unescaped": "^4.0.1", - "sonic-boom": "^1.0.2" - } - }, - "pino-colada": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pino-colada/-/pino-colada-2.1.0.tgz", - "integrity": "sha512-OmYNALP/LDnyQbFya8Pc1DHT7XW3Wh/CpMDHGWoDiRGcSn4tTM/PQUBqSILSNPlUcWFvh9AxRpdHZln5kQSNhw==", - "requires": { - "chalk": "^3.0.0", - "fast-json-parse": "^1.0.2", - "pad-left": "^2.1.0", - "pad-right": "^0.2.2", - "prettier-bytes": "^1.0.3", - "pretty-ms": "^5.0.0", - "split2": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "pino-http": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-5.3.0.tgz", - "integrity": "sha512-aV4e7L8ez2MCa1qsuuliKYX5CDJug3LjW8oht+r4H4+fcf7ZvxPOppTs7P9dNHccF8k8oqhOcU/myiP4GvzJiA==", - "requires": { - "fast-url-parser": "^1.1.3", - "pino": "^6.0.0", - "pino-std-serializers": "^2.4.0" - } - }, - "pino-std-serializers": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz", - "integrity": "sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg==" - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "optional": true - }, - "postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=", - "optional": true - }, - "postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "optional": true - }, - "postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "optional": true, - "requires": { - "xtend": "^4.0.0" - } - }, - "prebuild-install": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.5.tgz", - "integrity": "sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - } - } - }, - "prettier-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prettier-bytes/-/prettier-bytes-1.0.4.tgz", - "integrity": "sha1-mUsCqkb2mcULYle1+qp/4lV+YtY=" - }, - "pretty-ms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-5.1.0.tgz", - "integrity": "sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==", - "requires": { - "parse-ms": "^2.1.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "optional": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", - "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", - "requires": { - "duplexify": "^4.1.1", - "inherits": "^2.0.3", - "pump": "^3.0.0" - }, - "dependencies": { - "duplexify": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", - "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - } - } - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "quick-format-unescaped": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz", - "integrity": "sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==" - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "rate-limiter-flexible": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.1.10.tgz", - "integrity": "sha512-Pa+8TPD4xYaiCUB5K4a/+j2FHDUe4HP1g49JmKEmkOkhqPaeVqxJsZuuVaza/svSCOT+V73vtsyBiSFK/e1yXw==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "redis-commands": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz", - "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==", - "optional": true - }, - "redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", - "optional": true - }, - "redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "optional": true, - "requires": { - "redis-errors": "^1.0.0" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "optional": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.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" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "optional": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "optional": true - } - } - }, - "request-compose": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/request-compose/-/request-compose-2.1.0.tgz", - "integrity": "sha512-mIWvU9HA2whb/fHcqeQ0LQXAImCGISqUPyjuFF2rALhym2Fu4ebZGv7wxFA78rsJO/fn2OeEaK54TSjwSwRAFw==" - }, - "request-oauth": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/request-oauth/-/request-oauth-1.0.0.tgz", - "integrity": "sha512-wsDzIq1Qu2itLDlcpFph8xh5Q+FVyUj4os5zdQTlZL/JvZYF/qOyaawVPsxxhDG4QwCB3tzSFprj6dkjqR+e8w==", - "requires": { - "oauth-sign": "^0.9.0", - "qs": "^6.9.3", - "uuid": "^3.4.0" - }, - "dependencies": { - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retry": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz", - "integrity": "sha1-HAEHEyeab9Ho3vKK8MP/GHHKpTc=", - "optional": true - }, - "retry-request": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz", - "integrity": "sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==", - "requires": { - "debug": "^4.1.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sharp": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.25.4.tgz", - "integrity": "sha512-umSzJJ1oBwIOfwFFt/fJ7JgCva9FvrEU2cbbm7u/3hSDZhXvkME8WE5qpaJqLIe2Har5msF5UG4CzYlEg5o3BQ==", - "requires": { - "color": "^3.1.2", - "detect-libc": "^1.0.3", - "node-addon-api": "^3.0.0", - "npmlog": "^4.1.2", - "prebuild-install": "^5.3.4", - "semver": "^7.3.2", - "simple-get": "^4.0.0", - "tar": "^6.0.2", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "node-addon-api": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", - "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==" - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - }, - "tar": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", - "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", - "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "simple-lru-cache": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", - "integrity": "sha1-1ZzDoZPBpdAyD4Tucy9uRxPlEd0=", - "optional": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "snakeize": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", - "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sonic-boom": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.3.0.tgz", - "integrity": "sha512-4nX6OYvOYr6R76xfQKi6cZpTO3YSWe/vd+QdIfoH0lBy0MnPkeAbb2rRWgmgADkXUeCKPwO1FZAKlAVWAadELw==", - "requires": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "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" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "optional": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "requires": { - "readable-stream": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sqlite3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.0.tgz", - "integrity": "sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw==", - "optional": true, - "requires": { - "node-addon-api": "2.0.0", - "node-gyp": "3.x", - "node-pre-gyp": "^0.11.0" - }, - "dependencies": { - "node-addon-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", - "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==", - "optional": true - }, - "node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true - } - } - }, - "sqlstring": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", - "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=", - "optional": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "standard-as-callback": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.0.1.tgz", - "integrity": "sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg==", - "optional": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" - }, - "stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "requires": { - "stubs": "^3.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "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" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "tar-fs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", - "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", - "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - } - } - }, - "tarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.0.tgz", - "integrity": "sha512-PKUnlDFODZueoA8owLehl8vLcgtA8u4dRuVbZc92tspDYZixjJL6TqYOmryf/PfP/EBX+2rgNcrj96NO+RPkdQ==" - }, - "tedious": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-6.7.0.tgz", - "integrity": "sha512-8qr7+sB0h4SZVQBRWUgHmYuOEflAOl2eihvxk0fVNvpvGJV4V5UC/YmSvebyfgyfwWcPO22/AnSbYVZZqf9wuQ==", - "optional": true, - "requires": { - "@azure/ms-rest-nodeauth": "2.0.2", - "@types/node": "^12.12.17", - "@types/readable-stream": "^2.3.5", - "bl": "^3.0.0", - "depd": "^2.0.0", - "iconv-lite": "^0.5.0", - "jsbi": "^3.1.1", - "native-duplexpair": "^1.0.0", - "punycode": "^2.1.0", - "readable-stream": "^3.4.0", - "sprintf-js": "^1.1.2" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "optional": true - }, - "iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "optional": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "optional": true - } - } - }, - "teeny-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.1.tgz", - "integrity": "sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw==", - "requires": { - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^8.0.0" - } - }, - "thirty-two": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", - "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "optional": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "optional": true - } - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - } - }, - "ts-node-dev": { - "version": "1.0.0-pre.64", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.0.0-pre.64.tgz", - "integrity": "sha512-HpckomPHUdEd221c47HsrXjXKckmEAU8U6y7jkaLnZiCqY13loP/Qq0iRd9eIE64LlBQTVURXRwSwQLTzg6U2g==", - "dev": true, - "requires": { - "chokidar": "^3.4.0", - "dateformat": "~1.0.4-1.2.3", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^8.10.2", - "tsconfig": "^7.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "requires": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.0.tgz", - "integrity": "sha512-+Zw5lu0D9tvBMjGP8LpvMb0u2WW2QV3y+D8mO6J+cNzCYIN4sVy43Bf9vl92nqFahutN0I8zHa7cc4vihIshnw==" - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "optional": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", - "dev": true - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "requires": { - "random-bytes": "~1.0.0" - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, - "underscore": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz", - "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==", - "optional": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "optional": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "optional": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", - "optional": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" - }, - "uuid-validate": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uuid-validate/-/uuid-validate-0.0.3.tgz", - "integrity": "sha512-Fykw5U4eZESbq739BeLvEBFRuJODfrlmjx5eJux7W817LjRaq4b7/i4t2zxQmhcX+fAj4nMfRdTzO4tmwLKn0w==" - }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xmldom": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", - "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==", - "optional": true - }, - "xpath.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", - "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==", - "optional": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/api/package.json b/api/package.json index 1e030e12c2..941ee6f9d4 100644 --- a/api/package.json +++ b/api/package.json @@ -1,8 +1,8 @@ { "name": "directus", - "version": "9.0.0-rc.2", + "version": "9.0.0-rc.23", "license": "GPL-3.0-only", - "homepage": "https://github.com/directus/next#readme", + "homepage": "https://github.com/directus/directus#readme", "description": "Directus is a real-time API and App dashboard for managing SQL database content.", "keywords": [ "directus", @@ -24,10 +24,10 @@ ], "repository": { "type": "git", - "url": "git+https://github.com/directus/next.git" + "url": "git+https://github.com/directus/directus.git" }, "bugs": { - "url": "https://github.com/directus/next/issues" + "url": "https://github.com/directus/directus/issues" }, "author": { "name": "Monospace Inc", @@ -46,16 +46,18 @@ "url": "https://github.com/benhaynes" } ], - "main": "dist/app.js", + "main": "index.js", "bin": { "directus": "cli.js" }, "scripts": { "start": "npx directus start", - "build": "rm -rf dist && tsc --build && copyfiles \"src/**/*.*\" -e \"src/**/*.ts\" -u 1 dist", - "dev": "cross-env NODE_ENV=development LOG_LEVEL=trace ts-node-dev --files src/start.ts --respawn --watch \"src/**/*.ts\" --transpile-only", + "build": "rimraf dist && tsc --build && copyfiles \"src/**/*.*\" -e \"src/**/*.ts\" -u 1 dist", + "dev": "cross-env NODE_ENV=development ts-node-dev --files src/start.ts --respawn --watch \"src/**/*.ts\" --watch \".env\" --transpile-only", "cli": "cross-env NODE_ENV=development ts-node --script-mode --transpile-only src/cli/index.ts", - "prepublishOnly": "npm run build" + "lint": "eslint \"src/**/*.ts\" cli.js index.js", + "prepublishOnly": "npm run build", + "prettier": "prettier --write \"src/**/*.ts\" cli.js index.js" }, "files": [ "dist", @@ -66,25 +68,27 @@ "dependencies": { "@directus/app": "file:../app", "@directus/format-title": "file:../packages/format-title", - "@directus/specs": "file:../packages/spec", + "@directus/schema": "file:../packages/schema", + "@directus/specs": "file:../packages/specs", "@godaddy/terminus": "^4.4.1", - "@slynova/flydrive": "^1.0.2", - "@slynova/flydrive-gcs": "^1.0.2", - "@slynova/flydrive-s3": "^1.0.2", - "argon2": "^0.26.2", + "@slynova/flydrive": "^1.0.3", + "@slynova/flydrive-gcs": "^1.0.3", + "@slynova/flydrive-s3": "^1.0.3", + "argon2": "^0.27.0", "atob": "^2.1.2", - "axios": "^0.19.2", + "axios": "^0.21.0", "body-parser": "^1.19.0", "busboy": "^0.3.1", - "camelcase": "^6.0.0", + "camelcase": "^6.2.0", "chalk": "^4.1.0", - "commander": "^5.1.0", + "commander": "^6.2.0", "cookie-parser": "^1.4.5", "cors": "^2.8.5", "date-fns": "^2.16.1", + "deep-map": "^2.0.0", "dotenv": "^8.2.0", "eventemitter2": "^6.4.3", - "execa": "^4.0.3", + "execa": "^4.1.0", "exif-reader": "^1.0.3", "express": "^4.17.1", "express-async-handler": "^1.1.4", @@ -92,53 +96,59 @@ "express-pino-logger": "^5.0.0", "express-session": "^1.17.1", "fs-extra": "^9.0.1", - "grant": "^5.3.0", - "graphql": "^15.3.0", + "grant": "^5.4.5", + "graphql": "^15.4.0", + "graphql-type-json": "^0.3.2", "icc": "^2.0.0", "inquirer": "^7.3.3", - "joi": "^17.1.1", + "joi": "^17.3.0", "js-yaml": "^3.14.0", - "json2csv": "^5.0.1", + "json2csv": "^5.0.3", "jsonwebtoken": "^8.5.1", - "keyv": "^4.0.1", - "knex": "^0.21.4", - "knex-schema-inspector": "^0.0.21", - "liquidjs": "^9.14.1", - "lodash": "^4.17.19", + "keyv": "^4.0.3", + "knex": "^0.21.12", + "liquidjs": "^9.16.1", + "lodash": "^4.17.20", "macos-release": "^2.4.1", "mime-types": "^2.1.27", "ms": "^2.1.2", - "nanoid": "^3.1.12", + "nanoid": "^3.1.16", "node-machine-id": "^1.1.12", - "nodemailer": "^6.4.11", + "nodemailer": "^6.4.14", "openapi3-ts": "^2.0.0", - "ora": "^4.1.1", + "ora": "^5.1.0", "otplib": "^12.0.1", - "pino": "^6.4.1", + "pino": "^6.7.0", "pino-colada": "^2.1.0", "qs": "^6.9.4", - "rate-limiter-flexible": "^2.1.10", + "rate-limiter-flexible": "^2.1.13", "resolve-cwd": "^3.0.0", - "sharp": "^0.25.4", - "uuid": "^8.3.0", + "sharp": "^0.26.2", + "uuid": "^8.3.1", "uuid-validate": "0.0.3" }, "optionalDependencies": { "@keyv/redis": "^2.1.2", - "ioredis": "^4.17.3", - "keyv-memcache": "^0.8.0", + "ioredis": "^4.19.2", + "keyv-memcache": "^1.0.1", "memcached": "^2.2.2", - "mssql": "^6.2.0", + "mssql": "^6.2.3", "mysql": "^2.18.1", "oracledb": "^5.0.0", - "pg": "^8.4.1", + "pg": "^8.4.2", "sqlite3": "^5.0.0" }, "gitHead": "4476da28dbbc2824e680137aa28b2b91b5afabec", "devDependencies": { + "@typescript-eslint/eslint-plugin": "^4.9.1", + "@typescript-eslint/parser": "^4.9.1", "copyfiles": "^2.4.0", "cross-env": "^7.0.2", - "ts-node-dev": "^1.0.0-pre.64", - "typescript": "^4.0.3" + "eslint": "^7.15.0", + "eslint-config-prettier": "^7.0.0", + "eslint-plugin-prettier": "^3.2.0", + "prettier": "^2.2.1", + "ts-node-dev": "^1.0.0", + "typescript": "^4.0.5" } } diff --git a/api/src/app.ts b/api/src/app.ts index 0a0d986f5a..9a51a1f274 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -4,6 +4,8 @@ import logger from './logger'; import expressLogger from 'express-pino-logger'; import path from 'path'; +import { validateDBConnection, isInstalled } from './database'; + import { validateEnv } from './utils/validate-env'; import env from './env'; import { track } from './utils/track'; @@ -34,19 +36,29 @@ import usersRouter from './controllers/users'; import utilsRouter from './controllers/utils'; import webhooksRouter from './controllers/webhooks'; import graphqlRouter from './controllers/graphql'; +import schema from './middleware/schema'; import notFoundHandler from './controllers/not-found'; import sanitizeQuery from './middleware/sanitize-query'; import { checkIP } from './middleware/check-ip'; -import { WebhooksService } from './services/webhooks'; import { InvalidPayloadException } from './exceptions'; import { registerExtensions } from './extensions'; +import { register as registerWebhooks } from './webhooks'; import emitter from './emitter'; +import fse from 'fs-extra'; + export default async function createApp() { validateEnv(['KEY', 'SECRET']); + await validateDBConnection(); + + if ((await isInstalled()) === false) { + logger.fatal(`Database doesn't have Directus tables installed.`); + process.exit(1); + } + const app = express(); const customRouter = express.Router(); @@ -80,11 +92,18 @@ export default async function createApp() { if (env.NODE_ENV !== 'development') { const adminPath = require.resolve('@directus/app/dist/index.html'); + const publicUrl = env.PUBLIC_URL.endsWith('/') ? env.PUBLIC_URL : env.PUBLIC_URL + '/'; - app.get('/', (req, res) => res.redirect('/admin/')); + // Prefix all href/src in the index html with the APIs public path + let html = fse.readFileSync(adminPath, 'utf-8'); + html = html.replace(/href="\//g, `href="${publicUrl}`); + html = html.replace(/src="\//g, `src="${publicUrl}`); + + app.get('/', (req, res) => res.redirect(`./admin/`)); + app.get('/admin', (req, res) => res.send(html)); app.use('/admin', express.static(path.join(adminPath, '..'))); app.use('/admin/*', (req, res) => { - res.sendFile(adminPath); + res.send(html); }); } @@ -93,16 +112,18 @@ export default async function createApp() { app.use(rateLimiter); } - app.use(sanitizeQuery); - - app.use('/auth', authRouter); - app.use(authenticate); app.use(checkIP); + app.use(sanitizeQuery); + app.use(cache); + app.use(schema); + + app.use('/auth', authRouter); + app.use('/graphql', graphqlRouter); app.use('/activity', activityRouter); @@ -128,8 +149,7 @@ export default async function createApp() { app.use(errorHandler); // Register all webhooks - const webhooksService = new WebhooksService(); - await webhooksService.register(); + await registerWebhooks(); // Register custom hooks / endpoints await registerExtensions(customRouter); diff --git a/api/src/cache.ts b/api/src/cache.ts index 3bcc494dc2..52977ff95f 100644 --- a/api/src/cache.ts +++ b/api/src/cache.ts @@ -9,13 +9,13 @@ let cache: Keyv | null = null; if (env.CACHE_ENABLED === true) { validateEnv(['CACHE_NAMESPACE', 'CACHE_TTL', 'CACHE_STORE']); - cache = getKevyInstance(); - cache.on('error', logger.error); + cache = getKeyvInstance(); + cache.on('error', (err) => logger.error(err)); } export default cache; -function getKevyInstance() { +function getKeyvInstance() { switch (env.CACHE_STORE) { case 'redis': return new Keyv(getConfig('redis')); @@ -34,12 +34,8 @@ function getConfig(store: 'memory' | 'redis' | 'memcache' = 'memory'): Options setTimeout(resolve, secondsBetweenTries * 1000)); + } + + return false; +} diff --git a/api/src/cli/commands/count/index.ts b/api/src/cli/commands/count/index.ts index 4fc8fe9b47..c86a0da51f 100644 --- a/api/src/cli/commands/count/index.ts +++ b/api/src/cli/commands/count/index.ts @@ -1,4 +1,4 @@ -export default async function rolesCreate(collection: string) { +export default async function count(collection: string) { const database = require('../../../database/index').default; if (!collection) { @@ -6,10 +6,16 @@ export default async function rolesCreate(collection: string) { process.exit(1); } - const records = await database(collection).count('*', { as: 'count' }); - const count = Number(records[0].count); + try { + const records = await database(collection).count('*', { as: 'count' }); + const count = Number(records[0].count); - console.log(count); - - database.destroy(); + console.log(count); + database.destroy(); + process.exit(0); + } catch (err) { + console.error(err); + database.destroy(); + process.exit(1); + } } diff --git a/api/src/cli/commands/database/install.ts b/api/src/cli/commands/database/install.ts index 664b718dee..29d0011e53 100644 --- a/api/src/cli/commands/database/install.ts +++ b/api/src/cli/commands/database/install.ts @@ -1,14 +1,18 @@ import Knex from 'knex'; -import run from '../../../database/seeds/run'; +import installSeeds from '../../../database/seeds/run'; +import runMigrations from '../../../database/migrations/run'; export default async function start() { const database = require('../../../database/index').default as Knex; + try { - await run(database); + await installSeeds(database); + await runMigrations(database, 'latest'); + database.destroy(); + process.exit(0); } catch (err) { console.log(err); - process.exit(1); - } finally { database.destroy(); + process.exit(1); } } diff --git a/api/src/cli/commands/database/migrate.ts b/api/src/cli/commands/database/migrate.ts index 0629b253ce..5afb5b0e34 100644 --- a/api/src/cli/commands/database/migrate.ts +++ b/api/src/cli/commands/database/migrate.ts @@ -1,14 +1,25 @@ import run from '../../../database/migrations/run'; +import ora from 'ora'; + export default async function migrate(direction: 'latest' | 'up' | 'down') { const database = require('../../../database').default; try { + const spinnerDriver = ora('Running migrations...').start(); await run(database, direction); + spinnerDriver.stop(); + + if (direction === 'down') { + console.log('✨ Downgrade successful'); + } else { + console.log('✨ Database up to date'); + } + database.destroy(); + process.exit(); } catch (err) { console.log(err); - process.exit(1); - } finally { database.destroy(); + process.exit(1); } } diff --git a/api/src/cli/commands/init/index.ts b/api/src/cli/commands/init/index.ts index e82c0a81ce..dad92607dd 100644 --- a/api/src/cli/commands/init/index.ts +++ b/api/src/cli/commands/init/index.ts @@ -10,6 +10,7 @@ import ora from 'ora'; import argon2 from 'argon2'; import runSeed from '../../../database/seeds/run'; +import runMigrations from '../../../database/migrations/run'; import createDBConnection, { Credentials } from '../../utils/create-db-connection'; import Knex from 'knex'; @@ -28,13 +29,9 @@ export default async function init(options: Record) { const dbClient = getDriverForClient(client)!; - try { - require.resolve(dbClient); - } catch { - const spinnerDriver = ora('Installing Database Driver...').start(); - await execa('npm', ['install', dbClient, '--production']); - spinnerDriver.stop(); - } + const spinnerDriver = ora('Installing Database Driver...').start(); + await execa('npm', ['install', dbClient, '--production']); + spinnerDriver.stop(); let attemptsRemaining = 5; @@ -51,11 +48,12 @@ export default async function init(options: Record) { try { await runSeed(db); + await runMigrations(db, 'latest'); } catch (err) { console.log(); console.log('Something went wrong while seeding the database:'); console.log(); - console.log(`${err.code && chalk.red(`[${err.code}]`)} ${err.message}`); + console.log(`${chalk.red(`[${err.code || 'Error'}]`)} ${err.message}`); console.log(); console.log('Please try again'); console.log(); @@ -102,7 +100,7 @@ export default async function init(options: Record) { await db('directus_roles').insert({ id: roleID, name: 'Administrator', - icon: 'verified_user', + icon: 'verified', admin_access: true, description: 'Initial administrative role with unrestricted App/API access', }); @@ -117,7 +115,7 @@ export default async function init(options: Record) { role: roleID, }); - db.destroy(); + await db.destroy(); console.log(` Your project has been created at ${chalk.green(rootPath)}. @@ -128,4 +126,6 @@ Start Directus by running: ${chalk.blue('cd')} ${rootPath} ${chalk.blue('npx directus')} start `); + + process.exit(0); } diff --git a/api/src/cli/commands/roles/create.ts b/api/src/cli/commands/roles/create.ts index 43ef17358d..6e696cfcb6 100644 --- a/api/src/cli/commands/roles/create.ts +++ b/api/src/cli/commands/roles/create.ts @@ -1,5 +1,5 @@ export default async function rolesCreate({ name, admin }: any) { - const database = require('../../../database/index').default; + const { default: database, schemaInspector } = require('../../../database/index'); const { RolesService } = require('../../../services/roles'); if (!name) { @@ -7,8 +7,16 @@ export default async function rolesCreate({ name, admin }: any) { process.exit(1); } - const service = new RolesService(); - const id = await service.create({ name, admin_access: admin }); - console.log(id); - database.destroy(); + try { + const schema = await schemaInspector.overview(); + const service = new RolesService({ schema: schema, knex: database }); + + const id = await service.create({ name, admin_access: admin }); + console.log(id); + database.destroy(); + process.exit(0); + } catch (err) { + console.error(err); + process.exit(1); + } } diff --git a/api/src/cli/commands/users/create.ts b/api/src/cli/commands/users/create.ts index 6fc725a49a..50b450a096 100644 --- a/api/src/cli/commands/users/create.ts +++ b/api/src/cli/commands/users/create.ts @@ -1,5 +1,5 @@ export default async function usersCreate({ email, password, role }: any) { - const database = require('../../../database/index').default; + const { default: database, schemaInspector } = require('../../../database/index'); const { UsersService } = require('../../../services/users'); if (!email || !password || !role) { @@ -7,8 +7,16 @@ export default async function usersCreate({ email, password, role }: any) { process.exit(1); } - const service = new UsersService(); - const id = await service.create({ email, password, role, status: 'active' }); - console.log(id); - database.destroy(); + try { + const schema = await schemaInspector.overview(); + const service = new UsersService({ schema, knex: database }); + + const id = await service.create({ email, password, role, status: 'active' }); + console.log(id); + database.destroy(); + process.exit(0); + } catch (err) { + console.error(err); + process.exit(1); + } } diff --git a/api/src/cli/index.ts b/api/src/cli/index.ts index a501ac1f58..e44b179212 100644 --- a/api/src/cli/index.ts +++ b/api/src/cli/index.ts @@ -11,6 +11,7 @@ import dbMigrate from './commands/database/migrate'; import usersCreate from './commands/users/create'; import rolesCreate from './commands/roles/create'; import count from './commands/count'; +import bootstrap from './commands/bootstrap'; program.name('directus').usage('[command] [options]'); program.version(pkg.version, '-v, --version'); @@ -52,9 +53,11 @@ rolesCommand .option('--admin', `whether or not the role has admin access`) .action(rolesCreate); -program - .command('count ') - .description('Count the amount of items in a given collection') - .action(count); +program.command('count ').description('Count the amount of items in a given collection').action(count); -program.parse(process.argv); +program.command('bootstrap').description('Initialize or update the database').action(bootstrap); + +program.parseAsync(process.argv).catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/api/src/cli/utils/create-env/index.ts b/api/src/cli/utils/create-env/index.ts index 3ae4e9cbbd..a340793d69 100644 --- a/api/src/cli/utils/create-env/index.ts +++ b/api/src/cli/utils/create-env/index.ts @@ -21,11 +21,7 @@ const defaults = { }, }; -export default async function createEnv( - client: keyof typeof drivers, - credentials: Credentials, - directory: string -) { +export default async function createEnv(client: keyof typeof drivers, credentials: Credentials, directory: string) { const config: Record = { ...defaults, database: { diff --git a/api/src/constants.ts b/api/src/constants.ts index c14a251650..ac1d7636aa 100644 --- a/api/src/constants.ts +++ b/api/src/constants.ts @@ -3,37 +3,37 @@ import { Transformation } from './types/assets'; export const SYSTEM_ASSET_ALLOW_LIST: Transformation[] = [ { key: 'system-small-cover', - w: 64, - h: 64, - f: 'cover', + width: 64, + height: 64, + fit: 'cover', }, { key: 'system-small-contain', - w: 64, - f: 'contain', + width: 64, + fit: 'contain', }, { key: 'system-medium-cover', - w: 300, - h: 300, - f: 'cover', + width: 300, + height: 300, + fit: 'cover', }, { key: 'system-medium-contain', - w: 300, - f: 'contain', + width: 300, + fit: 'contain', }, { key: 'system-large-cover', - w: 800, - h: 600, - f: 'cover', + width: 800, + height: 600, + fit: 'cover', }, { key: 'system-large-contain', - w: 800, - f: 'contain', + width: 800, + fit: 'contain', }, ]; -export const ASSET_TRANSFORM_QUERY_KEYS = ['key', 'w', 'h', 'f']; +export const ASSET_TRANSFORM_QUERY_KEYS = ['key', 'width', 'height', 'fit', 'withoutEnlargement']; diff --git a/api/src/controllers/activity.ts b/api/src/controllers/activity.ts index 1230ee9c58..d8f9774f53 100644 --- a/api/src/controllers/activity.ts +++ b/api/src/controllers/activity.ts @@ -13,8 +13,14 @@ router.use(useCollection('directus_activity')); router.get( '/', asyncHandler(async (req, res, next) => { - const service = new ActivityService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new ActivityService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const records = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery('directus_activity', req.sanitizedQuery); @@ -32,7 +38,10 @@ router.get( router.get( '/:pk', asyncHandler(async (req, res, next) => { - const service = new ActivityService({ accountability: req.accountability }); + const service = new ActivityService({ + accountability: req.accountability, + schema: req.schema, + }); const record = await service.readByKey(req.params.pk, req.sanitizedQuery); res.locals.payload = { @@ -47,7 +56,10 @@ router.get( router.post( '/comment', asyncHandler(async (req, res, next) => { - const service = new ActivityService({ accountability: req.accountability }); + const service = new ActivityService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.create({ ...req.body, @@ -79,7 +91,10 @@ router.post( router.patch( '/comment/:pk', asyncHandler(async (req, res, next) => { - const service = new ActivityService({ accountability: req.accountability }); + const service = new ActivityService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.update(req.body, req.params.pk); try { @@ -104,7 +119,10 @@ router.patch( router.delete( '/comment/:pk', asyncHandler(async (req, res, next) => { - const service = new ActivityService({ accountability: req.accountability }); + const service = new ActivityService({ + accountability: req.accountability, + schema: req.schema, + }); await service.delete(req.params.pk); return next(); diff --git a/api/src/controllers/assets.ts b/api/src/controllers/assets.ts index 5aa5bc0865..8855ce0883 100644 --- a/api/src/controllers/assets.ts +++ b/api/src/controllers/assets.ts @@ -9,7 +9,8 @@ import { Transformation } from '../types/assets'; import storage from '../storage'; import { PayloadService, AssetsService } from '../services'; import useCollection from '../middleware/use-collection'; -import { respond } from '../middleware/respond'; +import env from '../env'; +import ms from 'ms'; const router = Router(); @@ -31,11 +32,7 @@ router.get( const isValidUUID = validate(id, 4); if (isValidUUID === false) throw new ForbiddenException(); - const file = await database - .select('id', 'storage', 'filename_disk') - .from('directus_files') - .where({ id }) - .first(); + const file = await database.select('id', 'storage', 'filename_disk').from('directus_files').where({ id }).first(); if (!file) throw new ForbiddenException(); @@ -48,7 +45,7 @@ router.get( // Validate query params asyncHandler(async (req, res, next) => { - const payloadService = new PayloadService('directus_settings'); + const payloadService = new PayloadService('directus_settings', { schema: req.schema }); const defaults = { storage_asset_presets: [], storage_asset_transform: 'all' }; let savedAssetSettings = await database @@ -65,52 +62,45 @@ router.get( const transformation = pick(req.query, ASSET_TRANSFORM_QUERY_KEYS); if (transformation.hasOwnProperty('key') && Object.keys(transformation).length > 1) { - throw new InvalidQueryException( - `You can't combine the "key" query parameter with any other transformation.` - ); + throw new InvalidQueryException(`You can't combine the "key" query parameter with any other transformation.`); } const systemKeys = SYSTEM_ASSET_ALLOW_LIST.map((transformation) => transformation.key); const allKeys: string[] = [ ...systemKeys, - ...(assetSettings.storage_asset_presets || []).map( - (transformation: Transformation) => transformation.key - ), + ...(assetSettings.storage_asset_presets || []).map((transformation: Transformation) => transformation.key), ]; // For use in the next request handler - res.locals.shortcuts = [...SYSTEM_ASSET_ALLOW_LIST, assetSettings.storage_asset_presets]; + res.locals.shortcuts = [...SYSTEM_ASSET_ALLOW_LIST, ...(assetSettings.storage_asset_presets || [])]; res.locals.transformation = transformation; if (Object.keys(transformation).length === 0) { return next(); } - - if (assetSettings.asset_generation === 'all') { + if (assetSettings.storage_asset_transform === 'all') { if (transformation.key && allKeys.includes(transformation.key as string) === false) throw new InvalidQueryException(`Key "${transformation.key}" isn't configured.`); return next(); - } else if (assetSettings.asset_generation === 'shortcut') { + } else if (assetSettings.storage_asset_transform === 'shortcut') { if (allKeys.includes(transformation.key as string)) return next(); - throw new InvalidQueryException( - `Only configured shortcuts can be used in asset generation.` - ); + throw new InvalidQueryException(`Only configured shortcuts can be used in asset generation.`); } else { - if (transformation.key && systemKeys.includes(transformation.key as string)) - return next(); - throw new InvalidQueryException( - `Dynamic asset generation has been disabled for this project.` - ); + if (transformation.key && systemKeys.includes(transformation.key as string)) return next(); + throw new InvalidQueryException(`Dynamic asset generation has been disabled for this project.`); } }), // Return file asyncHandler(async (req, res) => { - const service = new AssetsService({ accountability: req.accountability }); + const service = new AssetsService({ + accountability: req.accountability, + schema: req.schema, + }); + const transformation: Transformation = res.locals.transformation.key ? res.locals.shortcuts.find( - (transformation: Transformation) => - transformation.key === res.locals.transformation.key + (transformation: Transformation) => transformation.key === res.locals.transformation.key ) : res.locals.transformation; @@ -123,6 +113,8 @@ router.get( res.removeHeader('Content-Disposition'); } + const access = !!req.accountability?.role ? 'private' : 'public'; + res.setHeader('Cache-Control', `${access}, max-age="${ms(env.ASSETS_CACHE_TTL as string)}"`); stream.pipe(res); }) ); diff --git a/api/src/controllers/auth.ts b/api/src/controllers/auth.ts index b8a21e79b2..05313e577e 100644 --- a/api/src/controllers/auth.ts +++ b/api/src/controllers/auth.ts @@ -34,6 +34,7 @@ router.post( const authenticationService = new AuthenticationService({ accountability: accountability, + schema: req.schema, }); const { error } = loginSchema.validate(req.body); @@ -46,15 +47,13 @@ router.post( const ip = req.ip; const userAgent = req.get('user-agent'); - const { accessToken, refreshToken, expires, id } = await authenticationService.authenticate( - { - ip, - userAgent, - email, - password, - otp, - } - ); + const { accessToken, refreshToken, expires } = await authenticationService.authenticate({ + ip, + userAgent, + email, + password, + otp, + }); const payload = { data: { access_token: accessToken, expires }, @@ -69,8 +68,7 @@ router.post( httpOnly: true, maxAge: ms(env.REFRESH_TOKEN_TTL as string), secure: env.REFRESH_TOKEN_COOKIE_SECURE === 'true' ? true : false, - sameSite: - (env.REFRESH_TOKEN_COOKIE_SAME_SITE as 'lax' | 'strict' | 'none') || 'strict', + sameSite: (env.REFRESH_TOKEN_COOKIE_SAME_SITE as 'lax' | 'strict' | 'none') || 'strict', }); } @@ -92,21 +90,18 @@ router.post( const authenticationService = new AuthenticationService({ accountability: accountability, + schema: req.schema, }); const currentRefreshToken = req.body.refresh_token || req.cookies.directus_refresh_token; if (!currentRefreshToken) { - throw new InvalidPayloadException( - `"refresh_token" is required in either the JSON payload or Cookie` - ); + throw new InvalidPayloadException(`"refresh_token" is required in either the JSON payload or Cookie`); } const mode: 'json' | 'cookie' = req.body.mode || req.body.refresh_token ? 'json' : 'cookie'; - const { accessToken, refreshToken, expires } = await authenticationService.refresh( - currentRefreshToken - ); + const { accessToken, refreshToken, expires } = await authenticationService.refresh(currentRefreshToken); const payload = { data: { access_token: accessToken, expires }, @@ -121,8 +116,7 @@ router.post( httpOnly: true, maxAge: ms(env.REFRESH_TOKEN_TTL as string), secure: env.REFRESH_TOKEN_COOKIE_SECURE === 'true' ? true : false, - sameSite: - (env.REFRESH_TOKEN_COOKIE_SAME_SITE as 'lax' | 'strict' | 'none') || 'strict', + sameSite: (env.REFRESH_TOKEN_COOKIE_SAME_SITE as 'lax' | 'strict' | 'none') || 'strict', }); } @@ -144,14 +138,13 @@ router.post( const authenticationService = new AuthenticationService({ accountability: accountability, + schema: req.schema, }); const currentRefreshToken = req.body.refresh_token || req.cookies.directus_refresh_token; if (!currentRefreshToken) { - throw new InvalidPayloadException( - `"refresh_token" is required in either the JSON payload or Cookie` - ); + throw new InvalidPayloadException(`"refresh_token" is required in either the JSON payload or Cookie`); } await authenticationService.logout(currentRefreshToken); @@ -173,10 +166,10 @@ router.post( role: null, }; - const service = new UsersService({ accountability }); + const service = new UsersService({ accountability, schema: req.schema }); try { - await service.requestPasswordReset(req.body.email); + await service.requestPasswordReset(req.body.email, req.body.reset_url || null); } catch { // We don't want to give away what email addresses exist, so we'll always return a 200 // from this endpoint @@ -204,7 +197,7 @@ router.post( role: null, }; - const service = new UsersService({ accountability }); + const service = new UsersService({ accountability, schema: req.schema }); await service.resetPassword(req.body.token, req.body.password); return next(); }), @@ -221,10 +214,7 @@ router.get( respond ); -router.use( - '/oauth', - session({ secret: env.SECRET as string, saveUninitialized: false, resave: false }) -); +router.use('/oauth', session({ secret: env.SECRET as string, saveUninitialized: false, resave: false })); router.get( '/oauth/:provider', @@ -239,7 +229,7 @@ router.get( } if (req.query?.redirect && req.session) { - req.session.redirect = req.query.redirect; + req.session.redirect = req.query.redirect as string; } next(); @@ -252,7 +242,7 @@ router.use(grant.express()(grantConfig)); router.get( '/oauth/:provider/callback', asyncHandler(async (req, res, next) => { - const redirect = req.session?.redirect; + const redirect = req.session.redirect; const accountability = { ip: req.ip, @@ -262,12 +252,10 @@ router.get( const authenticationService = new AuthenticationService({ accountability: accountability, + schema: req.schema, }); - const email = getEmailFromProfile( - req.params.provider, - req.session!.grant.response?.profile - ); + const email = getEmailFromProfile(req.params.provider, req.session.grant.response?.profile); req.session?.destroy(() => {}); @@ -280,8 +268,7 @@ router.get( httpOnly: true, maxAge: ms(env.REFRESH_TOKEN_TTL as string), secure: env.REFRESH_TOKEN_COOKIE_SECURE === 'true' ? true : false, - sameSite: - (env.REFRESH_TOKEN_COOKIE_SAME_SITE as 'lax' | 'strict' | 'none') || 'strict', + sameSite: (env.REFRESH_TOKEN_COOKIE_SAME_SITE as 'lax' | 'strict' | 'none') || 'strict', }); return res.redirect(redirect); diff --git a/api/src/controllers/collections.ts b/api/src/controllers/collections.ts index 0aa4eb969c..459566014b 100644 --- a/api/src/controllers/collections.ts +++ b/api/src/controllers/collections.ts @@ -1,7 +1,7 @@ import { Router } from 'express'; import asyncHandler from 'express-async-handler'; import { CollectionsService, MetaService } from '../services'; -import { ForbiddenException } from '../exceptions'; +import { ForbiddenException, InvalidPayloadException } from '../exceptions'; import { respond } from '../middleware/respond'; const router = Router(); @@ -9,7 +9,10 @@ const router = Router(); router.post( '/', asyncHandler(async (req, res, next) => { - const collectionsService = new CollectionsService({ accountability: req.accountability }); + const collectionsService = new CollectionsService({ + accountability: req.accountability, + schema: req.schema, + }); const collectionKey = await collectionsService.create(req.body); const record = await collectionsService.readByKey(collectionKey); @@ -23,8 +26,14 @@ router.post( router.get( '/', asyncHandler(async (req, res, next) => { - const collectionsService = new CollectionsService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const collectionsService = new CollectionsService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const collections = await collectionsService.readByQuery(); const meta = await metaService.getMetaForQuery('directus_collections', {}); @@ -38,7 +47,10 @@ router.get( router.get( '/:collection', asyncHandler(async (req, res, next) => { - const collectionsService = new CollectionsService({ accountability: req.accountability }); + const collectionsService = new CollectionsService({ + accountability: req.accountability, + schema: req.schema, + }); const collectionKey = req.params.collection.includes(',') ? req.params.collection.split(',') : req.params.collection; @@ -62,7 +74,10 @@ router.get( router.patch( '/:collection', asyncHandler(async (req, res, next) => { - const collectionsService = new CollectionsService({ accountability: req.accountability }); + const collectionsService = new CollectionsService({ + accountability: req.accountability, + schema: req.schema, + }); const collectionKey = req.params.collection.includes(',') ? req.params.collection.split(',') : req.params.collection; @@ -84,10 +99,31 @@ router.patch( respond ); +router.delete( + '/', + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const collectionsService = new CollectionsService({ + accountability: req.accountability, + schema: req.schema, + }); + await collectionsService.delete(req.body as string[]); + + return next(); + }), + respond +); + router.delete( '/:collection', asyncHandler(async (req, res, next) => { - const collectionsService = new CollectionsService({ accountability: req.accountability }); + const collectionsService = new CollectionsService({ + accountability: req.accountability, + schema: req.schema, + }); const collectionKey = req.params.collection.includes(',') ? req.params.collection.split(',') : req.params.collection; diff --git a/api/src/controllers/fields.ts b/api/src/controllers/fields.ts index bce62fda29..f9d6e86a8e 100644 --- a/api/src/controllers/fields.ts +++ b/api/src/controllers/fields.ts @@ -2,7 +2,6 @@ import { Router } from 'express'; import asyncHandler from 'express-async-handler'; import { FieldsService } from '../services/fields'; import validateCollection from '../middleware/collection-exists'; -import { schemaInspector } from '../database'; import { InvalidPayloadException, ForbiddenException } from '../exceptions'; import Joi from 'joi'; import { types, Field } from '../types'; @@ -16,7 +15,10 @@ router.use(useCollection('directus_fields')); router.get( '/', asyncHandler(async (req, res, next) => { - const service = new FieldsService({ accountability: req.accountability }); + const service = new FieldsService({ + accountability: req.accountability, + schema: req.schema, + }); const fields = await service.readAll(); res.locals.payload = { data: fields || null }; @@ -29,7 +31,10 @@ router.get( '/:collection', validateCollection, asyncHandler(async (req, res, next) => { - const service = new FieldsService({ accountability: req.accountability }); + const service = new FieldsService({ + accountability: req.accountability, + schema: req.schema, + }); const fields = await service.readAll(req.params.collection); res.locals.payload = { data: fields || null }; @@ -42,10 +47,12 @@ router.get( '/:collection/:field', validateCollection, asyncHandler(async (req, res, next) => { - const service = new FieldsService({ accountability: req.accountability }); + const service = new FieldsService({ + accountability: req.accountability, + schema: req.schema, + }); - const exists = await schemaInspector.hasColumn(req.params.collection, req.params.field); - if (exists === false) throw new ForbiddenException(); + if (req.params.field in req.schema[req.params.collection].columns === false) throw new ForbiddenException(); const field = await service.readOne(req.params.collection, req.params.field); @@ -72,10 +79,12 @@ router.post( '/:collection', validateCollection, asyncHandler(async (req, res, next) => { - if (!req.body.schema && !req.body.meta) - throw new InvalidPayloadException(`"schema" or "meta" is required`); + if (!req.body.schema && !req.body.meta) throw new InvalidPayloadException(`"schema" or "meta" is required`); - const service = new FieldsService({ accountability: req.accountability }); + const service = new FieldsService({ + accountability: req.accountability, + schema: req.schema, + }); const { error } = newFieldSchema.validate(req.body); @@ -107,7 +116,10 @@ router.patch( '/:collection', validateCollection, asyncHandler(async (req, res, next) => { - const service = new FieldsService({ accountability: req.accountability }); + const service = new FieldsService({ + accountability: req.accountability, + schema: req.schema, + }); if (Array.isArray(req.body) === false) { throw new InvalidPayloadException('Submitted body has to be an array.'); @@ -142,7 +154,10 @@ router.patch( validateCollection, // @todo: validate field asyncHandler(async (req, res, next) => { - const service = new FieldsService({ accountability: req.accountability }); + const service = new FieldsService({ + accountability: req.accountability, + schema: req.schema, + }); const fieldData: Partial & { field: string; type: typeof types[number] } = req.body; if (!fieldData.field) fieldData.field = req.params.field; @@ -169,7 +184,10 @@ router.delete( '/:collection/:field', validateCollection, asyncHandler(async (req, res, next) => { - const service = new FieldsService({ accountability: req.accountability }); + const service = new FieldsService({ + accountability: req.accountability, + schema: req.schema, + }); await service.deleteField(req.params.collection, req.params.field); return next(); }), diff --git a/api/src/controllers/files.ts b/api/src/controllers/files.ts index d33beb55e5..ec21f40b4d 100644 --- a/api/src/controllers/files.ts +++ b/api/src/controllers/files.ts @@ -12,6 +12,7 @@ import url from 'url'; import path from 'path'; import useCollection from '../middleware/use-collection'; import { respond } from '../middleware/respond'; +import { toArray } from '../utils/to-array'; const router = express.Router(); @@ -22,7 +23,7 @@ const multipartHandler = asyncHandler(async (req, res, next) => { const busboy = new Busboy({ headers: req.headers }); const savedFiles: PrimaryKey[] = []; - const service = new FilesService({ accountability: req.accountability }); + const service = new FilesService({ accountability: req.accountability, schema: req.schema }); const existingPrimaryKey = req.params.pk || undefined; @@ -32,7 +33,7 @@ const multipartHandler = asyncHandler(async (req, res, next) => { * the row in directus_files async during the upload of the actual file. */ - let disk: string = (env.STORAGE_LOCATIONS as string).split(',')[0].trim(); + let disk: string = toArray(env.STORAGE_LOCATIONS)[0]; let payload: Partial = {}; let fileCount = 0; @@ -67,11 +68,7 @@ const multipartHandler = asyncHandler(async (req, res, next) => { }; try { - const primaryKey = await service.upload( - fileStream, - payloadWithRequiredFields, - existingPrimaryKey - ); + const primaryKey = await service.upload(fileStream, payloadWithRequiredFields, existingPrimaryKey); savedFiles.push(primaryKey); tryDone(); } catch (error) { @@ -101,7 +98,10 @@ router.post( '/', multipartHandler, asyncHandler(async (req, res, next) => { - const service = new FilesService({ accountability: req.accountability }); + const service = new FilesService({ + accountability: req.accountability, + schema: req.schema, + }); let keys: PrimaryKey | PrimaryKey[] = []; if (req.is('multipart/form-data')) { @@ -144,7 +144,10 @@ router.post( throw new InvalidPayloadException(error.message); } - const service = new FilesService({ accountability: req.accountability }); + const service = new FilesService({ + accountability: req.accountability, + schema: req.schema, + }); const fileResponse = await axios.get(req.body.url, { responseType: 'stream', @@ -155,7 +158,7 @@ router.post( const payload = { filename_download: filename, - storage: (env.STORAGE_LOCATIONS as string).split(',')[0].trim(), + storage: toArray(env.STORAGE_LOCATIONS)[0], type: fileResponse.headers['content-type'], title: formatTitle(filename), ...(req.body.data || {}), @@ -182,8 +185,14 @@ router.post( router.get( '/', asyncHandler(async (req, res, next) => { - const service = new FilesService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new FilesService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const records = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery('directus_files', req.sanitizedQuery); @@ -198,7 +207,10 @@ router.get( '/:pk', asyncHandler(async (req, res, next) => { const keys = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; - const service = new FilesService({ accountability: req.accountability }); + const service = new FilesService({ + accountability: req.accountability, + schema: req.schema, + }); const record = await service.readByKey(keys as any, req.sanitizedQuery); res.locals.payload = { data: record || null }; return next(); @@ -210,7 +222,10 @@ router.patch( '/:pk', multipartHandler, asyncHandler(async (req, res, next) => { - const service = new FilesService({ accountability: req.accountability }); + const service = new FilesService({ + accountability: req.accountability, + schema: req.schema, + }); let keys: PrimaryKey | PrimaryKey[] = []; if (req.is('multipart/form-data')) { @@ -236,11 +251,31 @@ router.patch( respond ); +router.delete( + '/', + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const service = new FilesService({ + accountability: req.accountability, + schema: req.schema, + }); + await service.delete(req.body as PrimaryKey[]); + return next(); + }), + respond +); + router.delete( '/:pk', asyncHandler(async (req, res, next) => { const keys = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; - const service = new FilesService({ accountability: req.accountability }); + const service = new FilesService({ + accountability: req.accountability, + schema: req.schema, + }); await service.delete(keys as any); return next(); }), diff --git a/api/src/controllers/folders.ts b/api/src/controllers/folders.ts index 6d1302e0a2..856df6375d 100644 --- a/api/src/controllers/folders.ts +++ b/api/src/controllers/folders.ts @@ -1,9 +1,10 @@ import express from 'express'; import asyncHandler from 'express-async-handler'; import { FoldersService, MetaService } from '../services'; -import { ForbiddenException } from '../exceptions'; +import { ForbiddenException, InvalidPayloadException } from '../exceptions'; import useCollection from '../middleware/use-collection'; import { respond } from '../middleware/respond'; +import { PrimaryKey } from '../types'; const router = express.Router(); @@ -12,7 +13,10 @@ router.use(useCollection('directus_folders')); router.post( '/', asyncHandler(async (req, res, next) => { - const service = new FoldersService({ accountability: req.accountability }); + const service = new FoldersService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.create(req.body); try { @@ -34,8 +38,14 @@ router.post( router.get( '/', asyncHandler(async (req, res, next) => { - const service = new FoldersService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new FoldersService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const records = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery('directus_files', req.sanitizedQuery); @@ -49,7 +59,10 @@ router.get( router.get( '/:pk', asyncHandler(async (req, res, next) => { - const service = new FoldersService({ accountability: req.accountability }); + const service = new FoldersService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const record = await service.readByKey(primaryKey as any, req.sanitizedQuery); @@ -62,7 +75,10 @@ router.get( router.patch( '/:pk', asyncHandler(async (req, res, next) => { - const service = new FoldersService({ accountability: req.accountability }); + const service = new FoldersService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const primaryKey = await service.update(req.body, pk as any); @@ -82,10 +98,30 @@ router.patch( respond ); +router.delete( + '/', + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const service = new FoldersService({ + accountability: req.accountability, + schema: req.schema, + }); + await service.delete(req.body as PrimaryKey[]); + return next(); + }), + respond +); + router.delete( '/:pk', asyncHandler(async (req, res, next) => { - const service = new FoldersService({ accountability: req.accountability }); + const service = new FoldersService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; await service.delete(primaryKey as any); return next(); diff --git a/api/src/controllers/graphql.ts b/api/src/controllers/graphql.ts index 758c8bd444..ec0538ffde 100644 --- a/api/src/controllers/graphql.ts +++ b/api/src/controllers/graphql.ts @@ -5,12 +5,16 @@ import asyncHandler from 'express-async-handler'; const router = Router(); -router.use(asyncHandler(async (req, res) => { - const service = new GraphQLService({ accountability: req.accountability }); - const schema = await service.getSchema(); +router.use( + asyncHandler(async (req, res) => { + const service = new GraphQLService({ + accountability: req.accountability, + schema: req.schema, + }); + const schema = await service.getSchema(); - graphqlHTTP({ schema, graphiql: true })(req, res); -})); + graphqlHTTP({ schema, graphiql: true })(req, res); + }) +); export default router; - diff --git a/api/src/controllers/items.ts b/api/src/controllers/items.ts index fee750043b..df73a2fea5 100644 --- a/api/src/controllers/items.ts +++ b/api/src/controllers/items.ts @@ -2,8 +2,11 @@ import express from 'express'; import asyncHandler from 'express-async-handler'; import collectionExists from '../middleware/collection-exists'; import { ItemsService, MetaService } from '../services'; -import { RouteNotFoundException, ForbiddenException } from '../exceptions'; +import { RouteNotFoundException, ForbiddenException, FailedValidationException } from '../exceptions'; import { respond } from '../middleware/respond'; +import { InvalidPayloadException } from '../exceptions'; +import { PrimaryKey } from '../types'; +import Joi from 'joi'; const router = express.Router(); @@ -15,7 +18,10 @@ router.post( throw new RouteNotFoundException(req.path); } - const service = new ItemsService(req.collection, { accountability: req.accountability }); + const service = new ItemsService(req.collection, { + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.create(req.body); try { @@ -38,8 +44,15 @@ router.get( '/:collection', collectionExists, asyncHandler(async (req, res, next) => { - const service = new ItemsService(req.collection, { accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new ItemsService(req.collection, { + accountability: req.accountability, + schema: req.schema, + }); + + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const records = req.singleton ? await service.readSingleton(req.sanitizedQuery) @@ -51,6 +64,7 @@ router.get( meta: meta, data: records || null, }; + return next(); }), respond @@ -64,7 +78,10 @@ router.get( throw new RouteNotFoundException(req.path); } - const service = new ItemsService(req.collection, { accountability: req.accountability }); + const service = new ItemsService(req.collection, { + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const result = await service.readByKey(primaryKey as any, req.sanitizedQuery); @@ -80,7 +97,10 @@ router.patch( '/:collection', collectionExists, asyncHandler(async (req, res, next) => { - const service = new ItemsService(req.collection, { accountability: req.accountability }); + const service = new ItemsService(req.collection, { + accountability: req.accountability, + schema: req.schema, + }); if (req.singleton === true) { await service.upsertSingleton(req.body); @@ -90,7 +110,35 @@ router.patch( return next(); } - const primaryKeys = await service.update(req.body); + if (Array.isArray(req.body)) { + const primaryKeys = await service.update(req.body); + + try { + const result = await service.readByKey(primaryKeys, req.sanitizedQuery); + res.locals.payload = { data: result || null }; + } catch (error) { + if (error instanceof ForbiddenException) { + return next(); + } + + throw error; + } + + return next(); + } + + const updateSchema = Joi.object({ + keys: Joi.array().items(Joi.alternatives(Joi.string(), Joi.number())).required(), + data: Joi.object().required().unknown(), + }); + + const { error } = updateSchema.validate(req.body); + + if (error) { + throw new FailedValidationException(error.details[0]); + } + + const primaryKeys = await service.update(req.body.data, req.body.keys); try { const result = await service.readByKey(primaryKeys, req.sanitizedQuery); @@ -116,7 +164,10 @@ router.patch( throw new RouteNotFoundException(req.path); } - const service = new ItemsService(req.collection, { accountability: req.accountability }); + const service = new ItemsService(req.collection, { + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const updatedPrimaryKey = await service.update(req.body, primaryKey as any); @@ -137,11 +188,32 @@ router.patch( respond ); +router.delete( + '/:collection', + collectionExists, + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const service = new ItemsService(req.collection, { + accountability: req.accountability, + schema: req.schema, + }); + await service.delete(req.body as PrimaryKey[]); + return next(); + }), + respond +); + router.delete( '/:collection/:pk', collectionExists, asyncHandler(async (req, res, next) => { - const service = new ItemsService(req.collection, { accountability: req.accountability }); + const service = new ItemsService(req.collection, { + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; await service.delete(pk as any); return next(); diff --git a/api/src/controllers/permissions.ts b/api/src/controllers/permissions.ts index 568bae09b9..8a548baa6a 100644 --- a/api/src/controllers/permissions.ts +++ b/api/src/controllers/permissions.ts @@ -2,9 +2,10 @@ import express from 'express'; import asyncHandler from 'express-async-handler'; import { PermissionsService, MetaService } from '../services'; import { clone } from 'lodash'; -import { InvalidCredentialsException, ForbiddenException } from '../exceptions'; +import { InvalidCredentialsException, ForbiddenException, InvalidPayloadException } from '../exceptions'; import useCollection from '../middleware/use-collection'; import { respond } from '../middleware/respond'; +import { PrimaryKey } from '../types'; const router = express.Router(); @@ -13,7 +14,10 @@ router.use(useCollection('directus_permissions')); router.post( '/', asyncHandler(async (req, res, next) => { - const service = new PermissionsService({ accountability: req.accountability }); + const service = new PermissionsService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.create(req.body); try { @@ -34,8 +38,14 @@ router.post( router.get( '/', asyncHandler(async (req, res, next) => { - const service = new PermissionsService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new PermissionsService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const item = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery('directus_permissions', req.sanitizedQuery); @@ -53,7 +63,7 @@ router.get( throw new InvalidCredentialsException(); } - const service = new PermissionsService(); + const service = new PermissionsService({ schema: req.schema }); const query = clone(req.sanitizedQuery || {}); query.filter = { @@ -75,7 +85,10 @@ router.get( '/:pk', asyncHandler(async (req, res, next) => { if (req.path.endsWith('me')) return next(); - const service = new PermissionsService({ accountability: req.accountability }); + const service = new PermissionsService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const record = await service.readByKey(primaryKey as any, req.sanitizedQuery); @@ -88,7 +101,10 @@ router.get( router.patch( '/:pk', asyncHandler(async (req, res, next) => { - const service = new PermissionsService({ accountability: req.accountability }); + const service = new PermissionsService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const primaryKey = await service.update(req.body, pk as any); @@ -108,10 +124,30 @@ router.patch( respond ); +router.delete( + '/', + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const service = new PermissionsService({ + accountability: req.accountability, + schema: req.schema, + }); + await service.delete(req.body as PrimaryKey[]); + return next(); + }), + respond +); + router.delete( '/:pk', asyncHandler(async (req, res, next) => { - const service = new PermissionsService({ accountability: req.accountability }); + const service = new PermissionsService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; await service.delete(pk as any); return next(); diff --git a/api/src/controllers/presets.ts b/api/src/controllers/presets.ts index 31de8d1637..610c04a696 100644 --- a/api/src/controllers/presets.ts +++ b/api/src/controllers/presets.ts @@ -1,9 +1,10 @@ import express from 'express'; import asyncHandler from 'express-async-handler'; import { PresetsService, MetaService } from '../services'; -import { ForbiddenException } from '../exceptions'; +import { ForbiddenException, InvalidPayloadException } from '../exceptions'; import useCollection from '../middleware/use-collection'; import { respond } from '../middleware/respond'; +import { PrimaryKey } from '../types'; const router = express.Router(); @@ -12,7 +13,10 @@ router.use(useCollection('directus_presets')); router.post( '/', asyncHandler(async (req, res, next) => { - const service = new PresetsService({ accountability: req.accountability }); + const service = new PresetsService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.create(req.body); try { @@ -34,8 +38,14 @@ router.post( router.get( '/', asyncHandler(async (req, res, next) => { - const service = new PresetsService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new PresetsService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const records = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery('directus_presets', req.sanitizedQuery); @@ -49,7 +59,10 @@ router.get( router.get( '/:pk', asyncHandler(async (req, res, next) => { - const service = new PresetsService({ accountability: req.accountability }); + const service = new PresetsService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const record = await service.readByKey(pk as any, req.sanitizedQuery); @@ -62,7 +75,10 @@ router.get( router.patch( '/:pk', asyncHandler(async (req, res, next) => { - const service = new PresetsService({ accountability: req.accountability }); + const service = new PresetsService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const primaryKey = await service.update(req.body, pk as any); @@ -82,10 +98,30 @@ router.patch( respond ); +router.delete( + '/', + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const service = new PresetsService({ + accountability: req.accountability, + schema: req.schema, + }); + await service.delete(req.body as PrimaryKey[]); + return next(); + }), + respond +); + router.delete( '/:pk', asyncHandler(async (req, res, next) => { - const service = new PresetsService({ accountability: req.accountability }); + const service = new PresetsService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; await service.delete(pk as any); return next(); diff --git a/api/src/controllers/relations.ts b/api/src/controllers/relations.ts index 34e25b6eb5..f070807d3a 100644 --- a/api/src/controllers/relations.ts +++ b/api/src/controllers/relations.ts @@ -1,9 +1,10 @@ import express from 'express'; import asyncHandler from 'express-async-handler'; import { RelationsService, MetaService } from '../services'; -import { ForbiddenException } from '../exceptions'; +import { ForbiddenException, InvalidPayloadException } from '../exceptions'; import useCollection from '../middleware/use-collection'; import { respond } from '../middleware/respond'; +import { PrimaryKey } from '../types'; const router = express.Router(); @@ -12,7 +13,10 @@ router.use(useCollection('directus_relations')); router.post( '/', asyncHandler(async (req, res, next) => { - const service = new RelationsService({ accountability: req.accountability }); + const service = new RelationsService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.create(req.body); try { @@ -34,8 +38,14 @@ router.post( router.get( '/', asyncHandler(async (req, res, next) => { - const service = new RelationsService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new RelationsService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const records = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery(req.collection, req.sanitizedQuery); @@ -49,7 +59,10 @@ router.get( router.get( '/:pk', asyncHandler(async (req, res, next) => { - const service = new RelationsService({ accountability: req.accountability }); + const service = new RelationsService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const record = await service.readByKey(pk as any, req.sanitizedQuery); res.locals.payload = { data: record || null }; @@ -61,7 +74,10 @@ router.get( router.patch( '/:pk', asyncHandler(async (req, res, next) => { - const service = new RelationsService({ accountability: req.accountability }); + const service = new RelationsService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const primaryKey = await service.update(req.body, pk as any); @@ -81,10 +97,30 @@ router.patch( respond ); +router.delete( + '/', + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const service = new RelationsService({ + accountability: req.accountability, + schema: req.schema, + }); + await service.delete(req.body as PrimaryKey[]); + return next(); + }), + respond +); + router.delete( '/:pk', asyncHandler(async (req, res, next) => { - const service = new RelationsService({ accountability: req.accountability }); + const service = new RelationsService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; await service.delete(pk as any); return next(); diff --git a/api/src/controllers/revisions.ts b/api/src/controllers/revisions.ts index 7cc0c1cd1f..55de6ece11 100644 --- a/api/src/controllers/revisions.ts +++ b/api/src/controllers/revisions.ts @@ -11,8 +11,14 @@ router.use(useCollection('directus_revisions')); router.get( '/', asyncHandler(async (req, res, next) => { - const service = new RevisionsService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new RevisionsService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const records = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery('directus_revisions', req.sanitizedQuery); @@ -26,7 +32,10 @@ router.get( router.get( '/:pk', asyncHandler(async (req, res, next) => { - const service = new RevisionsService({ accountability: req.accountability }); + const service = new RevisionsService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const record = await service.readByKey(pk as any, req.sanitizedQuery); res.locals.payload = { data: record || null }; diff --git a/api/src/controllers/roles.ts b/api/src/controllers/roles.ts index 32cafc548b..c2a464f558 100644 --- a/api/src/controllers/roles.ts +++ b/api/src/controllers/roles.ts @@ -1,9 +1,10 @@ import express from 'express'; import asyncHandler from 'express-async-handler'; import { RolesService, MetaService } from '../services'; -import { ForbiddenException } from '../exceptions'; +import { ForbiddenException, InvalidPayloadException } from '../exceptions'; import useCollection from '../middleware/use-collection'; import { respond } from '../middleware/respond'; +import { PrimaryKey } from '../types'; const router = express.Router(); @@ -12,7 +13,10 @@ router.use(useCollection('directus_roles')); router.post( '/', asyncHandler(async (req, res, next) => { - const service = new RolesService({ accountability: req.accountability }); + const service = new RolesService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.create(req.body); try { @@ -34,8 +38,14 @@ router.post( router.get( '/', asyncHandler(async (req, res, next) => { - const service = new RolesService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new RolesService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const records = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery('directus_roles', req.sanitizedQuery); @@ -49,7 +59,10 @@ router.get( router.get( '/:pk', asyncHandler(async (req, res, next) => { - const service = new RolesService({ accountability: req.accountability }); + const service = new RolesService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const record = await service.readByKey(pk as any, req.sanitizedQuery); res.locals.payload = { data: record || null }; @@ -61,7 +74,10 @@ router.get( router.patch( '/:pk', asyncHandler(async (req, res, next) => { - const service = new RolesService({ accountability: req.accountability }); + const service = new RolesService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const primaryKey = await service.update(req.body, pk as any); @@ -81,10 +97,30 @@ router.patch( respond ); +router.delete( + '/', + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const service = new RolesService({ + accountability: req.accountability, + schema: req.schema, + }); + await service.delete(req.body as PrimaryKey[]); + return next(); + }), + respond +); + router.delete( '/:pk', asyncHandler(async (req, res, next) => { - const service = new RolesService({ accountability: req.accountability }); + const service = new RolesService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; await service.delete(pk as any); return next(); diff --git a/api/src/controllers/server.ts b/api/src/controllers/server.ts index d6fb0f688f..a1dfb81158 100644 --- a/api/src/controllers/server.ts +++ b/api/src/controllers/server.ts @@ -9,7 +9,10 @@ const router = Router(); router.get( '/specs/oas', asyncHandler(async (req, res, next) => { - const service = new SpecificationService({ accountability: req.accountability }); + const service = new SpecificationService({ + accountability: req.accountability, + schema: req.schema, + }); res.locals.payload = await service.oas.generate(); return next(); }), @@ -20,12 +23,15 @@ router.get('/ping', (req, res) => res.send('pong')); router.get( '/info', - (req, res, next) => { - const service = new ServerService({ accountability: req.accountability }); - const data = service.serverInfo(); + asyncHandler(async (req, res, next) => { + const service = new ServerService({ + accountability: req.accountability, + schema: req.schema, + }); + const data = await service.serverInfo(); res.locals.payload = { data }; return next(); - }, + }), respond ); diff --git a/api/src/controllers/settings.ts b/api/src/controllers/settings.ts index f00feb85f6..ab3f7abefc 100644 --- a/api/src/controllers/settings.ts +++ b/api/src/controllers/settings.ts @@ -12,7 +12,10 @@ router.use(useCollection('directus_settings')); router.get( '/', asyncHandler(async (req, res, next) => { - const service = new SettingsService({ accountability: req.accountability }); + const service = new SettingsService({ + accountability: req.accountability, + schema: req.schema, + }); const records = await service.readSingleton(req.sanitizedQuery); res.locals.payload = { data: records || null }; return next(); @@ -23,7 +26,10 @@ router.get( router.patch( '/', asyncHandler(async (req, res, next) => { - const service = new SettingsService({ accountability: req.accountability }); + const service = new SettingsService({ + accountability: req.accountability, + schema: req.schema, + }); await service.upsertSingleton(req.body); try { diff --git a/api/src/controllers/users.ts b/api/src/controllers/users.ts index b3b7ce4eb1..be7422b1f1 100644 --- a/api/src/controllers/users.ts +++ b/api/src/controllers/users.ts @@ -1,15 +1,11 @@ import express from 'express'; -import argon2 from 'argon2'; import asyncHandler from 'express-async-handler'; import Joi from 'joi'; -import { - InvalidPayloadException, - InvalidCredentialsException, - ForbiddenException, -} from '../exceptions'; +import { InvalidPayloadException, InvalidCredentialsException, ForbiddenException } from '../exceptions'; import { UsersService, MetaService, AuthenticationService } from '../services'; import useCollection from '../middleware/use-collection'; import { respond } from '../middleware/respond'; +import { PrimaryKey } from '../types'; const router = express.Router(); @@ -18,7 +14,10 @@ router.use(useCollection('directus_users')); router.post( '/', asyncHandler(async (req, res, next) => { - const service = new UsersService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.create(req.body); try { @@ -40,8 +39,14 @@ router.post( router.get( '/', asyncHandler(async (req, res, next) => { - const service = new UsersService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const item = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery('directus_users', req.sanitizedQuery); @@ -59,7 +64,10 @@ router.get( throw new InvalidCredentialsException(); } - const service = new UsersService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); try { const item = await service.readByKey(req.accountability.user, req.sanitizedQuery); @@ -82,7 +90,10 @@ router.get( '/:pk', asyncHandler(async (req, res, next) => { if (req.path.endsWith('me')) return next(); - const service = new UsersService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const items = await service.readByKey(pk as any, req.sanitizedQuery); res.locals.payload = { data: items || null }; @@ -98,7 +109,10 @@ router.patch( throw new InvalidCredentialsException(); } - const service = new UsersService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.update(req.body, req.accountability.user); const item = await service.readByKey(primaryKey, req.sanitizedQuery); @@ -119,7 +133,7 @@ router.patch( throw new InvalidPayloadException(`"last_page" key is required.`); } - const service = new UsersService(); + const service = new UsersService({ schema: req.schema }); await service.update({ last_page: req.body.last_page }, req.accountability.user); return next(); @@ -130,7 +144,10 @@ router.patch( router.patch( '/:pk', asyncHandler(async (req, res, next) => { - const service = new UsersService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const primaryKey = await service.update(req.body, pk as any); @@ -150,10 +167,31 @@ router.patch( respond ); +router.delete( + '/', + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); + await service.delete(req.body as PrimaryKey[]); + + return next(); + }), + respond +); + router.delete( '/:pk', asyncHandler(async (req, res, next) => { - const service = new UsersService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; await service.delete(pk as any); @@ -163,7 +201,7 @@ router.delete( ); const inviteSchema = Joi.object({ - email: Joi.string().email().required(), + email: Joi.alternatives(Joi.string().email(), Joi.array().items(Joi.string().email())).required(), role: Joi.string().uuid({ version: 'uuidv4' }).required(), }); @@ -173,7 +211,10 @@ router.post( const { error } = inviteSchema.validate(req.body); if (error) throw new InvalidPayloadException(error.message); - const service = new UsersService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); await service.inviteUser(req.body.email, req.body.role); return next(); }), @@ -190,7 +231,10 @@ router.post( asyncHandler(async (req, res, next) => { const { error } = acceptInviteSchema.validate(req.body); if (error) throw new InvalidPayloadException(error.message); - const service = new UsersService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); await service.acceptInvite(req.body.token, req.body.password); return next(); }), @@ -208,9 +252,15 @@ router.post( throw new InvalidPayloadException(`"password" is required`); } - const service = new UsersService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); - const authService = new AuthenticationService({ accountability: req.accountability }); + const authService = new AuthenticationService({ + accountability: req.accountability, + schema: req.schema, + }); await authService.verifyPassword(req.accountability.user, req.body.password); const { url, secret } = await service.enableTFA(req.accountability.user); @@ -232,8 +282,14 @@ router.post( throw new InvalidPayloadException(`"otp" is required`); } - const service = new UsersService({ accountability: req.accountability }); - const authService = new AuthenticationService({ accountability: req.accountability }); + const service = new UsersService({ + accountability: req.accountability, + schema: req.schema, + }); + const authService = new AuthenticationService({ + accountability: req.accountability, + schema: req.schema, + }); const otpValid = await authService.verifyOTP(req.accountability.user, req.body.otp); diff --git a/api/src/controllers/utils.ts b/api/src/controllers/utils.ts index 646371d93d..edb1b4910b 100644 --- a/api/src/controllers/utils.ts +++ b/api/src/controllers/utils.ts @@ -24,7 +24,7 @@ router.get( ); router.post( - '/hash', + '/hash/generate', asyncHandler(async (req, res) => { if (!req.body?.string) { throw new InvalidPayloadException(`"string" is required`); @@ -67,7 +67,10 @@ router.post( const { error } = SortSchema.validate(req.body); if (error) throw new InvalidPayloadException(error.message); - const service = new UtilsService({ accountability: req.accountability }); + const service = new UtilsService({ + accountability: req.accountability, + schema: req.schema, + }); await service.sort(req.collection, req.body); return res.status(200).end(); @@ -78,7 +81,10 @@ router.post( router.post( '/revert/:revision', asyncHandler(async (req, res, next) => { - const service = new RevisionsService({ accountability: req.accountability }); + const service = new RevisionsService({ + accountability: req.accountability, + schema: req.schema, + }); await service.revert(req.params.revision); next(); }), diff --git a/api/src/controllers/webhooks.ts b/api/src/controllers/webhooks.ts index a11f8a3ab0..4e2df84347 100644 --- a/api/src/controllers/webhooks.ts +++ b/api/src/controllers/webhooks.ts @@ -1,9 +1,10 @@ import express from 'express'; import asyncHandler from 'express-async-handler'; import { WebhooksService, MetaService } from '../services'; -import { ForbiddenException } from '../exceptions'; +import { ForbiddenException, InvalidPayloadException } from '../exceptions'; import useCollection from '../middleware/use-collection'; import { respond } from '../middleware/respond'; +import { PrimaryKey } from '../types'; const router = express.Router(); @@ -12,7 +13,10 @@ router.use(useCollection('directus_webhooks')); router.post( '/', asyncHandler(async (req, res, next) => { - const service = new WebhooksService({ accountability: req.accountability }); + const service = new WebhooksService({ + accountability: req.accountability, + schema: req.schema, + }); const primaryKey = await service.create(req.body); try { @@ -34,8 +38,14 @@ router.post( router.get( '/', asyncHandler(async (req, res, next) => { - const service = new WebhooksService({ accountability: req.accountability }); - const metaService = new MetaService({ accountability: req.accountability }); + const service = new WebhooksService({ + accountability: req.accountability, + schema: req.schema, + }); + const metaService = new MetaService({ + accountability: req.accountability, + schema: req.schema, + }); const records = await service.readByQuery(req.sanitizedQuery); const meta = await metaService.getMetaForQuery(req.collection, req.sanitizedQuery); @@ -49,7 +59,10 @@ router.get( router.get( '/:pk', asyncHandler(async (req, res, next) => { - const service = new WebhooksService({ accountability: req.accountability }); + const service = new WebhooksService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const record = await service.readByKey(pk as any, req.sanitizedQuery); @@ -62,7 +75,10 @@ router.get( router.patch( '/:pk', asyncHandler(async (req, res, next) => { - const service = new WebhooksService({ accountability: req.accountability }); + const service = new WebhooksService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; const primaryKey = await service.update(req.body, pk as any); @@ -82,10 +98,31 @@ router.patch( respond ); +router.delete( + '/', + asyncHandler(async (req, res, next) => { + if (!req.body || Array.isArray(req.body) === false) { + throw new InvalidPayloadException(`Body has to be an array of primary keys`); + } + + const service = new WebhooksService({ + accountability: req.accountability, + schema: req.schema, + }); + await service.delete(req.body as PrimaryKey[]); + + return next(); + }), + respond +); + router.delete( '/:pk', asyncHandler(async (req, res, next) => { - const service = new WebhooksService({ accountability: req.accountability }); + const service = new WebhooksService({ + accountability: req.accountability, + schema: req.schema, + }); const pk = req.params.pk.includes(',') ? req.params.pk.split(',') : req.params.pk; await service.delete(pk as any); diff --git a/api/src/database/index.ts b/api/src/database/index.ts index df77c48711..8508a779b1 100644 --- a/api/src/database/index.ts +++ b/api/src/database/index.ts @@ -4,36 +4,25 @@ import camelCase from 'camelcase'; import path from 'path'; import logger from '../logger'; import env from '../env'; +import { performance } from 'perf_hooks'; -import SchemaInspector from 'knex-schema-inspector'; +import SchemaInspector from '@directus/schema'; +import { getConfigFromEnv } from '../utils/get-config-from-env'; dotenv.config({ path: path.resolve(__dirname, '../../', '.env') }); -const connectionConfig: Record = {}; - -for (let [key, value] of Object.entries(env)) { - key = key.toLowerCase(); - if (key.startsWith('db') === false) continue; - if (key === 'db_client') continue; - if (key === 'db_search_path') continue; - if (key === 'db_connection_string') continue; - - key = key.slice(3); // remove `DB_` - - connectionConfig[camelCase(key)] = value; -} +const connectionConfig: Record = getConfigFromEnv('DB_', [ + 'DB_CLIENT', + 'DB_SEARCH_PATH', + 'DB_CONNECTION_STRING', +]); const knexConfig: Config = { client: env.DB_CLIENT, searchPath: env.DB_SEARCH_PATH, connection: env.DB_CONNECTION_STRING || connectionConfig, log: { - warn: (msg) => { - /** @note this is wild */ - if (msg === '.returning() is not supported by mysql and will not have any effect.') - return; - logger.warn(msg); - }, + warn: (msg) => logger.warn(msg), error: (msg) => logger.error(msg), deprecate: (msg) => logger.info(msg), debug: (msg) => logger.debug(msg), @@ -46,9 +35,29 @@ if (env.DB_CLIENT === 'sqlite3') { const database = knex(knexConfig); +const times: Record = {}; + +database + .on('query', (queryInfo) => { + times[queryInfo.__knexUid] = performance.now(); + }) + .on('query-response', (response, queryInfo) => { + const delta = performance.now() - times[queryInfo.__knexUid]; + logger.trace(`[${delta.toFixed(3)}ms] ${queryInfo.sql} [${queryInfo.bindings.join(', ')}]`); + }); + +export async function hasDatabaseConnection() { + try { + await database.raw('select 1 + 1 as result'); + return true; + } catch { + return false; + } +} + export async function validateDBConnection() { try { - await database.raw('select 1+1 as result'); + await hasDatabaseConnection(); } catch (error) { logger.fatal(`Can't connect to the database.`); logger.fatal(error); @@ -57,4 +66,12 @@ export async function validateDBConnection() { } export const schemaInspector = SchemaInspector(database); + +export async function isInstalled() { + // The existence of a directus_collections table alone isn't a "proper" check to see if everything + // is installed correctly of course, but it's safe enough to assume that this collection only + // exists when using the installer CLI. + return await schemaInspector.hasTable('directus_collections'); +} + export default database; diff --git a/api/src/database/migrations/20201028A-remove-collection-foreign-keys.ts b/api/src/database/migrations/20201028A-remove-collection-foreign-keys.ts new file mode 100644 index 0000000000..2ca4f11ffd --- /dev/null +++ b/api/src/database/migrations/20201028A-remove-collection-foreign-keys.ts @@ -0,0 +1,55 @@ +import Knex from 'knex'; + +export async function up(knex: Knex) { + await knex.schema.alterTable('directus_fields', (table) => { + table.dropForeign(['collection']); + }); + + await knex.schema.alterTable('directus_activity', (table) => { + table.dropForeign(['collection']); + }); + + await knex.schema.alterTable('directus_permissions', (table) => { + table.dropForeign(['collection']); + }); + + await knex.schema.alterTable('directus_presets', (table) => { + table.dropForeign(['collection']); + }); + + await knex.schema.alterTable('directus_relations', (table) => { + table.dropForeign(['one_collection']); + table.dropForeign(['many_collection']); + }); + + await knex.schema.alterTable('directus_revisions', (table) => { + table.dropForeign(['collection']); + }); +} + +export async function down(knex: Knex) { + await knex.schema.alterTable('directus_fields', (table) => { + table.foreign('collection').references('directus_collections.collection'); + }); + + await knex.schema.alterTable('directus_activity', (table) => { + table.foreign('collection').references('directus_collections.collection'); + }); + + await knex.schema.alterTable('directus_permissions', (table) => { + table.foreign('collection').references('directus_collections.collection'); + }); + + await knex.schema.alterTable('directus_presets', (table) => { + table.foreign('collection').references('directus_collections.collection'); + }); + + await knex.schema.alterTable('directus_relations', (table) => { + table.foreign('one_collection').references('directus_collections.collection'); + table.foreign('many_collection').references('directus_collections.collection'); + }); + + await knex.schema.alterTable('directus_revisions', (table) => { + table.foreign('collection').references('directus_collections.collection'); + }); +} diff --git a/api/src/database/migrations/20201029A-remove-system-relations.ts b/api/src/database/migrations/20201029A-remove-system-relations.ts new file mode 100644 index 0000000000..df117adcf3 --- /dev/null +++ b/api/src/database/migrations/20201029A-remove-system-relations.ts @@ -0,0 +1,128 @@ +import Knex from 'knex'; +import { merge } from 'lodash'; + +export async function up(knex: Knex) { + await knex('directus_relations') + .delete() + .where('many_collection', 'like', 'directus_%') + .andWhere('one_collection', 'like', 'directus_%'); +} + +export async function down(knex: Knex) { + const defaults = { + many_collection: 'directus_users', + many_field: null, + many_primary: null, + one_collection: null, + one_field: null, + one_primary: null, + junction_field: null, + }; + + const systemRelations = [ + { + many_collection: 'directus_users', + many_field: 'role', + many_primary: 'id', + one_collection: 'directus_roles', + one_field: 'users', + one_primary: 'id', + }, + { + many_collection: 'directus_users', + many_field: 'avatar', + many_primary: 'id', + one_collection: 'directus_files', + one_primary: 'id', + }, + { + many_collection: 'directus_revisions', + many_field: 'activity', + many_primary: 'id', + one_collection: 'directus_activity', + one_field: 'revisions', + one_primary: 'id', + }, + { + many_collection: 'directus_presets', + many_field: 'user', + many_primary: 'id', + one_collection: 'directus_users', + one_primary: 'id', + }, + { + many_collection: 'directus_presets', + many_field: 'role', + many_primary: 'id', + one_collection: 'directus_roles', + one_primary: 'id', + }, + { + many_collection: 'directus_folders', + many_field: 'parent', + many_primary: 'id', + one_collection: 'directus_folders', + one_primary: 'id', + }, + { + many_collection: 'directus_files', + many_field: 'folder', + many_primary: 'id', + one_collection: 'directus_folders', + one_primary: 'id', + }, + { + many_collection: 'directus_files', + many_field: 'uploaded_by', + many_primary: 'id', + one_collection: 'directus_users', + one_primary: 'id', + }, + { + many_collection: 'directus_fields', + many_field: 'collection', + many_primary: 'id', + one_collection: 'directus_collections', + one_field: 'fields', + one_primary: 'collection', + }, + { + many_collection: 'directus_activity', + many_field: 'user', + many_primary: 'id', + one_collection: 'directus_users', + one_primary: 'id', + }, + { + many_collection: 'directus_settings', + many_field: 'project_logo', + many_primary: 'id', + one_collection: 'directus_files', + one_primary: 'id', + }, + { + many_collection: 'directus_settings', + many_field: 'public_foreground', + many_primary: 'id', + one_collection: 'directus_files', + one_primary: 'id', + }, + { + many_collection: 'directus_settings', + many_field: 'public_background', + many_primary: 'id', + one_collection: 'directus_files', + one_primary: 'id', + }, + ].map((row) => { + for (const [key, value] of Object.entries(row)) { + if (value !== null && (typeof value === 'object' || Array.isArray(value))) { + (row as any)[key] = JSON.stringify(value); + } + } + + return merge({}, defaults, row); + }); + + await knex.insert(systemRelations).into('directus_relations'); +} diff --git a/api/src/database/migrations/20201029B-remove-system-collections.ts b/api/src/database/migrations/20201029B-remove-system-collections.ts new file mode 100644 index 0000000000..239df98301 --- /dev/null +++ b/api/src/database/migrations/20201029B-remove-system-collections.ts @@ -0,0 +1,99 @@ +import Knex from 'knex'; +import { merge } from 'lodash'; + +export async function up(knex: Knex) { + await knex('directus_collections').delete().where('collection', 'like', 'directus_%'); +} + +export async function down(knex: Knex) { + const defaults = { + collection: null, + hidden: false, + singleton: false, + icon: null, + note: null, + translations: null, + display_template: null, + }; + + const systemCollections = [ + { + collection: 'directus_activity', + note: 'Accountability logs for all events', + }, + { + collection: 'directus_collections', + icon: 'list_alt', + note: 'Additional collection configuration and metadata', + }, + { + collection: 'directus_fields', + icon: 'input', + note: 'Additional field configuration and metadata', + }, + { + collection: 'directus_files', + icon: 'folder', + note: 'Metadata for all managed file assets', + }, + { + collection: 'directus_folders', + note: 'Provides virtual directories for files', + }, + { + collection: 'directus_permissions', + icon: 'admin_panel_settings', + note: 'Access permissions for each role', + }, + { + collection: 'directus_presets', + icon: 'bookmark_border', + note: 'Presets for collection defaults and bookmarks', + }, + { + collection: 'directus_relations', + icon: 'merge_type', + note: 'Relationship configuration and metadata', + }, + { + collection: 'directus_revisions', + note: 'Data snapshots for all activity', + }, + { + collection: 'directus_roles', + icon: 'supervised_user_circle', + note: 'Permission groups for system users', + }, + { + collection: 'directus_sessions', + note: 'User session information', + }, + { + collection: 'directus_settings', + singleton: true, + note: 'Project configuration options', + }, + { + collection: 'directus_users', + archive_field: 'status', + archive_value: 'archived', + unarchive_value: 'draft', + icon: 'people_alt', + note: 'System users for the platform', + }, + { + collection: 'directus_webhooks', + note: 'Configuration for event-based HTTP requests', + }, + ].map((row) => { + for (const [key, value] of Object.entries(row)) { + if (value !== null && (typeof value === 'object' || Array.isArray(value))) { + (row as any)[key] = JSON.stringify(value); + } + } + + return merge({}, defaults, row); + }); + + await knex.insert(systemCollections).into('directus_collections'); +} diff --git a/api/src/database/migrations/20201029C-remove-system-fields.ts b/api/src/database/migrations/20201029C-remove-system-fields.ts new file mode 100644 index 0000000000..096cbc994e --- /dev/null +++ b/api/src/database/migrations/20201029C-remove-system-fields.ts @@ -0,0 +1,1650 @@ +import Knex from 'knex'; +import { uniq, merge } from 'lodash'; + +const defaults = { + collection: null, + field: null, + special: null, + interface: null, + options: null, + display: null, + display_options: null, + locked: false, + readonly: false, + hidden: false, + sort: null, + width: 'full', + group: null, + translations: null, + note: null, +}; + +const systemFields = [ + { + collection: 'directus_collections', + field: 'collection_divider', + special: 'alias', + interface: 'divider', + options: { + icon: 'box', + title: 'Collection Setup', + color: '#2F80ED', + }, + locked: true, + sort: 1, + width: 'full', + }, + { + collection: 'directus_collections', + field: 'collection', + interface: 'text-input', + options: { + font: 'monospace', + }, + locked: true, + readonly: true, + sort: 2, + width: 'half', + }, + { + collection: 'directus_collections', + field: 'icon', + interface: 'icon', + options: null, + locked: true, + sort: 3, + width: 'half', + }, + { + collection: 'directus_collections', + field: 'note', + interface: 'text-input', + options: { + placeholder: 'A description of this collection...', + }, + locked: true, + sort: 4, + width: 'full', + }, + { + collection: 'directus_collections', + field: 'display_template', + interface: 'display-template', + options: { + collectionField: 'collection', + }, + locked: true, + sort: 5, + width: 'full', + }, + { + collection: 'directus_collections', + field: 'hidden', + special: 'boolean', + interface: 'toggle', + options: { + label: 'Hide within the App', + }, + locked: true, + sort: 6, + width: 'half', + }, + { + collection: 'directus_collections', + field: 'singleton', + special: 'boolean', + interface: 'toggle', + options: { + label: 'Treat as single object', + }, + locked: true, + sort: 7, + width: 'half', + }, + { + collection: 'directus_collections', + field: 'translations', + special: 'json', + interface: 'repeater', + options: { + template: '{{ translation }} ({{ language }})', + fields: [ + { + field: 'language', + name: 'Language', + type: 'string', + schema: { + default_value: 'en-US', + }, + meta: { + interface: 'system-language', + width: 'half', + }, + }, + { + field: 'translation', + name: 'translation', + type: 'string', + meta: { + interface: 'text-input', + width: 'half', + options: { + placeholder: 'Enter a translation...', + }, + }, + }, + ], + }, + locked: true, + sort: 8, + width: 'full', + }, + { + collection: 'directus_collections', + field: 'archive_divider', + special: 'alias', + interface: 'divider', + options: { + icon: 'archive', + title: 'Archive', + color: '#2F80ED', + }, + locked: true, + sort: 9, + width: 'full', + }, + { + collection: 'directus_collections', + field: 'archive_field', + interface: 'field', + options: { + collectionField: 'collection', + allowNone: true, + placeholder: 'Choose a field...', + }, + locked: true, + sort: 10, + width: 'half', + }, + { + collection: 'directus_collections', + field: 'archive_app_filter', + interface: 'toggle', + special: 'boolean', + options: { + label: 'Enable App Archive Filter', + }, + locked: true, + sort: 11, + width: 'half', + }, + { + collection: 'directus_collections', + field: 'archive_value', + interface: 'text-input', + options: { + font: 'monospace', + iconRight: 'archive', + placeholder: 'Value set when archiving...', + }, + locked: true, + sort: 12, + width: 'half', + }, + { + collection: 'directus_collections', + field: 'unarchive_value', + interface: 'text-input', + options: { + font: 'monospace', + iconRight: 'unarchive', + placeholder: 'Value set when unarchiving...', + }, + locked: true, + sort: 13, + width: 'half', + }, + { + collection: 'directus_collections', + field: 'sort_divider', + special: 'alias', + interface: 'divider', + options: { + icon: 'sort', + title: 'Sort', + color: '#2F80ED', + }, + locked: true, + sort: 14, + width: 'full', + }, + { + collection: 'directus_collections', + field: 'sort_field', + interface: 'field', + options: { + collectionField: 'collection', + placeholder: 'Choose a field...', + typeAllowList: ['float', 'decimal', 'integer'], + allowNone: true, + }, + locked: true, + sort: 15, + width: 'half', + }, + { + collection: 'directus_roles', + field: 'id', + hidden: true, + interface: 'text-input', + locked: true, + special: 'uuid', + }, + { + collection: 'directus_roles', + field: 'name', + interface: 'text-input', + options: { + placeholder: 'The unique name for this role...', + }, + locked: true, + sort: 1, + width: 'half', + }, + { + collection: 'directus_roles', + field: 'icon', + interface: 'icon', + display: 'icon', + locked: true, + sort: 2, + width: 'half', + }, + { + collection: 'directus_roles', + field: 'description', + interface: 'text-input', + options: { + placeholder: 'A description of this role...', + }, + locked: true, + sort: 3, + width: 'full', + }, + { + collection: 'directus_roles', + field: 'app_access', + interface: 'toggle', + locked: true, + special: 'boolean', + sort: 4, + width: 'half', + }, + { + collection: 'directus_roles', + field: 'admin_access', + interface: 'toggle', + locked: true, + special: 'boolean', + sort: 5, + width: 'half', + }, + { + collection: 'directus_roles', + field: 'ip_access', + interface: 'tags', + options: { + placeholder: 'Add allowed IP addresses, leave empty to allow all...', + }, + locked: true, + special: 'csv', + sort: 6, + width: 'full', + }, + { + collection: 'directus_roles', + field: 'enforce_tfa', + interface: 'toggle', + locked: true, + sort: 7, + special: 'boolean', + width: 'half', + }, + { + collection: 'directus_roles', + field: 'users', + interface: 'one-to-many', + locked: true, + special: 'o2m', + sort: 8, + options: { + fields: ['first_name', 'last_name'], + }, + width: 'full', + }, + { + collection: 'directus_roles', + field: 'module_list', + interface: 'repeater', + locked: true, + options: { + template: '{{ name }}', + addLabel: 'Add New Module...', + fields: [ + { + name: 'Icon', + field: 'icon', + type: 'string', + meta: { + interface: 'icon', + width: 'half', + }, + }, + { + name: 'Name', + field: 'name', + type: 'string', + meta: { + interface: 'text-input', + width: 'half', + options: { + iconRight: 'title', + placeholder: 'Enter a title...', + }, + }, + }, + { + name: 'Link', + field: 'link', + type: 'string', + meta: { + interface: 'text-input', + width: 'full', + options: { + iconRight: 'link', + placeholder: 'Relative or absolute URL...', + }, + }, + }, + ], + }, + special: 'json', + sort: 9, + width: 'full', + }, + { + collection: 'directus_roles', + field: 'collection_list', + interface: 'repeater', + locked: true, + options: { + template: '{{ group_name }}', + addLabel: 'Add New Group...', + fields: [ + { + name: 'Group Name', + field: 'group_name', + type: 'string', + meta: { + width: 'half', + interface: 'text-input', + options: { + iconRight: 'title', + placeholder: 'Label this group...', + }, + }, + schema: { + is_nullable: false, + }, + }, + { + name: 'Type', + field: 'accordion', + type: 'string', + schema: { + default_value: 'always_open', + }, + meta: { + width: 'half', + interface: 'dropdown', + options: { + choices: [ + { + value: 'always_open', + text: 'Always Open', + }, + { + value: 'start_open', + text: 'Start Open', + }, + { + value: 'start_collapsed', + text: 'Start Collapsed', + }, + ], + }, + }, + }, + { + name: 'Collections', + field: 'collections', + type: 'JSON', + meta: { + interface: 'repeater', + options: { + addLabel: 'Add New Collection...', + template: '{{ collection }}', + fields: [ + { + name: 'Collection', + field: 'collection', + type: 'string', + meta: { + interface: 'collection', + width: 'full', + }, + schema: { + is_nullable: false, + }, + }, + ], + }, + }, + }, + ], + }, + special: 'json', + sort: 10, + width: 'full', + }, + { + collection: 'directus_fields', + field: 'options', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_fields', + field: 'display_options', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_fields', + field: 'locked', + hidden: true, + locked: true, + special: 'boolean', + }, + { + collection: 'directus_fields', + field: 'readonly', + hidden: true, + locked: true, + special: 'boolean', + }, + { + collection: 'directus_fields', + field: 'hidden', + hidden: true, + locked: true, + special: 'boolean', + }, + { + collection: 'directus_fields', + field: 'special', + hidden: true, + locked: true, + special: 'csv', + }, + { + collection: 'directus_fields', + field: 'translations', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_users', + field: 'first_name', + interface: 'text-input', + locked: true, + options: { + iconRight: 'account_circle', + }, + sort: 1, + width: 'half', + }, + { + collection: 'directus_users', + field: 'last_name', + interface: 'text-input', + locked: true, + options: { + iconRight: 'account_circle', + }, + sort: 2, + width: 'half', + }, + { + collection: 'directus_users', + field: 'email', + interface: 'text-input', + locked: true, + options: { + iconRight: 'email', + }, + sort: 3, + width: 'half', + }, + { + collection: 'directus_users', + field: 'password', + special: 'hash, conceal', + interface: 'hash', + locked: true, + options: { + iconRight: 'lock', + masked: true, + }, + sort: 4, + width: 'half', + }, + { + collection: 'directus_users', + field: 'avatar', + interface: 'file', + locked: true, + sort: 5, + width: 'full', + }, + { + collection: 'directus_users', + field: 'location', + interface: 'text-input', + options: { + iconRight: 'place', + }, + sort: 6, + width: 'half', + }, + { + collection: 'directus_users', + field: 'title', + interface: 'text-input', + options: { + iconRight: 'work', + }, + sort: 7, + width: 'half', + }, + { + collection: 'directus_users', + field: 'description', + interface: 'textarea', + sort: 8, + width: 'full', + }, + { + collection: 'directus_users', + field: 'tags', + interface: 'tags', + special: 'json', + sort: 9, + width: 'full', + options: { + iconRight: 'local_offer', + }, + }, + { + collection: 'directus_users', + field: 'preferences_divider', + interface: 'divider', + options: { + icon: 'face', + title: 'User Preferences', + color: '#2F80ED', + }, + special: 'alias', + sort: 10, + width: 'full', + }, + { + collection: 'directus_users', + field: 'language', + interface: 'dropdown', + locked: true, + options: { + choices: [ + { + text: 'Afrikaans (South Africa)', + value: 'af-ZA', + }, + { + text: 'Arabic (Saudi Arabia)', + value: 'ar-SA', + }, + { + text: 'Catalan (Spain)', + value: 'ca-ES', + }, + { + text: 'Chinese (Simplified)', + value: 'zh-CN', + }, + { + text: 'Czech (Czech Republic)', + value: 'cs-CZ', + }, + { + text: 'Danish (Denmark)', + value: 'da-DK', + }, + { + text: 'Dutch (Netherlands)', + value: 'nl-NL', + }, + { + text: 'English (United States)', + value: 'en-US', + }, + { + text: 'Finnish (Finland)', + value: 'fi-FI', + }, + { + text: 'French (France)', + value: 'fr-FR', + }, + { + text: 'German (Germany)', + value: 'de-DE', + }, + { + text: 'Greek (Greece)', + value: 'el-GR', + }, + { + text: 'Hebrew (Israel)', + value: 'he-IL', + }, + { + text: 'Hungarian (Hungary)', + value: 'hu-HU', + }, + { + text: 'Icelandic (Iceland)', + value: 'is-IS', + }, + { + text: 'Indonesian (Indonesia)', + value: 'id-ID', + }, + { + text: 'Italian (Italy)', + value: 'it-IT', + }, + { + text: 'Japanese (Japan)', + value: 'ja-JP', + }, + { + text: 'Korean (Korea)', + value: 'ko-KR', + }, + { + text: 'Malay (Malaysia)', + value: 'ms-MY', + }, + { + text: 'Norwegian (Norway)', + value: 'no-NO', + }, + { + text: 'Polish (Poland)', + value: 'pl-PL', + }, + { + text: 'Portuguese (Brazil)', + value: 'pt-BR', + }, + { + text: 'Portuguese (Portugal)', + value: 'pt-PT', + }, + { + text: 'Russian (Russian Federation)', + value: 'ru-RU', + }, + { + text: 'Spanish (Spain)', + value: 'es-ES', + }, + { + text: 'Spanish (Latin America)', + value: 'es-419', + }, + { + text: 'Taiwanese Mandarin (Taiwan)', + value: 'zh-TW', + }, + { + text: 'Turkish (Turkey)', + value: 'tr-TR', + }, + { + text: 'Ukrainian (Ukraine)', + value: 'uk-UA', + }, + { + text: 'Vietnamese (Vietnam)', + value: 'vi-VN', + }, + ], + }, + sort: 11, + width: 'half', + }, + { + collection: 'directus_users', + field: 'theme', + interface: 'dropdown', + locked: true, + options: { + choices: [ + { + value: 'auto', + text: 'Automatic (Based on System)', + }, + { + value: 'light', + text: 'Light Mode', + }, + { + value: 'dark', + text: 'Dark Mode', + }, + ], + }, + sort: 12, + width: 'half', + }, + { + collection: 'directus_users', + field: 'tfa_secret', + interface: 'tfa-setup', + locked: true, + special: 'conceal', + sort: 13, + width: 'half', + }, + { + collection: 'directus_users', + field: 'admin_divider', + interface: 'divider', + locked: true, + options: { + icon: 'verified_user', + title: 'Admin Options', + color: '#F2994A', + }, + special: 'alias', + sort: 14, + width: 'full', + }, + { + collection: 'directus_users', + field: 'status', + interface: 'dropdown', + locked: true, + options: { + choices: [ + { + text: 'Draft', + value: 'draft', + }, + { + text: 'Invited', + value: 'invited', + }, + { + text: 'Active', + value: 'active', + }, + { + text: 'Suspended', + value: 'suspended', + }, + { + text: 'Archived', + value: 'archived', + }, + ], + }, + sort: 15, + width: 'half', + }, + { + collection: 'directus_users', + field: 'role', + interface: 'many-to-one', + locked: true, + options: { + template: '{{ name }}', + }, + special: 'm2o', + sort: 16, + width: 'half', + }, + { + collection: 'directus_users', + field: 'token', + interface: 'token', + locked: true, + options: { + iconRight: 'vpn_key', + placeholder: 'Enter a secure access token...', + }, + sort: 17, + width: 'full', + }, + { + collection: 'directus_users', + field: 'id', + special: 'uuid', + interface: 'text-input', + locked: true, + options: { + iconRight: 'vpn_key', + }, + sort: 18, + width: 'full', + }, + { + collection: 'directus_folders', + field: 'id', + interface: 'text-input', + locked: true, + special: 'uuid', + }, + { + collection: 'directus_files', + field: 'id', + hidden: true, + interface: 'text-input', + locked: true, + special: 'uuid', + }, + { + collection: 'directus_files', + field: 'title', + interface: 'text-input', + locked: true, + options: { + iconRight: 'title', + placeholder: 'A unique title...', + }, + sort: 1, + width: 'full', + }, + { + collection: 'directus_files', + field: 'description', + interface: 'textarea', + locked: true, + sort: 2, + width: 'full', + options: { + placeholder: 'An optional description...', + }, + }, + { + collection: 'directus_files', + field: 'tags', + interface: 'tags', + locked: true, + options: { + iconRight: 'local_offer', + }, + special: 'json', + sort: 3, + width: 'full', + display: 'tags', + }, + { + collection: 'directus_files', + field: 'location', + interface: 'text-input', + locked: true, + options: { + iconRight: 'place', + placeholder: 'An optional location...', + }, + sort: 4, + width: 'half', + }, + { + collection: 'directus_files', + field: 'storage', + interface: 'text-input', + locked: true, + options: { + iconRight: 'storage', + }, + sort: 5, + width: 'half', + readonly: true, + }, + { + collection: 'directus_files', + field: 'storage_divider', + interface: 'divider', + locked: true, + options: { + icon: 'insert_drive_file', + title: 'File Naming', + color: '#2F80ED', + }, + special: 'alias', + sort: 6, + width: 'full', + }, + { + collection: 'directus_files', + field: 'filename_disk', + interface: 'text-input', + locked: true, + options: { + iconRight: 'publish', + placeholder: 'Name on disk storage...', + }, + sort: 7, + width: 'half', + }, + { + collection: 'directus_files', + field: 'filename_download', + interface: 'text-input', + locked: true, + options: { + iconRight: 'get_app', + placeholder: 'Name when downloading...', + }, + sort: 8, + width: 'half', + }, + { + collection: 'directus_files', + field: 'metadata', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_files', + field: 'type', + display: 'mime-type', + }, + { + collection: 'directus_files', + field: 'filesize', + display: 'filesize', + }, + { + collection: 'directus_files', + field: 'modified_by', + interface: 'user', + locked: true, + special: 'user-updated', + width: 'half', + display: 'user', + }, + { + collection: 'directus_files', + field: 'modified_on', + interface: 'datetime', + locked: true, + special: 'date-updated', + width: 'half', + display: 'datetime', + }, + { + collection: 'directus_files', + field: 'created_on', + display: 'datetime', + }, + { + collection: 'directus_files', + field: 'created_by', + display: 'user', + }, + { + collection: 'directus_permissions', + field: 'permissions', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_permissions', + field: 'presets', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_presets', + field: 'filters', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_presets', + field: 'layout_query', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_presets', + field: 'layout_options', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_revisions', + field: 'data', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_revisions', + field: 'delta', + hidden: true, + locked: true, + special: 'json', + }, + { + collection: 'directus_settings', + field: 'project_name', + interface: 'text-input', + locked: true, + options: { + iconRight: 'title', + placeholder: 'My project...', + }, + sort: 1, + translations: { + language: 'en-US', + translations: 'Name', + }, + width: 'half', + }, + { + collection: 'directus_settings', + field: 'project_url', + interface: 'text-input', + locked: true, + options: { + iconRight: 'link', + placeholder: 'https://example.com', + }, + sort: 2, + translations: { + language: 'en-US', + translations: 'Website', + }, + width: 'half', + }, + { + collection: 'directus_settings', + field: 'project_color', + interface: 'color', + locked: true, + note: 'Login & Logo Background', + sort: 3, + translations: { + language: 'en-US', + translations: 'Brand Color', + }, + width: 'half', + }, + { + collection: 'directus_settings', + field: 'project_logo', + interface: 'file', + locked: true, + note: 'White 40x40 SVG/PNG', + sort: 4, + translations: { + language: 'en-US', + translations: 'Brand Logo', + }, + width: 'half', + }, + { + collection: 'directus_settings', + field: 'public_divider', + interface: 'divider', + locked: true, + options: { + icon: 'public', + title: 'Public Pages', + color: '#2F80ED', + }, + special: 'alias', + sort: 5, + width: 'full', + }, + { + collection: 'directus_settings', + field: 'public_foreground', + interface: 'file', + locked: true, + sort: 6, + translations: { + language: 'en-US', + translations: 'Login Foreground', + }, + width: 'half', + }, + { + collection: 'directus_settings', + field: 'public_background', + interface: 'file', + locked: true, + sort: 7, + translations: { + language: 'en-US', + translations: 'Login Background', + }, + width: 'half', + }, + { + collection: 'directus_settings', + field: 'public_note', + interface: 'textarea', + locked: true, + options: { + placeholder: 'A short, public message that supports markdown formatting...', + }, + sort: 8, + width: 'full', + }, + { + collection: 'directus_settings', + field: 'security_divider', + interface: 'divider', + locked: true, + options: { + icon: 'security', + title: 'Security', + color: '#2F80ED', + }, + special: 'alias', + sort: 9, + width: 'full', + }, + { + collection: 'directus_settings', + field: 'auth_password_policy', + interface: 'dropdown', + locked: true, + options: { + choices: [ + { + value: null, + text: 'None – Not Recommended', + }, + { + value: '/^.{8,}$/', + text: 'Weak – Minimum 8 Characters', + }, + { + value: "/(?=^.{8,}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{';'?>.<,])(?!.*\\s).*$/", + text: 'Strong – Upper / Lowercase / Numbers / Special', + }, + ], + }, + sort: 10, + width: 'half', + }, + { + collection: 'directus_settings', + field: 'auth_login_attempts', + interface: 'numeric', + locked: true, + options: { + iconRight: 'lock', + }, + sort: 11, + width: 'half', + }, + { + collection: 'directus_settings', + field: 'files_divider', + interface: 'divider', + locked: true, + options: { + icon: 'storage', + title: 'Files & Thumbnails', + color: '#2F80ED', + }, + special: 'alias', + sort: 12, + width: 'full', + }, + { + collection: 'directus_settings', + field: 'storage_asset_presets', + interface: 'repeater', + locked: true, + options: { + fields: [ + { + field: 'key', + name: 'Key', + type: 'string', + schema: { + is_nullable: false, + }, + meta: { + interface: 'slug', + options: { + onlyOnCreate: false, + }, + width: 'half', + }, + }, + { + field: 'fit', + name: 'Fit', + type: 'string', + schema: { + is_nullable: false, + }, + meta: { + interface: 'dropdown', + options: { + choices: [ + { + value: 'contain', + text: 'Contain (preserve aspect ratio)', + }, + { + value: 'cover', + text: 'Cover (forces exact size)', + }, + ], + }, + width: 'half', + }, + }, + { + field: 'width', + name: 'Width', + type: 'integer', + schema: { + is_nullable: false, + }, + meta: { + interface: 'numeric', + width: 'half', + }, + }, + { + field: 'height', + name: 'Height', + type: 'integer', + schema: { + is_nullable: false, + }, + meta: { + interface: 'numeric', + width: 'half', + }, + }, + { + field: 'quality', + type: 'integer', + name: 'Quality', + schema: { + default_value: 80, + is_nullable: false, + }, + meta: { + interface: 'slider', + options: { + max: 100, + min: 0, + step: 1, + }, + width: 'full', + }, + }, + ], + template: '{{key}}', + }, + special: 'json', + sort: 13, + width: 'full', + }, + { + collection: 'directus_settings', + field: 'storage_asset_transform', + interface: 'dropdown', + locked: true, + options: { + choices: [ + { + value: 'all', + text: 'All', + }, + { + value: 'none', + text: 'None', + }, + { + value: 'presets', + text: 'Presets Only', + }, + ], + }, + sort: 14, + width: 'half', + }, + { + collection: 'directus_settings', + field: 'id', + hidden: true, + locked: true, + }, + { + collection: 'directus_settings', + field: 'overrides_divider', + interface: 'divider', + locked: true, + options: { + icon: 'brush', + title: 'App Overrides', + color: '#2F80ED', + }, + special: 'alias', + sort: 15, + width: 'full', + }, + { + collection: 'directus_settings', + field: 'custom_css', + interface: 'code', + locked: true, + options: { + language: 'css', + lineNumber: true, + }, + sort: 16, + width: 'full', + }, + { + collection: 'directus_webhooks', + field: 'id', + hidden: true, + locked: true, + }, + { + collection: 'directus_webhooks', + field: 'name', + interface: 'text-input', + locked: true, + options: { + iconRight: 'title', + }, + sort: 1, + width: 'full', + }, + { + collection: 'directus_webhooks', + field: 'method', + interface: 'dropdown', + display: 'labels', + display_options: { + defaultBackground: '#ECEFF1', + choices: null, + format: false, + }, + locked: true, + options: { + choices: ['GET', 'POST'], + }, + sort: 2, + width: 'half', + }, + { + collection: 'directus_webhooks', + field: 'url', + interface: 'text-input', + locked: true, + options: { + iconRight: 'link', + }, + sort: 3, + width: 'half', + }, + { + collection: 'directus_webhooks', + field: 'status', + interface: 'dropdown', + display: 'labels', + display_options: { + defaultColor: '#B0BEC5', + defaultBackground: '#ECEFF1', + showAsDot: true, + choices: [ + { + text: 'Active', + value: 'active', + foreground: '#607D8B', + background: '#2F80ED', + }, + { + text: 'Inactive', + value: 'inactive', + foreground: '#607D8B', + background: '#ECEFF1', + }, + ], + }, + locked: true, + options: { + choices: [ + { + text: 'Active', + value: 'active', + }, + { + text: 'Inactive', + value: 'inactive', + }, + ], + }, + sort: 4, + width: 'half', + }, + { + collection: 'directus_webhooks', + field: 'data', + interface: 'toggle', + locked: true, + options: { + label: 'Send Event Data', + }, + special: 'boolean', + sort: 5, + width: 'half', + }, + { + collection: 'directus_webhooks', + field: 'triggers_divider', + interface: 'divider', + options: { + icon: 'api', + title: 'Triggers', + color: '#2F80ED', + }, + special: 'alias', + sort: 6, + width: 'full', + }, + { + collection: 'directus_webhooks', + field: 'actions', + interface: 'checkboxes', + options: { + choices: [ + { + text: 'Create', + value: 'create', + }, + { + text: 'Update', + value: 'update', + }, + { + text: 'Delete', + value: 'delete', + }, + ], + }, + special: 'csv', + sort: 7, + width: 'full', + }, + { + collection: 'directus_webhooks', + field: 'collections', + interface: 'collections', + special: 'csv', + sort: 8, + width: 'full', + }, + { + collection: 'directus_activity', + field: 'action', + display: 'labels', + display_options: { + defaultForeground: '#263238', + defaultBackground: '#eceff1', + choices: [ + { + text: 'Create', + value: 'create', + foreground: '#27ae60', + background: '#c9ebd7', + }, + { + text: 'Update', + value: 'update', + foreground: '#2f80ed', + background: '#cbdffb', + }, + { + text: 'Delete', + value: 'delete', + foreground: '#eb5757', + background: '#fad5d5', + }, + { + text: 'Login', + value: 'authenticate', + foreground: '#9b51e0', + background: '#e6d3f7', + }, + ], + }, + }, + { + collection: 'directus_activity', + field: 'collection', + display: 'collection', + display_options: { + icon: true, + }, + }, + { + collection: 'directus_activity', + field: 'timestamp', + display: 'datetime', + options: { + relative: true, + }, + }, + { + collection: 'directus_activity', + field: 'user', + display: 'user', + }, + { + collection: 'directus_activity', + field: 'comment', + display: 'formatted-text', + display_options: { + subdued: true, + }, + }, + { + collection: 'directus_activity', + field: 'user_agent', + display: 'formatted-text', + display_options: { + font: 'monospace', + }, + }, + { + collection: 'directus_activity', + field: 'ip', + display: 'formatted-text', + display_options: { + font: 'monospace', + }, + }, + { + collection: 'directus_activity', + field: 'revisions', + interface: 'one-to-many', + locked: true, + special: 'o2m', + options: { + fields: ['collection', 'item'], + }, + width: 'full', + }, + { + collection: 'directus_relations', + field: 'one_allowed_collections', + locked: true, + special: 'csv', + }, +].map((row) => { + for (const [key, value] of Object.entries(row)) { + if (value !== null && (typeof value === 'object' || Array.isArray(value))) { + (row as any)[key] = JSON.stringify(value); + } + } + + return merge({}, defaults, row); +}); + +export async function up(knex: Knex) { + const fieldKeys = uniq(systemFields.map((field: any) => field.field)); + + await knex('directus_fields').delete().where('collection', 'like', 'directus_%').whereIn('field', fieldKeys); +} + +export async function down(knex: Knex) { + await knex.insert(systemFields).into('directus_fields'); +} diff --git a/api/src/database/migrations/20201105A-add-cascade-system-relations.ts b/api/src/database/migrations/20201105A-add-cascade-system-relations.ts new file mode 100644 index 0000000000..612d762aca --- /dev/null +++ b/api/src/database/migrations/20201105A-add-cascade-system-relations.ts @@ -0,0 +1,152 @@ +import Knex from 'knex'; + +const updates = [ + { + table: 'directus_fields', + constraints: [ + { + column: 'group', + references: 'directus_fields.id', + onDelete: 'SET NULL', + }, + ], + }, + { + table: 'directus_files', + constraints: [ + { + column: 'folder', + references: 'directus_folders.id', + onDelete: 'SET NULL', + }, + { + column: 'uploaded_by', + references: 'directus_users.id', + onDelete: 'SET NULL', + }, + { + column: 'modified_by', + references: 'directus_users.id', + onDelete: 'SET NULL', + }, + ], + }, + { + table: 'directus_folders', + constraints: [ + { + column: 'parent', + references: 'directus_folders.id', + onDelete: 'CASCADE', + }, + ], + }, + { + table: 'directus_permissions', + constraints: [ + { + column: 'role', + references: 'directus_roles.id', + onDelete: 'CASCADE', + }, + ], + }, + { + table: 'directus_presets', + constraints: [ + { + column: 'user', + references: 'directus_users.id', + onDelete: 'CASCADE', + }, + { + column: 'role', + references: 'directus_roles.id', + onDelete: 'CASCADE', + }, + ], + }, + { + table: 'directus_revisions', + constraints: [ + { + column: 'activity', + references: 'directus_activity.id', + onDelete: 'CASCADE', + }, + { + column: 'parent', + references: 'directus_revisions.id', + onDelete: 'SET NULL', + }, + ], + }, + { + table: 'directus_sessions', + constraints: [ + { + column: 'user', + references: 'directus_users.id', + onDelete: 'CASCADE', + }, + ], + }, + { + table: 'directus_settings', + constraints: [ + { + column: 'project_logo', + references: 'directus_files.id', + onDelete: 'SET NULL', + }, + { + column: 'public_foreground', + references: 'directus_files.id', + onDelete: 'SET NULL', + }, + { + column: 'public_background', + references: 'directus_files.id', + onDelete: 'SET NULL', + }, + ], + }, + { + table: 'directus_users', + constraints: [ + { + column: 'role', + references: 'directus_roles.id', + onDelete: 'SET NULL', + }, + ], + }, +]; + +export async function up(knex: Knex) { + for (const update of updates) { + await knex.schema.alterTable(update.table, (table) => { + for (const constraint of update.constraints) { + table.dropForeign([constraint.column]); + + table + .foreign(constraint.column) + .references(constraint.references) + .onUpdate('CASCADE') + .onDelete(constraint.onDelete); + } + }); + } +} + +export async function down(knex: Knex) { + for (const update of updates) { + await knex.schema.alterTable(update.table, (table) => { + for (const constraint of update.constraints) { + table.dropForeign([constraint.column]); + + table.foreign(constraint.column).references(constraint.references).onUpdate('NO ACTION').onDelete('NO ACTION'); + } + }); + } +} diff --git a/api/src/database/migrations/20201105B-change-webhook-url-type.ts b/api/src/database/migrations/20201105B-change-webhook-url-type.ts new file mode 100644 index 0000000000..ffdc671bf1 --- /dev/null +++ b/api/src/database/migrations/20201105B-change-webhook-url-type.ts @@ -0,0 +1,13 @@ +import Knex from 'knex'; + +export async function up(knex: Knex) { + await knex.schema.alterTable('directus_webhooks', (table) => { + table.text('url').alter(); + }); +} + +export async function down(knex: Knex) { + await knex.schema.alterTable('directus_webhooks', (table) => { + table.string('url').alter(); + }); +} diff --git a/api/src/database/migrations/run.ts b/api/src/database/migrations/run.ts index 6c3fece8f2..b0f1c4f776 100644 --- a/api/src/database/migrations/run.ts +++ b/api/src/database/migrations/run.ts @@ -2,6 +2,7 @@ import fse from 'fs-extra'; import Knex from 'knex'; import path from 'path'; import formatTitle from '@directus/format-title'; +import env from '../../env'; type Migration = { version: string; @@ -11,25 +12,34 @@ type Migration = { export default async function run(database: Knex, direction: 'up' | 'down' | 'latest') { let migrationFiles = await fse.readdir(__dirname); - migrationFiles = migrationFiles.filter((file: string) => file !== 'run.ts'); - const completedMigrations = await database - .select('*') - .from('directus_migrations') - .orderBy('version'); + const customMigrationsPath = path.resolve(env.EXTENSIONS_PATH, 'migrations'); + const customMigrationFiles = + ((await fse.pathExists(customMigrationsPath)) && (await fse.readdir(customMigrationsPath))) || []; - const migrations = migrationFiles.map((migrationFile) => { - const version = migrationFile.split('-')[0]; - const name = formatTitle(migrationFile.split('-').slice(1).join('_').split('.')[0]); + migrationFiles = migrationFiles.filter( + (file: string) => file.startsWith('run') === false && file.endsWith('.d.ts') === false + ); + + const completedMigrations = await database.select('*').from('directus_migrations').orderBy('version'); + + const migrations = [ + ...migrationFiles.map((path) => parseFilePath(path)), + ...customMigrationFiles.map((path) => parseFilePath(path, true)), + ]; + + function parseFilePath(filePath: string, custom: boolean = false) { + const version = filePath.split('-')[0]; + const name = formatTitle(filePath.split('-').slice(1).join('_').split('.')[0]); const completed = !!completedMigrations.find((migration) => migration.version === version); return { - file: migrationFile, + file: custom ? path.join(customMigrationsPath, filePath) : path.join(__dirname, filePath), version, name, completed, }; - }); + } if (direction === 'up') await up(); if (direction === 'down') await down(); @@ -52,11 +62,9 @@ export default async function run(database: Knex, direction: 'up' | 'down' | 'la throw Error('Nothing to upgrade'); } - const { up } = require(path.join(__dirname, nextVersion.file)); + const { up } = require(nextVersion.file); await up(database); - await database - .insert({ version: nextVersion.version, name: nextVersion.name }) - .into('directus_migrations'); + await database.insert({ version: nextVersion.version, name: nextVersion.name }).into('directus_migrations'); } async function down() { @@ -66,15 +74,13 @@ export default async function run(database: Knex, direction: 'up' | 'down' | 'la throw Error('Nothing to downgrade'); } - const migration = migrations.find( - (migration) => migration.version === currentVersion.version - ); + const migration = migrations.find((migration) => migration.version === currentVersion.version); if (!migration) { throw new Error('Couldnt find migration'); } - const { down } = require(path.join(__dirname, migration.file)); + const { down } = require(migration.file); await down(database); await database('directus_migrations').delete().where({ version: migration.version }); } @@ -82,11 +88,9 @@ export default async function run(database: Knex, direction: 'up' | 'down' | 'la async function latest() { for (const migration of migrations) { if (migration.completed === false) { - const { up } = require(path.join(__dirname, migration.file)); + const { up } = require(migration.file); await up(database); - await database - .insert({ version: migration.version, name: migration.name }) - .into('directus_migrations'); + await database.insert({ version: migration.version, name: migration.name }).into('directus_migrations'); } } } diff --git a/api/src/database/run-ast.ts b/api/src/database/run-ast.ts index 41d300864a..b2a86677ee 100644 --- a/api/src/database/run-ast.ts +++ b/api/src/database/run-ast.ts @@ -1,8 +1,7 @@ -import { AST, NestedCollectionNode, FieldNode, M2ONode, O2MNode } from '../types/ast'; +import { AST, NestedCollectionNode, FieldNode } from '../types/ast'; import { clone, cloneDeep, uniq, pick } from 'lodash'; import database from './index'; -import SchemaInspector from 'knex-schema-inspector'; -import { Query, Item } from '../types'; +import { Query, Item, SchemaOverview } from '../types'; import { PayloadService } from '../services/payload'; import applyQuery from '../utils/apply-query'; import Knex, { QueryBuilder } from 'knex'; @@ -16,6 +15,7 @@ type RunASTOptions = { export default async function runAST( originalAST: AST | NestedCollectionNode, + schema: SchemaOverview, options?: RunASTOptions ): Promise { const ast = cloneDeep(originalAST); @@ -26,11 +26,7 @@ export default async function runAST( const results: { [collection: string]: null | Item | Item[] } = {}; for (const collection of ast.names) { - results[collection] = await run( - collection, - ast.children[collection], - ast.query[collection] - ); + results[collection] = await run(collection, ast.children[collection], ast.query[collection]); } return results; @@ -38,27 +34,23 @@ export default async function runAST( return await run(ast.name, ast.children, options?.query || ast.query); } - async function run( - collection: string, - children: (NestedCollectionNode | FieldNode)[], - query: Query - ) { + async function run(collection: string, children: (NestedCollectionNode | FieldNode)[], query: Query) { // Retrieve the database columns to select in the current AST const { columnsToSelect, primaryKeyField, nestedCollectionNodes } = await parseCurrentLevel( collection, children, - knex + schema ); // The actual knex query builder instance. This is a promise that resolves with the raw items from the db - const dbQuery = await getDBQuery(knex, collection, columnsToSelect, query, primaryKeyField); + const dbQuery = await getDBQuery(knex, collection, columnsToSelect, query, primaryKeyField, schema); const rawItems: Item | Item[] = await dbQuery; if (!rawItems) return null; // Run the items through the special transforms - const payloadService = new PayloadService(collection, { knex }); + const payloadService = new PayloadService(collection, { knex, schema }); let items: null | Item | Item[] = await payloadService.processValues('read', rawItems); if (!items || items.length === 0) return items; @@ -73,15 +65,16 @@ export default async function runAST( // all nested items for all parent items at once. Because of this, we can't limit that query // to the "standard" item limit. Instead of _n_ nested items per parent item, it would mean // that there's _n_ items, which are then divided on the parent items. (no good) - if (nestedNode.type === 'o2m' && typeof nestedNode.query.limit === 'number') { - tempLimit = nestedNode.query.limit; + if (nestedNode.type === 'o2m') { + tempLimit = nestedNode.query.limit || 100; nestedNode.query.limit = -1; } - let nestedItems = await runAST(nestedNode, { knex, child: true }); + let nestedItems = await runAST(nestedNode, schema, { knex, child: true }); if (nestedItems) { // Merge all fetched nested records with the parent items + items = mergeWithParentItems(nestedItems, items, nestedNode, tempLimit); } } @@ -101,15 +94,10 @@ export default async function runAST( async function parseCurrentLevel( collection: string, children: (NestedCollectionNode | FieldNode)[], - knex: Knex + schema: SchemaOverview ) { - const schemaInspector = SchemaInspector(knex); - - const primaryKeyField = await schemaInspector.primary(collection); - - const columnsInCollection = (await schemaInspector.columns(collection)).map( - ({ column }) => column - ); + const primaryKeyField = schema[collection].primary; + const columnsInCollection = Object.keys(schema[collection].columns); const columnsToSelect: string[] = []; const nestedCollectionNodes: NestedCollectionNode[] = []; @@ -150,7 +138,8 @@ async function getDBQuery( table: string, columns: string[], query: Query, - primaryKeyField: string + primaryKeyField: string, + schema: SchemaOverview ): Promise { let dbQuery = knex.select(columns.map((column) => `${table}.${column}`)).from(table); @@ -164,15 +153,12 @@ async function getDBQuery( query.sort = query.sort || [{ column: primaryKeyField, order: 'asc' }]; - await applyQuery(table, dbQuery, queryCopy); + await applyQuery(knex, table, dbQuery, queryCopy, schema); return dbQuery; } -function applyParentFilters( - nestedCollectionNodes: NestedCollectionNode[], - parentItem: Item | Item[] -) { +function applyParentFilters(nestedCollectionNodes: NestedCollectionNode[], parentItem: Item | Item[]) { const parentItems = toArray(parentItem); for (const nestedNode of nestedCollectionNodes) { @@ -184,9 +170,7 @@ function applyParentFilters( filter: { ...(nestedNode.query.filter || {}), [nestedNode.relation.one_primary!]: { - _in: uniq( - parentItems.map((res) => res[nestedNode.relation.many_field]) - ).filter((id) => id), + _in: uniq(parentItems.map((res) => res[nestedNode.relation.many_field])).filter((id) => id), }, }, }; @@ -204,9 +188,7 @@ function applyParentFilters( filter: { ...(nestedNode.query.filter || {}), [nestedNode.relation.many_field]: { - _in: uniq(parentItems.map((res) => res[nestedNode.parentKey])).filter( - (id) => id - ), + _in: uniq(parentItems.map((res) => res[nestedNode.parentKey])).filter((id) => id), }, }, }; @@ -252,9 +234,7 @@ function mergeWithParentItems( if (nestedNode.type === 'm2o') { for (const parentItem of parentItems) { const itemChild = nestedItems.find((nestedItem) => { - return ( - nestedItem[nestedNode.relation.one_primary!] === parentItem[nestedNode.fieldKey] - ); + return nestedItem[nestedNode.relation.one_primary!] == parentItem[nestedNode.fieldKey]; }); parentItem[nestedNode.fieldKey] = itemChild || null; @@ -266,11 +246,9 @@ function mergeWithParentItems( if (Array.isArray(nestedItem[nestedNode.relation.many_field])) return true; return ( - nestedItem[nestedNode.relation.many_field] === - parentItem[nestedNode.relation.one_primary!] || - nestedItem[nestedNode.relation.many_field]?.[ - nestedNode.relation.many_primary - ] === parentItem[nestedNode.relation.one_primary!] + nestedItem[nestedNode.relation.many_field] == parentItem[nestedNode.relation.one_primary!] || + nestedItem[nestedNode.relation.many_field]?.[nestedNode.relation.one_primary!] == + parentItem[nestedNode.relation.one_primary!] ); }); @@ -286,14 +264,9 @@ function mergeWithParentItems( for (const parentItem of parentItems) { const relatedCollection = parentItem[nestedNode.relation.one_collection_field!]; - const itemChild = (nestedItem as Record)[relatedCollection].find( - (nestedItem) => { - return ( - nestedItem[nestedNode.relatedKey[relatedCollection]] === - parentItem[nestedNode.fieldKey] - ); - } - ); + const itemChild = (nestedItem as Record)[relatedCollection].find((nestedItem) => { + return nestedItem[nestedNode.relatedKey[relatedCollection]] == parentItem[nestedNode.fieldKey]; + }); parentItem[nestedNode.fieldKey] = itemChild || null; } @@ -317,8 +290,7 @@ function removeTemporaryFields( for (const relatedCollection of ast.names) { if (!fields[relatedCollection]) fields[relatedCollection] = []; - if (!nestedCollectionNodes[relatedCollection]) - nestedCollectionNodes[relatedCollection] = []; + if (!nestedCollectionNodes[relatedCollection]) nestedCollectionNodes[relatedCollection] = []; for (const child of ast.children[relatedCollection]) { if (child.type === 'field') { @@ -346,10 +318,7 @@ function removeTemporaryFields( ); } - item = - fields[relatedCollection].length > 0 - ? pick(rawItem, fields[relatedCollection]) - : rawItem[primaryKeyField]; + item = fields[relatedCollection].length > 0 ? pick(rawItem, fields[relatedCollection]) : rawItem[primaryKeyField]; items.push(item); } @@ -375,9 +344,7 @@ function removeTemporaryFields( item[nestedNode.fieldKey] = removeTemporaryFields( item[nestedNode.fieldKey], nestedNode, - nestedNode.type === 'm2o' - ? nestedNode.relation.one_primary! - : nestedNode.relation.many_primary, + nestedNode.type === 'm2o' ? nestedNode.relation.one_primary! : nestedNode.relation.many_primary, item ); } diff --git a/api/src/database/seeds/01-tables/01-collections.yaml b/api/src/database/seeds/01-collections.yaml similarity index 100% rename from api/src/database/seeds/01-tables/01-collections.yaml rename to api/src/database/seeds/01-collections.yaml diff --git a/api/src/database/seeds/01-tables/02-roles.yaml b/api/src/database/seeds/02-roles.yaml similarity index 100% rename from api/src/database/seeds/01-tables/02-roles.yaml rename to api/src/database/seeds/02-roles.yaml diff --git a/api/src/database/seeds/02-rows/02-permissions.yaml b/api/src/database/seeds/02-rows/02-permissions.yaml deleted file mode 100644 index 4b32d9ede6..0000000000 --- a/api/src/database/seeds/02-rows/02-permissions.yaml +++ /dev/null @@ -1,17 +0,0 @@ -table: directus_permissions - -defaults: - role: null - collection: null - action: null - permissions: null - validation: null - presets: null - fields: null - limit: null - -data: - - collection: directus_settings - action: read - permissions: {} - fields: 'project_name,project_logo,project_color,public_foreground,public_background,public_note,custom_css' diff --git a/api/src/database/seeds/02-rows/03-presets.yaml b/api/src/database/seeds/02-rows/03-presets.yaml deleted file mode 100644 index df9e909390..0000000000 --- a/api/src/database/seeds/02-rows/03-presets.yaml +++ /dev/null @@ -1,84 +0,0 @@ -table: directus_presets - -defaults: - bookmark: null - user: null - role: null - collection: null - search: null - filters: '[]' - layout: tabular - layout_query: null - layout_options: null - -data: - - collection: directus_files - layout: cards - layout_query: - cards: - sort: -uploaded_on - layout_options: - cards: - icon: insert_drive_file - title: '{{ title }}' - subtitle: '{{ type }} • {{ filesize }}' - size: 4 - imageFit: crop - - - collection: directus_users - layout: cards - layout_options: - cards: - icon: account_circle - title: '{{ first_name }} {{ last_name }}' - subtitle: '{{ email }}' - size: 4 - - - collection: directus_activity - layout: tabular - layout_query: - tabular: - sort: -timestamp - fields: - - action - - collection - - timestamp - - user - layout_options: - tabular: - widths: - action: 100 - collection: 210 - timestamp: 240 - user: 240 - - - collection: directus_webhooks - layout: tabular - layout_query: - tabular: - fields: - - status - - name - - method - - url - layout_options: - tabular: - widths: - status: 36 - name: 300 - - - collection: directus_roles - layout: tabular - layout_query: - tabular: - fields: - - icon - - name - - description - layout_options: - tabular: - widths: - icon: 36 - name: 248 - description: 500 - diff --git a/api/src/database/seeds/03-fields/03-fields.yaml b/api/src/database/seeds/03-fields/03-fields.yaml deleted file mode 100644 index 29c1c301f6..0000000000 --- a/api/src/database/seeds/03-fields/03-fields.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# directus_fields isn't surfaced in the app -table: directus_fields - -fields: - - collection: directus_fields - field: options - hidden: true - locked: true - special: json - - collection: directus_fields - field: display_options - hidden: true - locked: true - special: json - - collection: directus_fields - field: locked - hidden: true - locked: true - special: boolean - - collection: directus_fields - field: readonly - hidden: true - locked: true - special: boolean - - collection: directus_fields - field: hidden - hidden: true - locked: true - special: boolean - - collection: directus_fields - field: special - hidden: true - locked: true - special: csv - - collection: directus_fields - field: translations - hidden: true - locked: true - special: json diff --git a/api/src/database/seeds/03-fields/03-users.yaml b/api/src/database/seeds/03-fields/03-users.yaml deleted file mode 100644 index ae4521b9f5..0000000000 --- a/api/src/database/seeds/03-fields/03-users.yaml +++ /dev/null @@ -1,227 +0,0 @@ -table: directus_users - -fields: - - collection: directus_users - field: first_name - interface: text-input - locked: true - options: - iconRight: account_circle - sort: 1 - width: half - - collection: directus_users - field: last_name - interface: text-input - locked: true - options: - iconRight: account_circle - sort: 2 - width: half - - collection: directus_users - field: email - interface: text-input - locked: true - options: - iconRight: email - sort: 3 - width: half - - collection: directus_users - field: password - special: hash, conceal - interface: hash - locked: true - options: - iconRight: lock - masked: true - sort: 4 - width: half - - collection: directus_users - field: avatar - interface: file - locked: true - sort: 5 - width: full - - collection: directus_users - field: location - interface: text-input - options: - iconRight: place - sort: 6 - width: half - - collection: directus_users - field: title - interface: text-input - options: - iconRight: work - sort: 7 - width: half - - collection: directus_users - field: description - interface: textarea - sort: 8 - width: full - - collection: directus_users - field: tags - interface: tags - special: json - sort: 9 - width: full - options: - iconRight: local_offer - - collection: directus_users - field: preferences_divider - interface: divider - options: - icon: face - title: User Preferences - color: '#2F80ED' - special: alias - sort: 10 - width: full - - collection: directus_users - field: language - interface: dropdown - locked: true - options: - choices: - - text: Afrikaans (South Africa) - value: af-ZA - - text: Arabic (Saudi Arabia) - value: ar-SA - - text: Catalan (Spain) - value: ca-ES - - text: Chinese (Simplified) - value: zh-CN - - text: Czech (Czech Republic) - value: cs-CZ - - text: Danish (Denmark) - value: da-DK - - text: Dutch (Netherlands) - value: nl-NL - - text: English (United States) - value: en-US - - text: Finnish (Finland) - value: fi-FI - - text: French (France) - value: fr-FR - - text: German (Germany) - value: de-DE - - text: Greek (Greece) - value: el-GR - - text: Hebrew (Israel) - value: he-IL - - text: Hungarian (Hungary) - value: hu-HU - - text: Icelandic (Iceland) - value: is-IS - - text: Indonesian (Indonesia) - value: id-ID - - text: Italian (Italy) - value: it-IT - - text: Japanese (Japan) - value: ja-JP - - text: Korean (Korea) - value: ko-KR - - text: Malay (Malaysia) - value: ms-MY - - text: Norwegian (Norway) - value: no-NO - - text: Polish (Poland) - value: pl-PL - - text: Portuguese (Brazil) - value: pt-BR - - text: Portuguese (Portugal) - value: pt-PT - - text: Russian (Russian Federation) - value: ru-RU - - text: Spanish (Spain) - value: es-ES - - text: Spanish (Latin America) - value: es-419 - - text: Taiwanese Mandarin (Taiwan) - value: zh-TW - - text: Turkish (Turkey) - value: tr-TR - - text: Ukrainian (Ukraine) - value: uk-UA - - text: Vietnamese (Vietnam) - value: vi-VN - sort: 11 - width: half - - collection: directus_users - field: theme - interface: dropdown - locked: true - options: - choices: - - value: auto - text: Automatic (Based on System) - - value: light - text: Light Mode - - value: dark - text: Dark Mode - sort: 12 - width: half - - collection: directus_users - field: tfa_secret - interface: tfa-setup - locked: true - special: conceal - sort: 13 - width: half - - collection: directus_users - field: admin_divider - interface: divider - locked: true - options: - icon: verified_user - title: Admin Options - color: '#F2994A' - special: alias - sort: 14 - width: full - - collection: directus_users - field: status - interface: dropdown - locked: true - options: - choices: - - text: Draft - value: draft - - text: Invited - value: invited - - text: Active - value: active - - text: Suspended - value: suspended - - text: Archived - value: archived - sort: 15 - width: half - - collection: directus_users - field: role - interface: many-to-one - locked: true - options: - template: '{{ name }}' - special: m2o - sort: 16 - width: half - - collection: directus_users - field: token - interface: token - locked: true - options: - iconRight: vpn_key - placeholder: Enter a secure access token... - sort: 17 - width: full - - collection: directus_users - field: id - special: uuid - interface: text-input - locked: true - options: - iconRight: vpn_key - sort: 18 - width: full diff --git a/api/src/database/seeds/03-fields/04-folders.yaml b/api/src/database/seeds/03-fields/04-folders.yaml deleted file mode 100644 index f7530685d2..0000000000 --- a/api/src/database/seeds/03-fields/04-folders.yaml +++ /dev/null @@ -1,8 +0,0 @@ -table: directus_folders - -fields: - - collection: directus_folders - field: id - interface: text-input - locked: true - special: uuid diff --git a/api/src/database/seeds/03-fields/06-permissions.yaml b/api/src/database/seeds/03-fields/06-permissions.yaml deleted file mode 100644 index 96b2011385..0000000000 --- a/api/src/database/seeds/03-fields/06-permissions.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# directus_permissions isn't surfaced in the app -table: directus_permissions - -fields: - - collection: directus_permissions - field: permissions - hidden: true - locked: true - special: json - - collection: directus_permissions - field: presets - hidden: true - locked: true - special: json diff --git a/api/src/database/seeds/03-fields/07-presets.yaml b/api/src/database/seeds/03-fields/07-presets.yaml deleted file mode 100644 index d17e55592d..0000000000 --- a/api/src/database/seeds/03-fields/07-presets.yaml +++ /dev/null @@ -1,19 +0,0 @@ -table: directus_presets - -fields: - # directus_presets isn't surfaced in the app - - collection: directus_presets - field: filters - hidden: true - locked: true - special: json - - collection: directus_presets - field: layout_query - hidden: true - locked: true - special: json - - collection: directus_presets - field: layout_options - hidden: true - locked: true - special: json diff --git a/api/src/database/seeds/03-fields/08-revisions.yaml b/api/src/database/seeds/03-fields/08-revisions.yaml deleted file mode 100644 index a50c414401..0000000000 --- a/api/src/database/seeds/03-fields/08-revisions.yaml +++ /dev/null @@ -1,14 +0,0 @@ -table: directus_revisions - -fields: - # directus_revisions isn't surfaced in the app - - collection: directus_revisions - field: data - hidden: true - locked: true - special: json - - collection: directus_revisions - field: delta - hidden: true - locked: true - special: json diff --git a/api/src/database/seeds/03-fields/12-relations.yaml b/api/src/database/seeds/03-fields/12-relations.yaml deleted file mode 100644 index f7fc89e427..0000000000 --- a/api/src/database/seeds/03-fields/12-relations.yaml +++ /dev/null @@ -1,7 +0,0 @@ -table: directus_relations - -fields: - - collection: directus_relations - field: one_allowed_collections - locked: true - special: csv diff --git a/api/src/database/seeds/01-tables/03-users.yaml b/api/src/database/seeds/03-users.yaml similarity index 100% rename from api/src/database/seeds/01-tables/03-users.yaml rename to api/src/database/seeds/03-users.yaml diff --git a/api/src/database/seeds/01-tables/04-fields.yaml b/api/src/database/seeds/04-fields.yaml similarity index 100% rename from api/src/database/seeds/01-tables/04-fields.yaml rename to api/src/database/seeds/04-fields.yaml diff --git a/api/src/database/seeds/01-tables/05-activity.yaml b/api/src/database/seeds/05-activity.yaml similarity index 100% rename from api/src/database/seeds/01-tables/05-activity.yaml rename to api/src/database/seeds/05-activity.yaml diff --git a/api/src/database/seeds/01-tables/06-folders.yaml b/api/src/database/seeds/06-folders.yaml similarity index 100% rename from api/src/database/seeds/01-tables/06-folders.yaml rename to api/src/database/seeds/06-folders.yaml diff --git a/api/src/database/seeds/01-tables/07-files.yaml b/api/src/database/seeds/07-files.yaml similarity index 100% rename from api/src/database/seeds/01-tables/07-files.yaml rename to api/src/database/seeds/07-files.yaml diff --git a/api/src/database/seeds/01-tables/08-permissions.yaml b/api/src/database/seeds/08-permissions.yaml similarity index 100% rename from api/src/database/seeds/01-tables/08-permissions.yaml rename to api/src/database/seeds/08-permissions.yaml diff --git a/api/src/database/seeds/01-tables/09-presets.yaml b/api/src/database/seeds/09-presets.yaml similarity index 100% rename from api/src/database/seeds/01-tables/09-presets.yaml rename to api/src/database/seeds/09-presets.yaml diff --git a/api/src/database/seeds/01-tables/10-relations.yaml b/api/src/database/seeds/10-relations.yaml similarity index 100% rename from api/src/database/seeds/01-tables/10-relations.yaml rename to api/src/database/seeds/10-relations.yaml diff --git a/api/src/database/seeds/01-tables/11-revisions.yaml b/api/src/database/seeds/11-revisions.yaml similarity index 100% rename from api/src/database/seeds/01-tables/11-revisions.yaml rename to api/src/database/seeds/11-revisions.yaml diff --git a/api/src/database/seeds/01-tables/12-sessions.yaml b/api/src/database/seeds/12-sessions.yaml similarity index 100% rename from api/src/database/seeds/01-tables/12-sessions.yaml rename to api/src/database/seeds/12-sessions.yaml diff --git a/api/src/database/seeds/01-tables/13-settings.yaml b/api/src/database/seeds/13-settings.yaml similarity index 100% rename from api/src/database/seeds/01-tables/13-settings.yaml rename to api/src/database/seeds/13-settings.yaml diff --git a/api/src/database/seeds/01-tables/14-webhooks.yaml b/api/src/database/seeds/14-webhooks.yaml similarity index 100% rename from api/src/database/seeds/01-tables/14-webhooks.yaml rename to api/src/database/seeds/14-webhooks.yaml diff --git a/api/src/database/seeds/01-tables/15-migrations.yaml b/api/src/database/seeds/15-migrations.yaml similarity index 100% rename from api/src/database/seeds/01-tables/15-migrations.yaml rename to api/src/database/seeds/15-migrations.yaml diff --git a/api/src/database/seeds/run.ts b/api/src/database/seeds/run.ts index 35f653b5fa..efaedd1ec7 100644 --- a/api/src/database/seeds/run.ts +++ b/api/src/database/seeds/run.ts @@ -25,33 +25,6 @@ type TableSeed = { }; }; -type RowSeed = { - table: string; - defaults: Record; - data: Record[]; -}; - -type FieldSeed = { - table: string; - fields: { - collection: string; - field: string; - special: string | null; - interface: string | null; - options: Record | null; - display: string | null; - display_options: Record | null; - locked: boolean; - readonly: boolean; - hidden: boolean; - sort: number | null; - width: string | null; - group: number | null; - translations: Record | null; - note: string | null; - }[]; -}; - export default async function runSeed(database: Knex) { const exists = await database.schema.hasTable('directus_collections'); @@ -59,19 +32,13 @@ export default async function runSeed(database: Knex) { throw new Error('Database is already installed'); } - await createTables(database); - await insertRows(database); - await insertFields(database); -} - -async function createTables(database: Knex) { - const tableSeeds = await fse.readdir(path.resolve(__dirname, './01-tables/')); + const tableSeeds = await fse.readdir(path.resolve(__dirname)); for (const tableSeedFile of tableSeeds) { - const yamlRaw = await fse.readFile( - path.resolve(__dirname, './01-tables', tableSeedFile), - 'utf8' - ); + if (tableSeedFile.startsWith('run')) continue; + + const yamlRaw = await fse.readFile(path.resolve(__dirname, tableSeedFile), 'utf8'); + const seedData = yaml.safeLoad(yamlRaw) as TableSeed; await database.schema.createTable(seedData.table, (tableBuilder) => { @@ -119,70 +86,9 @@ async function createTables(database: Knex) { } if (columnInfo.references) { - tableBuilder - .foreign(columnName) - .references(columnInfo.references.column) - .inTable(columnInfo.references.table); + column.references(columnInfo.references.column).inTable(columnInfo.references.table); } } }); } } - -async function insertRows(database: Knex) { - const rowSeeds = await fse.readdir(path.resolve(__dirname, './02-rows/')); - - for (const rowSeedFile of rowSeeds) { - const yamlRaw = await fse.readFile( - path.resolve(__dirname, './02-rows', rowSeedFile), - 'utf8' - ); - const seedData = yaml.safeLoad(yamlRaw) as RowSeed; - - const dataWithDefaults = seedData.data.map((row) => { - for (const [key, value] of Object.entries(row)) { - if (value !== null && (typeof value === 'object' || Array.isArray(value))) { - row[key] = JSON.stringify(value); - } - } - - return merge({}, seedData.defaults, row); - }); - - await database.batchInsert(seedData.table, dataWithDefaults); - } -} - -async function insertFields(database: Knex) { - const fieldSeeds = await fse.readdir(path.resolve(__dirname, './03-fields/')); - - const defaultsYaml = await fse.readFile( - path.resolve(__dirname, './03-fields/_defaults.yaml'), - 'utf8' - ); - const defaults = yaml.safeLoad(defaultsYaml) as FieldSeed; - - for (const fieldSeedFile of fieldSeeds) { - const yamlRaw = await fse.readFile( - path.resolve(__dirname, './03-fields', fieldSeedFile), - 'utf8' - ); - const seedData = yaml.safeLoad(yamlRaw) as FieldSeed; - - if (fieldSeedFile === '_defaults.yaml') { - continue; - } - - const dataWithDefaults = seedData.fields.map((row) => { - for (const [key, value] of Object.entries(row)) { - if (value !== null && (typeof value === 'object' || Array.isArray(value))) { - (row as any)[key] = JSON.stringify(value); - } - } - - return merge({}, defaults, row); - }); - - await database.batchInsert('directus_fields', dataWithDefaults); - } -} diff --git a/api/src/database/seeds/02-rows/01-collections.yaml b/api/src/database/system-data/collections/collections.yaml similarity index 88% rename from api/src/database/seeds/02-rows/01-collections.yaml rename to api/src/database/system-data/collections/collections.yaml index 338cb03bfb..a1971dcbbe 100644 --- a/api/src/database/seeds/02-rows/01-collections.yaml +++ b/api/src/database/system-data/collections/collections.yaml @@ -21,8 +21,12 @@ data: - collection: directus_files icon: folder note: Metadata for all managed file assets + display_template: "{{ title }}" - collection: directus_folders note: Provides virtual directories for files + display_template: "{{ name }}" + - collection: directus_migrations + note: What version of the database you're using - collection: directus_permissions icon: admin_panel_settings note: Access permissions for each role @@ -48,5 +52,6 @@ data: unarchive_value: draft icon: people_alt note: System users for the platform + display_template: "{{ first_name }} {{ last_name }}" - collection: directus_webhooks note: Configuration for event-based HTTP requests diff --git a/api/src/database/system-data/collections/index.ts b/api/src/database/system-data/collections/index.ts new file mode 100644 index 0000000000..8ba45f31a7 --- /dev/null +++ b/api/src/database/system-data/collections/index.ts @@ -0,0 +1,9 @@ +import { requireYAML } from '../../../utils/require-yaml'; +import { merge } from 'lodash'; +import { CollectionMeta } from '../../../types'; + +const systemData = requireYAML(require.resolve('./collections.yaml')); + +export const systemCollectionRows: CollectionMeta[] = systemData.data.map((row: Record) => { + return merge({ system: true }, systemData.defaults, row); +}); diff --git a/api/src/database/seeds/03-fields/_defaults.yaml b/api/src/database/system-data/fields/_defaults.yaml similarity index 100% rename from api/src/database/seeds/03-fields/_defaults.yaml rename to api/src/database/system-data/fields/_defaults.yaml diff --git a/api/src/database/seeds/03-fields/11-activity.yaml b/api/src/database/system-data/fields/activity.yaml similarity index 69% rename from api/src/database/seeds/03-fields/11-activity.yaml rename to api/src/database/system-data/fields/activity.yaml index 58705367c7..4452972ff3 100644 --- a/api/src/database/seeds/03-fields/11-activity.yaml +++ b/api/src/database/system-data/fields/activity.yaml @@ -1,8 +1,13 @@ table: directus_activity fields: - - collection: directus_activity - field: action + - field: id + width: half + + - field: item + width: half + + - field: action display: labels display_options: defaultForeground: '#263238' @@ -24,41 +29,47 @@ fields: value: authenticate foreground: '#9b51e0' background: '#e6d3f7' - - collection: directus_activity - field: collection + width: half + + - field: collection display: collection display_options: icon: true - - collection: directus_activity - field: timestamp + width: half + + - field: timestamp display: datetime options: relative: true - - collection: directus_activity - field: user + width: half + + - field: user display: user - - collection: directus_activity - field: comment + width: half + + - field: comment display: formatted-text display_options: subdued: true - - collection: directus_activity - field: user_agent + width: half + + - field: user_agent display: formatted-text display_options: font: monospace - - collection: directus_activity - field: ip + width: half + + - field: ip display: formatted-text display_options: font: monospace - - collection: directus_activity - field: revisions + width: half + + - field: revisions interface: one-to-many - locked: true special: o2m options: fields: - collection - item - width: full + width: half diff --git a/api/src/database/seeds/03-fields/01-collections.yaml b/api/src/database/system-data/fields/collections.yaml similarity index 63% rename from api/src/database/seeds/03-fields/01-collections.yaml rename to api/src/database/system-data/fields/collections.yaml index ddf4c82e8a..51f40e40fa 100644 --- a/api/src/database/seeds/03-fields/01-collections.yaml +++ b/api/src/database/system-data/fields/collections.yaml @@ -1,69 +1,54 @@ table: directus_collections fields: - - collection: directus_collections - field: collection_divider + - field: collection_divider special: alias interface: divider options: icon: box title: Collection Setup color: '#2F80ED' - locked: true - sort: 1 width: full - - collection: directus_collections - field: collection + + - field: collection interface: text-input options: font: monospace - locked: true readonly: true - sort: 2 width: half - - collection: directus_collections - field: icon + + - field: icon interface: icon options: - locked: true - sort: 3 width: half - - collection: directus_collections - field: note + + - field: note interface: text-input options: placeholder: A description of this collection... - locked: true - sort: 4 width: full - - collection: directus_collections - field: display_template + + - field: display_template interface: display-template options: collectionField: collection - locked: true - sort: 5 width: full - - collection: directus_collections - field: hidden + + - field: hidden special: boolean interface: toggle options: label: Hide within the App - locked: true - sort: 6 width: half - - collection: directus_collections - field: singleton + + - field: singleton special: boolean interface: toggle options: label: Treat as single object - locked: true - sort: 7 width: half - - collection: directus_collections - field: translations + + - field: translations special: json interface: repeater options: @@ -85,72 +70,58 @@ fields: width: half options: placeholder: Enter a translation... - locked: true - sort: 8 width: full - - collection: directus_collections - field: archive_divider + + - field: archive_divider special: alias interface: divider options: icon: archive title: Archive color: '#2F80ED' - locked: true - sort: 9 width: full - - collection: directus_collections - field: archive_field + + - field: archive_field interface: field options: collectionField: collection allowNone: true placeholder: Choose a field... - locked: true - sort: 10 width: half - - collection: directus_collections - field: archive_app_filter + + - field: archive_app_filter interface: toggle special: boolean options: label: Enable App Archive Filter - locked: true - sort: 11 width: half - - collection: directus_collections - field: archive_value + + - field: archive_value interface: text-input options: font: monospace iconRight: archive placeholder: Value set when archiving... - locked: true - sort: 12 width: half - - collection: directus_collections - field: unarchive_value + + - field: unarchive_value interface: text-input options: font: monospace iconRight: unarchive placeholder: Value set when unarchiving... - locked: true - sort: 13 width: half - - collection: directus_collections - field: sort_divider + + - field: sort_divider special: alias interface: divider options: icon: sort title: Sort color: '#2F80ED' - locked: true - sort: 14 width: full - - collection: directus_collections - field: sort_field + + - field: sort_field interface: field options: collectionField: collection @@ -160,6 +131,4 @@ fields: - decimal - integer allowNone: true - locked: true - sort: 15 width: half diff --git a/api/src/database/system-data/fields/fields.yaml b/api/src/database/system-data/fields/fields.yaml new file mode 100644 index 0000000000..b930c8a107 --- /dev/null +++ b/api/src/database/system-data/fields/fields.yaml @@ -0,0 +1,81 @@ +# directus_fields isn't surfaced in the app +table: directus_fields + +fields: + - collection: directus_fields + field: id + width: half + + - collection: directus_fields + field: collection + width: half + + - collection: directus_fields + field: field + width: half + + - collection: directus_fields + field: special + hidden: true + special: csv + width: half + + - collection: directus_fields + field: interface + width: half + + - collection: directus_fields + field: options + hidden: true + special: json + width: half + + - collection: directus_fields + field: display + width: half + + - collection: directus_fields + field: display_options + hidden: true + special: json + width: half + + - collection: directus_fields + field: locked + hidden: true + special: boolean + width: half + + - collection: directus_fields + field: readonly + hidden: true + special: boolean + width: half + + - collection: directus_fields + field: hidden + hidden: true + special: boolean + width: half + + - collection: directus_fields + field: sort + width: half + + - collection: directus_fields + field: width + width: half + + - collection: directus_fields + field: group + width: half + + - collection: directus_fields + field: translations + hidden: true + special: json + width: half + + - collection: directus_fields + field: note + width: half diff --git a/api/src/database/seeds/03-fields/05-files.yaml b/api/src/database/system-data/fields/files.yaml similarity index 53% rename from api/src/database/seeds/03-fields/05-files.yaml rename to api/src/database/system-data/fields/files.yaml index 6d3a4aff64..c7a55d6641 100644 --- a/api/src/database/seeds/03-fields/05-files.yaml +++ b/api/src/database/system-data/fields/files.yaml @@ -1,114 +1,117 @@ table: directus_files fields: - - collection: directus_files - field: id + - field: id hidden: true interface: text-input - locked: true special: uuid - - collection: directus_files - field: title + + - field: title interface: text-input - locked: true options: iconRight: title placeholder: A unique title... - sort: 1 width: full - - collection: directus_files - field: description + + - field: description interface: textarea - locked: true - sort: 2 width: full options: placeholder: An optional description... - - collection: directus_files - field: tags + + - field: tags interface: tags - locked: true options: iconRight: local_offer special: json - sort: 3 width: full display: tags - - collection: directus_files - field: location + + - field: location interface: text-input - locked: true options: iconRight: place placeholder: An optional location... - sort: 4 width: half - - collection: directus_files - field: storage + + - field: storage interface: text-input - locked: true options: iconRight: storage - sort: 5 width: half readonly: true - - collection: directus_files - field: storage_divider + + - field: storage_divider interface: divider - locked: true options: icon: insert_drive_file title: File Naming color: '#2F80ED' special: alias - sort: 6 width: full - - collection: directus_files - field: filename_disk + + - field: filename_disk interface: text-input - locked: true options: iconRight: publish placeholder: Name on disk storage... - sort: 7 width: half - - collection: directus_files - field: filename_download + + - field: filename_download interface: text-input - locked: true options: iconRight: get_app placeholder: Name when downloading... - sort: 8 width: half - - collection: directus_files - field: metadata + + - field: metadata hidden: true - locked: true special: json - - collection: directus_files - field: type + + - field: type display: mime-type - - collection: directus_files - field: filesize + + - field: filesize display: filesize - - collection: directus_files - field: modified_by + + - field: modified_by interface: user - locked: true special: user-updated width: half display: user - - collection: directus_files - field: modified_on + + - field: modified_on interface: datetime - locked: true special: date-updated width: half display: datetime - - collection: directus_files - field: created_on + + - field: created_on display: datetime - - collection: directus_files - field: created_by + + - field: created_by display: user + + - field: embed + width: half + + - field: uploaded_by + width: half + + - field: folder + width: half + + - field: width + width: half + + - field: uploaded_on + width: half + + - field: height + width: half + + - field: charset + width: half + + - field: duration + width: half diff --git a/api/src/database/system-data/fields/folders.yaml b/api/src/database/system-data/fields/folders.yaml new file mode 100644 index 0000000000..15ac834515 --- /dev/null +++ b/api/src/database/system-data/fields/folders.yaml @@ -0,0 +1,14 @@ +table: directus_folders + +fields: + - field: id + interface: text-input + special: uuid + width: half + + - field: parent + width: half + + - field: name + width: full + diff --git a/api/src/database/system-data/fields/index.ts b/api/src/database/system-data/fields/index.ts new file mode 100644 index 0000000000..d7b7491015 --- /dev/null +++ b/api/src/database/system-data/fields/index.ts @@ -0,0 +1,25 @@ +import { requireYAML } from '../../../utils/require-yaml'; +import { merge } from 'lodash'; +import { FieldMeta } from '../../../types'; +import fse from 'fs-extra'; +import path from 'path'; + +const defaults = requireYAML(require.resolve('./_defaults.yaml')); +const fieldData = fse.readdirSync(path.resolve(__dirname)); + +export let systemFieldRows: FieldMeta[] = []; + +for (const filepath of fieldData) { + if (filepath.includes('_defaults') || filepath.includes('index')) continue; + + const systemFields = requireYAML(path.resolve(__dirname, filepath)); + + (systemFields.fields as FieldMeta[]).forEach((field, index) => { + systemFieldRows.push( + merge({ system: true }, defaults, field, { + collection: systemFields.table, + sort: index + 1, + }) + ); + }); +} diff --git a/api/src/database/system-data/fields/permissions.yaml b/api/src/database/system-data/fields/permissions.yaml new file mode 100644 index 0000000000..2b564453e4 --- /dev/null +++ b/api/src/database/system-data/fields/permissions.yaml @@ -0,0 +1,36 @@ +# directus_permissions isn't surfaced in the app +table: directus_permissions + +fields: + - field: permissions + hidden: true + special: json + width: half + + - field: presets + hidden: true + special: json + width: half + + - field: role + width: half + + - field: limit + width: half + + - field: collection + width: half + + - field: id + width: half + + - field: fields + width: half + special: csv + + - field: action + width: half + + - field: validation + width: half + special: json diff --git a/api/src/database/system-data/fields/presets.yaml b/api/src/database/system-data/fields/presets.yaml new file mode 100644 index 0000000000..cbfebfd09b --- /dev/null +++ b/api/src/database/system-data/fields/presets.yaml @@ -0,0 +1,35 @@ +table: directus_presets + +fields: + - field: filters + hidden: true + special: json + + - field: layout_query + hidden: true + special: json + + - field: layout_options + hidden: true + special: json + + - field: role + width: half + + - field: user + width: half + + - field: id + width: half + + - field: bookmark + width: half + + - field: search + width: half + + - field: collection + width: half + + - field: layout + width: half diff --git a/api/src/database/system-data/fields/relations.yaml b/api/src/database/system-data/fields/relations.yaml new file mode 100644 index 0000000000..006ccd0eac --- /dev/null +++ b/api/src/database/system-data/fields/relations.yaml @@ -0,0 +1,33 @@ +table: directus_relations + +fields: + - field: id + width: half + + - field: many_collection + width: half + + - field: many_field + width: half + + - field: many_primary + width: half + + - field: one_collection + width: half + + - field: one_field + width: half + + - field: one_primary + width: half + + - field: one_collection_field + width: half + + - field: one_allowed_collections + special: csv + width: half + + - field: junction_field + width: half diff --git a/api/src/database/system-data/fields/revisions.yaml b/api/src/database/system-data/fields/revisions.yaml new file mode 100644 index 0000000000..86d9bcfcf6 --- /dev/null +++ b/api/src/database/system-data/fields/revisions.yaml @@ -0,0 +1,25 @@ +table: directus_revisions + +fields: + - field: id + width: half + + - field: activity + width: half + + - field: collection + width: half + + - field: item + width: half + + - field: data + hidden: true + special: json + + - field: delta + hidden: true + special: json + + - field: parent + width: half diff --git a/api/src/database/seeds/03-fields/02-roles.yaml b/api/src/database/system-data/fields/roles.yaml similarity index 77% rename from api/src/database/seeds/03-fields/02-roles.yaml rename to api/src/database/system-data/fields/roles.yaml index fee8421d0f..164efe152e 100644 --- a/api/src/database/seeds/03-fields/02-roles.yaml +++ b/api/src/database/system-data/fields/roles.yaml @@ -1,80 +1,61 @@ table: directus_roles fields: - - collection: directus_roles - field: id + - field: id hidden: true interface: text-input - locked: true special: uuid - - collection: directus_roles - field: name + + - field: name interface: text-input options: placeholder: The unique name for this role... - locked: true - sort: 1 width: half - - collection: directus_roles - field: icon + + - field: icon interface: icon display: icon - locked: true - sort: 2 width: half - - collection: directus_roles - field: description + + - field: description interface: text-input options: placeholder: A description of this role... - locked: true - sort: 3 width: full - - collection: directus_roles - field: app_access + + - field: app_access interface: toggle - locked: true special: boolean - sort: 4 width: half - - collection: directus_roles - field: admin_access + + - field: admin_access interface: toggle - locked: true special: boolean - sort: 5 width: half - - collection: directus_roles - field: ip_access + + - field: ip_access interface: tags options: placeholder: Add allowed IP addresses, leave empty to allow all... - locked: true special: csv - sort: 6 width: full - - collection: directus_roles - field: enforce_tfa + + - field: enforce_tfa interface: toggle - locked: true - sort: 7 special: boolean width: half - - collection: directus_roles - field: users + + - field: users interface: one-to-many - locked: true special: o2m - sort: 8 options: fields: - first_name - last_name width: full - - collection: directus_roles - field: module_list + + - field: module_list interface: repeater - locked: true options: template: '{{ name }}' addLabel: Add New Module... @@ -104,12 +85,10 @@ fields: iconRight: link placeholder: Relative or absolute URL... special: json - sort: 9 width: full - - collection: directus_roles - field: collection_list + + - field: collection_list interface: repeater - locked: true options: template: '{{ group_name }}' addLabel: Add New Group... @@ -159,5 +138,4 @@ fields: schema: is_nullable: false special: json - sort: 10 width: full diff --git a/api/src/database/system-data/fields/sessions.yaml b/api/src/database/system-data/fields/sessions.yaml new file mode 100644 index 0000000000..76584063a6 --- /dev/null +++ b/api/src/database/system-data/fields/sessions.yaml @@ -0,0 +1,17 @@ +table: directus_sessions + +fields: + - field: token + width: half + + - field: user + width: half + + - field: expires + width: half + + - field: ip + width: half + + - field: user_agent + width: half diff --git a/api/src/database/seeds/03-fields/09-settings.yaml b/api/src/database/system-data/fields/settings.yaml similarity index 70% rename from api/src/database/seeds/03-fields/09-settings.yaml rename to api/src/database/system-data/fields/settings.yaml index f7604aa374..82a5dbaba7 100644 --- a/api/src/database/seeds/03-fields/09-settings.yaml +++ b/api/src/database/system-data/fields/settings.yaml @@ -1,102 +1,85 @@ table: directus_settings fields: - - collection: directus_settings - field: project_name + - field: id + hidden: true + + - field: project_name interface: text-input - locked: true options: iconRight: title placeholder: My project... - sort: 1 translations: language: en-US translations: Name width: half - - collection: directus_settings - field: project_url + + - field: project_url interface: text-input - locked: true options: iconRight: link placeholder: https://example.com - sort: 2 translations: language: en-US translations: Website width: half - - collection: directus_settings - field: project_color + + - field: project_color interface: color - locked: true note: Login & Logo Background - sort: 3 translations: language: en-US translations: Brand Color - width: half - - collection: directus_settings - field: project_logo + width: full + + - field: project_logo interface: file - locked: true note: White 40x40 SVG/PNG - sort: 4 translations: language: en-US translations: Brand Logo width: half - - collection: directus_settings - field: public_divider + + - field: public_divider interface: divider - locked: true options: icon: public title: Public Pages color: '#2F80ED' special: alias - sort: 5 width: full - - collection: directus_settings - field: public_foreground + + - field: public_foreground interface: file - locked: true - sort: 6 translations: language: en-US translations: Login Foreground width: half - - collection: directus_settings - field: public_background + + - field: public_background interface: file - locked: true - sort: 7 translations: language: en-US translations: Login Background width: half - - collection: directus_settings - field: public_note + + - field: public_note interface: textarea - locked: true options: placeholder: A short, public message that supports markdown formatting... - sort: 8 width: full - - collection: directus_settings - field: security_divider + + - field: security_divider interface: divider - locked: true options: icon: security title: Security color: '#2F80ED' special: alias - sort: 9 width: full - - collection: directus_settings - field: auth_password_policy + + - field: auth_password_policy interface: dropdown - locked: true options: choices: - value: null @@ -105,31 +88,25 @@ fields: text: Weak – Minimum 8 Characters - value: "/(?=^.{8,}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{';'?>.<,])(?!.*\\s).*$/" text: Strong – Upper / Lowercase / Numbers / Special - sort: 10 width: half - - collection: directus_settings - field: auth_login_attempts + + - field: auth_login_attempts interface: numeric - locked: true options: iconRight: lock - sort: 11 width: half - - collection: directus_settings - field: files_divider + + - field: files_divider interface: divider - locked: true options: icon: storage title: Files & Thumbnails color: '#2F80ED' special: alias - sort: 12 width: full - - collection: directus_settings - field: storage_asset_presets + + - field: storage_asset_presets interface: repeater - locked: true options: fields: - field: key @@ -155,6 +132,10 @@ fields: text: Contain (preserve aspect ratio) - value: cover text: Cover (forces exact size) + - value: inside + text: Fit inside + - value: outside + text: Fit outside width: half - field: width name: Width @@ -184,15 +165,22 @@ fields: max: 100 min: 0 step: 1 - width: full + width: half + - field: withoutEnlargement + type: boolean + schema: + default_value: false + meta: + interface: toggle + width: half + options: + label: Don't upscale images template: '{{key}}' special: json - sort: 13 width: full - - collection: directus_settings - field: storage_asset_transform + + - field: storage_asset_transform interface: dropdown - locked: true options: choices: - value: all @@ -201,29 +189,20 @@ fields: text: None - value: presets text: Presets Only - sort: 14 width: half - - collection: directus_settings - field: id - hidden: true - locked: true - - collection: directus_settings - field: overrides_divider + + - field: overrides_divider interface: divider - locked: true options: icon: brush title: App Overrides color: '#2F80ED' special: alias - sort: 15 width: full - - collection: directus_settings - field: custom_css + + - field: custom_css interface: code - locked: true options: language: css lineNumber: true - sort: 16 width: full diff --git a/api/src/database/system-data/fields/users.yaml b/api/src/database/system-data/fields/users.yaml new file mode 100644 index 0000000000..5e3602e436 --- /dev/null +++ b/api/src/database/system-data/fields/users.yaml @@ -0,0 +1,137 @@ +table: directus_users + +fields: + - field: first_name + interface: text-input + options: + iconRight: account_circle + width: half + + - field: last_name + interface: text-input + options: + iconRight: account_circle + width: half + + - field: email + interface: text-input + options: + iconRight: email + width: half + + - field: password + special: hash,conceal + interface: hash + options: + iconRight: lock + masked: true + width: half + + - field: avatar + interface: file + width: full + + - field: location + interface: text-input + options: + iconRight: place + width: half + + - field: title + interface: text-input + options: + iconRight: work + width: half + + - field: description + interface: textarea + width: full + + - field: tags + interface: tags + special: json + width: full + options: + iconRight: local_offer + + - field: preferences_divider + interface: divider + options: + icon: face + title: User Preferences + color: '#2F80ED' + special: alias + width: full + + - field: language + interface: system-language + width: half + + - field: theme + interface: dropdown + options: + choices: + - value: auto + text: Automatic (Based on System) + - value: light + text: Light Mode + - value: dark + text: Dark Mode + width: half + + - field: tfa_secret + interface: tfa-setup + special: conceal + width: half + + - field: admin_divider + interface: divider + options: + icon: verified_user + title: Admin Options + color: '#F2994A' + special: alias + width: full + + - field: status + interface: dropdown + options: + choices: + - text: Draft + value: draft + - text: Invited + value: invited + - text: Active + value: active + - text: Suspended + value: suspended + - text: Archived + value: archived + width: half + + - field: role + interface: many-to-one + options: + template: '{{ name }}' + special: m2o + width: half + + - field: token + interface: token + options: + iconRight: vpn_key + placeholder: Enter a secure access token... + width: full + + - field: id + special: uuid + interface: text-input + options: + iconRight: vpn_key + width: full + + - field: last_page + width: half + + - field: last_access + width: half diff --git a/api/src/database/seeds/03-fields/10-webhooks.yaml b/api/src/database/system-data/fields/webhooks.yaml similarity index 68% rename from api/src/database/seeds/03-fields/10-webhooks.yaml rename to api/src/database/system-data/fields/webhooks.yaml index 21b50bdc2f..cf3ed9327d 100644 --- a/api/src/database/seeds/03-fields/10-webhooks.yaml +++ b/api/src/database/system-data/fields/webhooks.yaml @@ -1,43 +1,35 @@ table: directus_webhooks fields: - - collection: directus_webhooks - field: id + - field: id hidden: true - locked: true - - collection: directus_webhooks - field: name + + - field: name interface: text-input - locked: true options: iconRight: title - sort: 1 width: full - - collection: directus_webhooks - field: method + + - field: method interface: dropdown display: labels display_options: defaultBackground: "#ECEFF1" choices: null format: false - locked: true options: choices: - GET - POST - sort: 2 width: half - - collection: directus_webhooks - field: url + + - field: url interface: text-input - locked: true options: iconRight: link - sort: 3 width: half - - collection: directus_webhooks - field: status + + - field: status interface: dropdown display: labels display_options: @@ -53,36 +45,31 @@ fields: value: inactive foreground: "#607D8B" background: "#ECEFF1" - locked: true options: choices: - text: Active value: active - text: Inactive value: inactive - sort: 4 width: half - - collection: directus_webhooks - field: data + + - field: data interface: toggle - locked: true options: label: Send Event Data special: boolean - sort: 5 width: half - - collection: directus_webhooks - field: triggers_divider + + - field: triggers_divider interface: divider options: icon: api title: Triggers color: '#2F80ED' special: alias - sort: 6 width: full - - collection: directus_webhooks - field: actions + + - field: actions interface: checkboxes options: choices: @@ -93,11 +80,9 @@ fields: - text: Delete value: delete special: csv - sort: 7 width: full - - collection: directus_webhooks - field: collections + + - field: collections interface: collections special: csv - sort: 8 width: full diff --git a/api/src/database/system-data/relations/index.ts b/api/src/database/system-data/relations/index.ts new file mode 100644 index 0000000000..7ffc843e59 --- /dev/null +++ b/api/src/database/system-data/relations/index.ts @@ -0,0 +1,9 @@ +import { requireYAML } from '../../../utils/require-yaml'; +import { merge } from 'lodash'; +import { Relation } from '../../../types'; + +const systemData = requireYAML(require.resolve('./relations.yaml')); + +export const systemRelationRows: Relation[] = systemData.data.map((row: Record) => { + return merge({ system: true }, systemData.defaults, row); +}); diff --git a/api/src/database/seeds/02-rows/04-relations.yaml b/api/src/database/system-data/relations/relations.yaml similarity index 100% rename from api/src/database/seeds/02-rows/04-relations.yaml rename to api/src/database/system-data/relations/relations.yaml diff --git a/api/src/emitter.ts b/api/src/emitter.ts index 95dc3dcdbe..cf9eed7ece 100644 --- a/api/src/emitter.ts +++ b/api/src/emitter.ts @@ -3,6 +3,6 @@ import { EventEmitter2 } from 'eventemitter2'; const emitter = new EventEmitter2({ wildcard: true, verboseMemoryLeak: true, delimiter: '.' }); // No-op function to ensure we never end up with no data -emitter.on('*.*.before', input => input); +emitter.on('*.*.before', (input) => input); export default emitter; diff --git a/api/src/env.ts b/api/src/env.ts index 520e6c2e7e..8ee1d41641 100644 --- a/api/src/env.ts +++ b/api/src/env.ts @@ -27,12 +27,14 @@ const defaults: Record = { REFRESH_TOKEN_COOKIE_SECURE: false, REFRESH_TOKEN_COOKIE_SAME_SITE: 'lax', - CORS_ENABLED: false, + CORS_ENABLED: true, CACHE_ENABLED: false, CACHE_STORE: 'memory', CACHE_TTL: '30m', CACHE_NAMESPACE: 'system-cache', + CACHE_AUTO_PURGE: false, + ASSETS_CACHE_TTL: '30m', OAUTH_PROVIDERS: '', @@ -62,12 +64,7 @@ function processValues(env: Record) { if (value === 'true') env[key] = true; if (value === 'false') env[key] = false; if (value === 'null') env[key] = null; - if (isNaN(value) === false && value.length > 0) env[key] = Number(value); - if (typeof value === 'string' && value.includes(',')) - env[key] = value - .split(',') - .map((val) => val.trim()) - .filter((val) => val); + if (String(value).startsWith('0') === false && isNaN(value) === false && value.length > 0) env[key] = Number(value); } return env; diff --git a/api/src/extensions.ts b/api/src/extensions.ts index e25b3f79b0..3caded4cc1 100644 --- a/api/src/extensions.ts +++ b/api/src/extensions.ts @@ -33,12 +33,9 @@ export async function listExtensions(type: string) { return await listFolders(location); } catch (err) { if (err.code === 'ENOENT') { - throw new ServiceUnavailableException( - `Extension folder "extensions/${type}" couldn't be opened`, - { - service: 'extensions', - } - ); + throw new ServiceUnavailableException(`Extension folder "extensions/${type}" couldn't be opened`, { + service: 'extensions', + }); } throw err; } @@ -78,9 +75,7 @@ function registerHooks(hooks: string[]) { function registerHook(hook: string) { const hookPath = path.resolve(extensionsPath, 'hooks', hook, 'index.js'); - const hookInstance: - | HookRegisterFunction - | { default?: HookRegisterFunction } = require(hookPath); + const hookInstance: HookRegisterFunction | { default?: HookRegisterFunction } = require(hookPath); let register: HookRegisterFunction = hookInstance as HookRegisterFunction; if (typeof hookInstance !== 'function') { @@ -110,9 +105,7 @@ function registerEndpoints(endpoints: string[], router: Router) { function registerEndpoint(endpoint: string) { const endpointPath = path.resolve(extensionsPath, 'endpoints', endpoint, 'index.js'); - const endpointInstance: - | EndpointRegisterFunction - | { default?: EndpointRegisterFunction } = require(endpointPath); + const endpointInstance: EndpointRegisterFunction | { default?: EndpointRegisterFunction } = require(endpointPath); let register: EndpointRegisterFunction = endpointInstance as EndpointRegisterFunction; if (typeof endpointInstance !== 'function') { diff --git a/api/src/mail/index.ts b/api/src/mail/index.ts index 565a1db276..a3a6dd37f2 100644 --- a/api/src/mail/index.ts +++ b/api/src/mail/index.ts @@ -1,3 +1,4 @@ +import database from '../database'; import logger from '../logger'; import nodemailer, { Transporter } from 'nodemailer'; import { Liquid } from 'liquidjs'; @@ -13,7 +14,7 @@ const liquidEngine = new Liquid({ extname: '.liquid', }); -let transporter: Transporter; +let transporter: Transporter | null = null; if (env.EMAIL_TRANSPORT === 'sendmail') { transporter = nodemailer.createTransport({ @@ -23,15 +24,28 @@ if (env.EMAIL_TRANSPORT === 'sendmail') { }); } else if (env.EMAIL_TRANSPORT.toLowerCase() === 'smtp') { transporter = nodemailer.createTransport({ - pool: env.EMAIL_SMTP_POOL === 'true', + pool: env.EMAIL_SMTP_POOL, host: env.EMAIL_SMTP_HOST, - port: Number(env.EMAIL_SMTP_PORT), - secure: env.EMAIL_SMTP_SECURE === 'true', + port: env.EMAIL_SMTP_PORT, + secure: env.EMAIL_SMTP_SECURE, auth: { user: env.EMAIL_SMTP_USER, pass: env.EMAIL_SMTP_PASSWORD, }, } as any); +} else { + logger.warn('Illegal transport given for email. Check the EMAIL_TRANSPORT env var.'); +} + +if (transporter) { + transporter.verify((error) => { + if (error) { + logger.warn(`Couldn't connect to email server.`); + logger.warn(`Email verification error: ${error}`); + } else { + logger.info(`Email connection established`); + } + }); } export type EmailOptions = { @@ -42,7 +56,37 @@ export type EmailOptions = { html: string; }; +/** + * Get an object with default template options to pass to the email templates. + */ +async function getDefaultTemplateOptions() { + const projectInfo = await database + .select(['project_name', 'project_logo', 'project_color']) + .from('directus_settings') + .first(); + + return { + projectName: projectInfo?.project_name || 'Directus', + projectColor: projectInfo?.project_color || '#546e7a', + projectLogo: projectInfo?.project_logo + ? getProjectLogoURL(projectInfo.project_logo) + : 'https://directus.io/assets/directus-white.png', + }; + + function getProjectLogoURL(logoID: string) { + let projectLogoURL = env.PUBLIC_URL; + + if (projectLogoURL.endsWith('/') === false) { + projectLogoURL += '/'; + } + + projectLogoURL += `assets/${logoID}`; + } +} + export default async function sendMail(options: EmailOptions) { + if (!transporter) return; + const templateString = await readFile(path.join(__dirname, 'templates/base.liquid'), 'utf8'); const html = await liquidEngine.parseAndRender(templateString, { html: options.html }); @@ -57,21 +101,39 @@ export default async function sendMail(options: EmailOptions) { } export async function sendInviteMail(email: string, url: string) { - /** - * @TODO pull this from directus_settings - */ - const projectName = 'directus'; + if (!transporter) return; - const html = await liquidEngine.renderFile('user-invitation', { email, url, projectName }); - await transporter.sendMail({ from: env.EMAIL_FROM, to: email, html: html }); + const defaultOptions = await getDefaultTemplateOptions(); + + const html = await liquidEngine.renderFile('user-invitation', { + ...defaultOptions, + email, + url, + }); + + await transporter.sendMail({ + from: env.EMAIL_FROM, + to: email, + html: html, + subject: `[${defaultOptions.projectName}] You've been invited`, + }); } export async function sendPasswordResetMail(email: string, url: string) { - /** - * @TODO pull this from directus_settings - */ - const projectName = 'directus'; + if (!transporter) return; - const html = await liquidEngine.renderFile('password-reset', { email, url, projectName }); - await transporter.sendMail({ from: env.EMAIL_FROM, to: email, html: html }); + const defaultOptions = await getDefaultTemplateOptions(); + + const html = await liquidEngine.renderFile('password-reset', { + ...defaultOptions, + email, + url, + }); + + await transporter.sendMail({ + from: env.EMAIL_FROM, + to: email, + html: html, + subject: `[${defaultOptions.projectName}] Password Reset Request`, + }); } diff --git a/api/src/mail/templates/base.liquid b/api/src/mail/templates/base.liquid index 536550b3f8..5358737bad 100644 --- a/api/src/mail/templates/base.liquid +++ b/api/src/mail/templates/base.liquid @@ -3,20 +3,30 @@ - Directus Email Service + + {{ projectName }} Email Service + - - - -
- - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Loading… + + + + +
+ + diff --git a/app/public/manifest.webmanifest b/app/public/manifest.webmanifest index e7ebab05ab..a1f459dc44 100644 --- a/app/public/manifest.webmanifest +++ b/app/public/manifest.webmanifest @@ -2,19 +2,26 @@ "name": "Directus", "short_name": "Directus", "icons": [ + { + "src": "img/icons/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + }, { "src": "img/icons/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "img/icons/android-chrome-512x512.png", + "src": "img/icons/maskable.png", "sizes": "512x512", - "type": "image/png" + "type": "image/png", + "purpose": "any maskable" } ], "theme_color": "#263238", "background_color": "#263238", "display": "standalone", - "start_url": "." + "start_url": "./", + "scope": "." } diff --git a/app/src/api.ts b/app/src/api.ts index c429296ad6..e9443765df 100644 --- a/app/src/api.ts +++ b/app/src/api.ts @@ -6,6 +6,11 @@ import getRootPath from '@/utils/get-root-path'; const api = axios.create({ baseURL: getRootPath(), withCredentials: true, + headers: { + 'Cache-Control': 'no-cache', + Pragma: 'no-cache', + Expires: '0', + }, }); interface RequestConfig extends AxiosRequestConfig { @@ -86,3 +91,17 @@ api.interceptors.request.use(onRequest); api.interceptors.response.use(onResponse, onError); export default api; + +function getToken() { + return api.defaults.headers?.['Authorization']?.split(' ')[1] || null; +} + +export function addTokenToURL(url: string) { + const token = getToken(); + + if (url.includes('?')) { + return (url += '&access_token=' + token); + } else { + return (url += '?access_token=' + token); + } +} diff --git a/app/src/app.vue b/app/src/app.vue index 3d63279fbb..2bf58de83f 100644 --- a/app/src/app.vue +++ b/app/src/app.vue @@ -34,25 +34,25 @@ import setFavicon from '@/utils/set-favicon'; export default defineComponent({ setup() { - const { useAppStore, useUserStore, useSettingsStore } = stores; + const { useAppStore, useUserStore, useServerStore } = stores; const appStore = useAppStore(); const userStore = useUserStore(); - const settingsStore = useSettingsStore(); + const serverStore = useServerStore(); const { hydrating, sidebarOpen } = toRefs(appStore.state); const brandStyle = computed(() => { return { - '--brand': settingsStore.state.settings?.project_color || 'var(--primary)', + '--brand': serverStore.state.info?.project?.project_color || 'var(--primary)', }; }); watch( - [() => settingsStore.state.settings?.project_color, () => settingsStore.state.settings?.project_logo], + [() => serverStore.state.info?.project?.project_color, () => serverStore.state.info?.project?.project_logo], () => { - const hasCustomLogo = !!settingsStore.state.settings?.project_logo; - setFavicon(settingsStore.state.settings?.project_color || '#2f80ed', hasCustomLogo); + const hasCustomLogo = !!serverStore.state.info?.project?.project_logo; + setFavicon(serverStore.state.info?.project?.project_color || '#2f80ed', hasCustomLogo); } ); @@ -82,6 +82,9 @@ export default defineComponent({ if (newUser !== undefined && newUser !== null && newUser.theme) { document.body.classList.add(newUser.theme); + document + .querySelector('head meta[name="theme-color"]') + ?.setAttribute('content', newUser.theme === 'light' ? '#ffffff' : '#263238'); } else { // Default to light mode document.body.classList.add('light'); @@ -90,14 +93,14 @@ export default defineComponent({ ); watch( - () => settingsStore.state.settings?.project_name, + () => serverStore.state.info?.project?.project_name, (projectName) => { - document.title = projectName; + document.title = projectName || 'Directus'; } ); const customCSS = computed(() => { - return settingsStore.state?.settings?.custom_css || ''; + return serverStore.state?.info?.project?.custom_css || ''; }); const error = computed(() => appStore.state.error); diff --git a/app/src/auth.ts b/app/src/auth.ts index f3c147cc1a..4e13210fcf 100644 --- a/app/src/auth.ts +++ b/app/src/auth.ts @@ -24,7 +24,7 @@ export async function login(credentials: LoginCredentials) { // Refresh the token 10 seconds before the access token expires. This means the user will stay // logged in without any noticable hickups or delays - setTimeout(() => refresh(), response.data.data.expires * 1000 + 10 * 1000); + setTimeout(() => refresh(), response.data.data.expires - 10000); appStore.state.authenticated = true; diff --git a/app/src/components/transition/expand/transition-expand-methods.ts b/app/src/components/transition/expand/transition-expand-methods.ts index 1284f242c1..e0e5386e97 100644 --- a/app/src/components/transition/expand/transition-expand-methods.ts +++ b/app/src/components/transition/expand/transition-expand-methods.ts @@ -40,9 +40,7 @@ export default function (expandedParentClass = '', xAxis = false) { void el.offsetHeight; // force reflow el.style.transition = - initialStyle.transition !== '' - ? initialStyle.transition - : `${sizeProperty} var(--medium) var(--transition)`; + initialStyle.transition !== '' ? initialStyle.transition : `${sizeProperty} var(--medium) var(--transition)`; if (expandedParentClass && el._parent) { el._parent.classList.add(expandedParentClass); diff --git a/app/src/components/transition/expand/transition-expand.test.ts b/app/src/components/transition/expand/transition-expand.test.ts deleted file mode 100644 index 9df3972171..0000000000 --- a/app/src/components/transition/expand/transition-expand.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { mount, createLocalVue } from '@vue/test-utils'; -import VueCompositionAPI, { defineComponent, ref } from '@vue/composition-api'; -import TransitionExpand from './transition-expand.vue'; - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); - -localVue.component('transition-expand', TransitionExpand); - -const ExpandTestUtil = defineComponent({ - setup() { - const active = ref(false); - const toggle = () => (active.value = !active.value); - return { active, toggle }; - }, - template: ` -
- -
- `, -}); - -describe('Expand Transition', () => { - it('Renders the provided markup in the default slot', async () => { - const component = mount(ExpandTestUtil, { - localVue, - scopedSlots: { - default: ` -
-
- `, - }, - }); - - expect(component.find('.test').isVisible()).toBe(false); - component.find('button').trigger('click'); - await component.vm.$nextTick(); - expect(component.find('.test').isVisible()).toBe(true); - }); -}); diff --git a/app/src/components/v-avatar/readme.md b/app/src/components/v-avatar/readme.md index eff9817155..4b552d47e6 100644 --- a/app/src/components/v-avatar/readme.md +++ b/app/src/components/v-avatar/readme.md @@ -8,7 +8,7 @@ - + ``` diff --git a/app/src/components/v-avatar/v-avatar.test.ts b/app/src/components/v-avatar/v-avatar.test.ts deleted file mode 100644 index 0d31189172..0000000000 --- a/app/src/components/v-avatar/v-avatar.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { mount, createLocalVue, Wrapper } from '@vue/test-utils'; -import VueCompositionAPI from '@vue/composition-api'; - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); - -import VAvatar from './v-avatar.vue'; - -describe('Avatar', () => { - let component: Wrapper; - - beforeEach(() => (component = mount(VAvatar, { localVue }))); - - it('Sets the tile class if tile prop is passed', async () => { - component.setProps({ tile: true }); - await component.vm.$nextTick(); - expect(component.classes()).toContain('tile'); - }); -}); diff --git a/app/src/components/v-badge/v-badge.test.ts b/app/src/components/v-badge/v-badge.test.ts deleted file mode 100644 index 91e8fdf99f..0000000000 --- a/app/src/components/v-badge/v-badge.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { mount, createLocalVue, Wrapper } from '@vue/test-utils'; -import VueCompositionAPI from '@vue/composition-api'; - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); -localVue.component('v-icon', VIcon); - -import VBadge from './v-badge.vue'; -import VIcon from '../v-icon/'; - -describe('Chip', () => { - let component: Wrapper; - - beforeEach(() => { - component = mount(VBadge, { localVue }); - }); - - it('Adds the dot prop to the badge', async () => { - component.setProps({ - dot: true, - }); - - await component.vm.$nextTick(); - - expect(component.find('.badge').classes()).toContain('dot'); - }); - - it('Adds the bordered prop to the badge', async () => { - component.setProps({ - bordered: true, - }); - - await component.vm.$nextTick(); - - expect(component.find('.badge').classes()).toContain('bordered'); - }); - - it('Display the badge on the left', async () => { - component.setProps({ - left: true, - }); - - await component.vm.$nextTick(); - - expect(component.find('.badge').classes()).toContain('left'); - }); - - it('Display the badge on the bottom', async () => { - component.setProps({ - bottom: true, - }); - - await component.vm.$nextTick(); - - expect(component.find('.badge').classes()).toContain('bottom'); - }); - - it('Checks if the icon exists and if the name matches', async () => { - component.setProps({ - icon: 'add', - }); - - await component.vm.$nextTick(); - - expect(component.find('.v-icon').exists()).toBe(true); - expect(component.find('.v-icon').props().name).toBe('add'); - }); -}); diff --git a/app/src/components/v-breadcrumb/v-breadcrumb.test.ts b/app/src/components/v-breadcrumb/v-breadcrumb.test.ts deleted file mode 100644 index a619387711..0000000000 --- a/app/src/components/v-breadcrumb/v-breadcrumb.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import VueCompositionAPI from '@vue/composition-api'; -import { mount, createLocalVue, Wrapper } from '@vue/test-utils'; -import VBreadcrumb from './v-breadcrumb.vue'; -import VIcon from '../v-icon/'; - -import VueRouter from 'vue-router'; - -const router = new VueRouter(); - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); -localVue.component('v-icon', VIcon); -localVue.use(VueRouter); - -describe('Breadcrumb', () => { - let component: Wrapper; - - beforeEach(() => { - component = mount(VBreadcrumb, { localVue, router }); - jest.useFakeTimers(); - }); - - it('Renders the whole breadcrump', async () => { - component.setProps({ - items: [ - { name: 'A', to: 'linkA' }, - { name: 'B', to: 'linkB' }, - { name: 'C', to: 'linkC' }, - ], - }); - - await component.vm.$nextTick(); - - const sections = component.findAll('.section a.section-link'); - - expect(sections.at(0).text()).toBe('A'); - expect(sections.at(0).attributes().href).toContain('linkA'); - - expect(sections.at(1).text()).toBe('B'); - expect(sections.at(1).attributes().href).toContain('linkB'); - - expect(sections.at(2).text()).toBe('C'); - expect(sections.at(2).attributes().href).toContain('linkC'); - }); - - it('Renders breadcrumb with icon ', async () => { - component.setProps({ - items: [ - { name: 'A', to: 'linkA' }, - { name: 'B', to: 'linkB', icon: 'home' }, - { name: 'C', to: 'linkC', icon: 'add' }, - ], - }); - - await component.vm.$nextTick(); - - const sections = component.findAll('.section a.section-link'); - - expect(sections.at(0).find('.v-icon').exists()).toBe(false); - expect(sections.at(1).find('.v-icon').text()).toBe('home'); - expect(sections.at(2).find('.v-icon').text()).toBe('add'); - }); - - it('Renders breadcrumb with disabled section ', async () => { - component.setProps({ - items: [ - { name: 'A', to: 'linkA' }, - { name: 'B', to: 'linkB', disabled: true }, - { name: 'C', to: 'linkC' }, - ], - }); - - await component.vm.$nextTick(); - - expect(component.findAll('.section').at(1).classes()).toContain('disabled'); - }); -}); diff --git a/app/src/components/v-button-group/v-button-group.test.ts b/app/src/components/v-button-group/v-button-group.test.ts deleted file mode 100644 index 6ccd298e78..0000000000 --- a/app/src/components/v-button-group/v-button-group.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { shallowMount, createLocalVue } from '@vue/test-utils'; -import VueCompositionAPI from '@vue/composition-api'; -import VButtonGroup from './v-button-group.vue'; -import VItemGroup from '@/components/v-item-group/'; - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); -localVue.component('v-item-group', VItemGroup); - -jest.mock('@/composables/groupable'); - -describe('Components / Button Group', () => { - it('Renders', () => { - const component = shallowMount(VButtonGroup, { localVue }); - expect(component.isVueInstance()).toBe(true); - }); -}); diff --git a/app/src/components/v-card/readme.md b/app/src/components/v-card/readme.md index f6cbc9f64c..1c081f28af 100644 --- a/app/src/components/v-card/readme.md +++ b/app/src/components/v-card/readme.md @@ -8,10 +8,10 @@ Renders a card. A card is nothing but a v-sheet with predefined building blocks Hello, world! This is a card - Consectetur enim ullamco sint sit deserunt proident consectetur. + Consectetur enim ullamco sint sit deserunt proident consectetur. Save - + ``` diff --git a/app/src/components/v-card/v-card.test.ts b/app/src/components/v-card/v-card.test.ts deleted file mode 100644 index e2ad1604fd..0000000000 --- a/app/src/components/v-card/v-card.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import VCard from './v-card.vue'; -import VueCompositionAPI from '@vue/composition-api'; -import { shallowMount, createLocalVue } from '@vue/test-utils'; - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); - -describe('Components / Card', () => { - it('Renders', () => { - const component = shallowMount(VCard, { localVue }); - expect(component.isVueInstance()).toBe(true); - }); -}); diff --git a/app/src/components/v-checkbox/v-checkbox.test.ts b/app/src/components/v-checkbox/v-checkbox.test.ts deleted file mode 100644 index 91ed351768..0000000000 --- a/app/src/components/v-checkbox/v-checkbox.test.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { mount, createLocalVue } from '@vue/test-utils'; -import VueCompositionAPI from '@vue/composition-api'; -import VIcon from '../v-icon/'; - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); -localVue.component('v-icon', VIcon); - -import VCheckbox from './v-checkbox.vue'; - -describe('Checkbox', () => { - it('Renders passed label', () => { - const component = mount(VCheckbox, { - localVue, - propsData: { - label: 'Turn me on', - }, - }); - - expect(component.find('span[class="label type-text"]').text()).toContain('Turn me on'); - }); - - it('Renders as checked when inputValue `true` is given', () => { - const component = mount(VCheckbox, { - localVue, - propsData: { - inputValue: true, - }, - }); - - expect((component.vm as any).isChecked).toBe(true); - }); - - it('Calculates check for array inputValue', () => { - const component = mount(VCheckbox, { - localVue, - propsData: { - value: 'red', - inputValue: ['red'], - }, - }); - - expect((component.vm as any).isChecked).toBe(true); - }); - - it('Emits true when state is false', () => { - const component = mount(VCheckbox, { - localVue, - propsData: { - inputValue: false, - }, - }); - - const button = component.find('button'); - button.trigger('click'); - - expect(component.emitted()?.change?.[0][0]).toBe(true); - }); - - it('Disables the button when disabled prop is set', () => { - const component = mount(VCheckbox, { - localVue, - propsData: { - disabled: true, - }, - }); - - const button = component.find('button'); - expect(Object.keys(button.attributes())).toContain('disabled'); - }); - - it('Appends value to array', () => { - const component = mount(VCheckbox, { - localVue, - propsData: { - value: 'red', - inputValue: ['blue', 'green'], - }, - }); - - const button = component.find('button'); - button.trigger('click'); - - expect(component.emitted()?.change?.[0][0]).toEqual(['blue', 'green', 'red']); - }); - - it('Removes value from array', () => { - const component = mount(VCheckbox, { - localVue, - propsData: { - value: 'red', - inputValue: ['blue', 'green', 'red'], - }, - }); - - const button = component.find('button'); - button.trigger('click'); - - expect(component.emitted()?.change?.[0][0]).toEqual(['blue', 'green']); - }); - - it('Renders the correct icon for state', () => { - const component = mount(VCheckbox, { - localVue, - propsData: { - inputValue: false, - }, - }); - - expect((component.vm as any).icon).toBe('check_box_outline_blank'); - - component.setProps({ inputValue: true }); - - expect((component.vm as any).icon).toBe('check_box'); - - component.setProps({ indeterminate: true }); - - expect((component.vm as any).icon).toBe('indeterminate_check_box'); - }); - - it('Emits the update:indeterminate event when the checkbox is toggled when indeterminate', () => { - const component = mount(VCheckbox, { - localVue, - propsData: { - indeterminate: true, - }, - }); - - component.find('button').trigger('click'); - - expect(component.emitted('update:indeterminate')?.[0]).toEqual([false]); - }); -}); diff --git a/app/src/components/v-chip/v-chip.test.ts b/app/src/components/v-chip/v-chip.test.ts deleted file mode 100644 index 5d5f00663b..0000000000 --- a/app/src/components/v-chip/v-chip.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { mount, createLocalVue, Wrapper } from '@vue/test-utils'; -import VueCompositionAPI from '@vue/composition-api'; -import VChip from './v-chip.vue'; -import VIcon from '@/components/v-icon/'; - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); -localVue.component('v-icon', VIcon); - -describe('Chip', () => { - let component: Wrapper; - - beforeEach(() => { - component = mount(VChip, { localVue }); - }); - - it('Renders the provided markup in the default slow', () => { - const component = mount(VChip, { - localVue, - slots: { - default: 'Click me', - }, - }); - - expect(component.text()).toContain('Click me'); - }); - - it('Hides the whole component', async () => { - component.setProps({ - active: false, - }); - - await component.vm.$nextTick(); - - expect(component.find('span').exists()).toBe(false); - }); - - it('Adds the outline class for outline chips', async () => { - component.setProps({ - outlined: true, - }); - - await component.vm.$nextTick(); - - expect(component.classes()).toContain('outlined'); - }); - - it('Adds the label class for block chips', async () => { - component.setProps({ - label: true, - }); - - await component.vm.$nextTick(); - - expect(component.classes()).toContain('label'); - }); - - it('Adds the close icon for icon chips', async () => { - component.setProps({ - close: true, - }); - - await component.vm.$nextTick(); - - expect(component.find('.close-outline').exists()).toBe(true); - }); - - it('Emits a click event when chip is not disabled', async () => { - component.setProps({ - disabled: false, - }); - - await component.vm.$nextTick(); - - (component.vm as any).onClick(new Event('click')); - - expect(component.emitted('click')?.[0][0]).toBeInstanceOf(Event); - }); - - it('Does not emit click when disabled', async () => { - component.setProps({ - disabled: true, - }); - - await component.vm.$nextTick(); - - (component.vm as any).onClick(new Event('click')); - - expect(component.emitted('click')).toBe(undefined); - }); - - it('Emits a click event when chip is not disabled and close button is clicked', async () => { - component.setProps({ - disabled: false, - }); - - await component.vm.$nextTick(); - - (component.vm as any).onCloseClick(new Event('click')); - - expect(component.emitted('close')?.[0][0]).toBeInstanceOf(Event); - }); - - it('Does not emit click when disabled and close button is clicked', async () => { - component.setProps({ - disabled: true, - }); - - await component.vm.$nextTick(); - - (component.vm as any).onCloseClick(new Event('click')); - - expect(component.emitted('click')).toBe(undefined); - }); -}); diff --git a/app/src/components/v-detail/v-detail.vue b/app/src/components/v-detail/v-detail.vue index 3ced9238e8..120b028297 100644 --- a/app/src/components/v-detail/v-detail.vue +++ b/app/src/components/v-detail/v-detail.vue @@ -14,7 +14,7 @@ @@ -128,6 +133,7 @@ body { position: relative; display: flex; flex-direction: column; + width: 100%; max-width: var(--v-drawer-max-width); height: 100%; background-color: var(--background-page); @@ -156,27 +162,18 @@ body { overflow: hidden; .sidebar { - position: absolute; - top: 0; - left: 0; - z-index: 2; - flex-basis: 220px; - flex-shrink: 0; - width: 220px; - height: 100%; - background-color: var(--background-normal); - transform: translateX(-100%); - transition: transform var(--slow) var(--transition-out); - - &.active { - transform: translateX(0); - transition-timing-function: var(--transition-in); - } + display: none; @include breakpoint(medium) { position: relative; + z-index: 2; + display: block; + flex-basis: 220px; + flex-shrink: 0; + width: 220px; + height: 100%; height: auto; - transform: translateX(0); + background-color: var(--background-normal); } } @@ -197,8 +194,9 @@ body { flex-grow: 1; overflow: auto; - @include breakpoint(medium) { + @include breakpoint(small) { --content-padding: 32px; + --content-padding-bottom: 132px; } } } @@ -207,4 +205,17 @@ body { width: calc(100% - 64px); } } + +.mobile-sidebar { + margin: var(--content-padding); + + nav { + background-color: var(--background-subdued); + border-radius: var(--border-radius); + } + + @include breakpoint(medium) { + display: none; + } +} diff --git a/app/src/components/v-error/v-error.vue b/app/src/components/v-error/v-error.vue index aa6ba435c9..8e5d27c8be 100644 --- a/app/src/components/v-error/v-error.vue +++ b/app/src/components/v-error/v-error.vue @@ -14,6 +14,7 @@ @@ -141,11 +145,6 @@ body { border-color: var(--primary); } - &.disabled { - color: var(--foreground-subdued); - background-color: var(--background-subdued); - } - textarea { position: relative; display: block; @@ -163,5 +162,10 @@ body { color: var(--foreground-subdued); } } + + &.disabled textarea { + color: var(--foreground-subdued); + background-color: var(--background-subdued); + } } diff --git a/app/src/components/v-upload/v-upload.vue b/app/src/components/v-upload/v-upload.vue index 0fad1a6123..d995530a38 100644 --- a/app/src/components/v-upload/v-upload.vue +++ b/app/src/components/v-upload/v-upload.vue @@ -92,6 +92,7 @@ import uploadFile from '@/utils/upload-file'; import DrawerCollection from '@/views/private/components/drawer-collection'; import api from '@/api'; import useItem from '@/composables/use-item'; +import { unexpectedError } from '@/utils/unexpected-error'; export default defineComponent({ components: { DrawerCollection }, @@ -118,16 +119,15 @@ export default defineComponent({ }, }, setup(props, { emit }) { - const { uploading, progress, error, upload, onBrowseSelect, done, numberOfFiles } = useUpload(); + const { uploading, progress, upload, onBrowseSelect, done, numberOfFiles } = useUpload(); const { onDragEnter, onDragLeave, onDrop, dragging } = useDragging(); - const { url, isValidURL, loading: urlLoading, error: urlError, importFromURL } = useURLImport(); + const { url, isValidURL, loading: urlLoading, importFromURL } = useURLImport(); const { setSelection } = useSelection(); const activeDialog = ref<'choose' | 'url' | null>(null); return { uploading, progress, - error, onDragEnter, onDragLeave, onDrop, @@ -148,14 +148,12 @@ export default defineComponent({ const progress = ref(0); const numberOfFiles = ref(0); const done = ref(0); - const error = ref(null); - return { uploading, progress, error, upload, onBrowseSelect, numberOfFiles, done }; + return { uploading, progress, upload, onBrowseSelect, numberOfFiles, done }; async function upload(files: FileList) { uploading.value = true; progress.value = 0; - error.value = null; try { numberOfFiles.value = files.length; @@ -185,8 +183,7 @@ export default defineComponent({ uploadedFile && emit('input', uploadedFile); } } catch (err) { - console.error(err); - error.value = err; + unexpectedError(err); } finally { uploading.value = false; done.value = 0; @@ -255,7 +252,6 @@ export default defineComponent({ function useURLImport() { const url = ref(''); const loading = ref(false); - const error = ref(null); const isValidURL = computed(() => { try { @@ -266,7 +262,7 @@ export default defineComponent({ } }); - return { url, loading, error, isValidURL, importFromURL }; + return { url, loading, isValidURL, importFromURL }; async function importFromURL() { loading.value = true; @@ -280,7 +276,7 @@ export default defineComponent({ activeDialog.value = null; url.value = ''; } catch (err) { - error.value = err; + unexpectedError(err); } finally { loading.value = false; } diff --git a/app/src/composables/groupable/groupable.test.ts b/app/src/composables/groupable/groupable.test.ts deleted file mode 100644 index 1a55593bf9..0000000000 --- a/app/src/composables/groupable/groupable.test.ts +++ /dev/null @@ -1,491 +0,0 @@ -import Vue from 'vue'; -import { provide, inject, ref } from '@vue/composition-api'; -import mountComposable from '../../../.jest/mount-composable'; -import { useGroupable, useGroupableParent } from './groupable'; - -describe('Groupable', () => { - beforeEach(() => { - jest.resetAllMocks(); - }); - - describe('Child', () => { - it('Returns on-ops if parent injection does not exist or is undefined', () => { - mountComposable(() => { - provide('item-group', undefined); - const { active, toggle } = useGroupable(); - expect(active).toEqual({ value: false }); - expect(toggle).toBeInstanceOf(Function); - }); - }); - - it('Calls register on creation, and unregister on destroy', () => { - const register = jest.fn(); - const unregister = jest.fn(); - const toggle = jest.fn(); - - const component = mountComposable(() => { - provide('item-group', { register, unregister, toggle }); - useGroupable(); - }); - - expect(register).toHaveBeenCalled(); - component.destroy(); - expect(unregister).toHaveBeenCalled(); - }); - - it('Passes the custom value to the parent scope on register', () => { - const register = jest.fn(); - const unregister = jest.fn(); - const toggle = jest.fn(); - - mountComposable(() => { - provide('item-group', { register, unregister, toggle }); - useGroupable({ value: 'custom-value' }); - }); - - expect(register).toHaveBeenCalledWith({ - active: { value: false }, - value: 'custom-value', - }); - }); - - it('Returns the active state and a toggle function on succesful registration', () => { - const register = jest.fn(); - const unregister = jest.fn(); - const toggle = jest.fn(); - - mountComposable(() => { - provide('item-group', { register, unregister, toggle }); - const result = useGroupable({ value: 'custom-value' }); - expect(result!.active).toEqual({ value: false }); - expect(result!.toggle).toBeInstanceOf(Function); - }); - }); - - it('Calls parent provided toggle on toggle', () => { - const register = jest.fn(); - const unregister = jest.fn(); - const toggle = jest.fn(); - - mountComposable(() => { - provide('item-group', { register, unregister, toggle }); - const result = useGroupable({ value: 'custom-value' }); - result!.toggle(); - expect(toggle).toHaveBeenCalled(); - }); - }); - - it('Sets internal active state on toggle', () => { - const register = jest.fn(); - const unregister = jest.fn(); - const toggle = jest.fn(); - - mountComposable(() => { - provide('item-group', { register, unregister, toggle }); - const result = useGroupable({ value: 'custom-value' }); - result!.toggle(); - expect(result!.active).toEqual({ value: true }); - }); - }); - }); - - describe('Parent', () => { - describe('Registration', () => { - it('Provides register, unregister, and toggle functions', () => { - mountComposable(() => { - useGroupableParent(); - - const providedFunctions: any = inject('item-group'); - expect(providedFunctions).not.toBe(undefined); - expect(providedFunctions.register).toBeInstanceOf(Function); - expect(providedFunctions.unregister).toBeInstanceOf(Function); - expect(providedFunctions.toggle).toBeInstanceOf(Function); - }); - }); - - it('Adds the registered item to the items array', () => { - mountComposable(() => { - const result: any = useGroupableParent(); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - providedFunctions.register(testItem); - expect(result.items.value).toEqual([testItem]); - }); - }); - - it('Preselects the first item on first load if mandatory is set', () => { - mountComposable(() => { - const result: any = useGroupableParent(undefined, { mandatory: ref(true) }); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - providedFunctions.register(testItem); - expect(result.items.value).toEqual([testItem]); - expect(result.selection.value).toEqual(['test']); - }); - }); - - it('Removes the unregistered item from the items array', () => { - mountComposable(() => { - const result: any = useGroupableParent(); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - result.items.value = [testItem]; - - providedFunctions.unregister(testItem); - expect(result.items.value).toEqual([]); - }); - }); - }); - - describe('Passed in state', () => { - it('Defaults to internal selection state if no state is provided', () => { - mountComposable(() => { - const result: any = useGroupableParent(); - result._selection.value = [0]; - expect(result.selection.value).toEqual([0]); - }); - }); - - it('Uses passed in state if provided', () => { - mountComposable(() => { - const result: any = useGroupableParent({ - selection: ref([0]), - }); - - expect(result.selection.value).toEqual([0]); - }); - }); - - it('Calls provided onSelectionChange handler on selection changes', () => { - const onSelectionChange = jest.fn(); - - mountComposable(() => { - const result: any = useGroupableParent({ - onSelectionChange: onSelectionChange, - }); - - result.selection.value = [0]; - }); - - expect(onSelectionChange).toHaveBeenCalledWith([0]); - }); - - it('Sets the internal selection state on selection changes', () => { - mountComposable(() => { - const result: any = useGroupableParent(); - - result.selection.value = [0]; - - expect(result._selection.value).toEqual([0]); - }); - }); - }); - - describe('Selections', () => { - it('Toggles child items on and off when the toggle function is called', () => { - mountComposable(() => { - const result: any = useGroupableParent(); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - providedFunctions.register(testItem); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual([]); - }); - }); - - it('Does not toggle the item off if mandatory is enabled', () => { - mountComposable(() => { - const result: any = useGroupableParent(undefined, { mandatory: ref(true) }); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - providedFunctions.register(testItem); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - }); - }); - - it('Only allows one active item at a time', () => { - mountComposable(() => { - const result: any = useGroupableParent(); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - const testItem2 = { - active: ref(false), - value: 'test2', - }; - - providedFunctions.register(testItem); - providedFunctions.register(testItem2); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - providedFunctions.toggle(testItem2); - expect(result.selection.value).toEqual(['test2']); - }); - }); - - it('Allows multiple items if multiple flag is set', () => { - mountComposable(() => { - const result: any = useGroupableParent(undefined, { multiple: ref(true) }); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - const testItem2 = { - active: ref(false), - value: 'test2', - }; - - providedFunctions.register(testItem); - providedFunctions.register(testItem2); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - providedFunctions.toggle(testItem2); - expect(result.selection.value).toEqual(['test', 'test2']); - }); - }); - - it('Deselects individual items on toggle', () => { - mountComposable(() => { - const result: any = useGroupableParent(undefined, { multiple: ref(true) }); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - const testItem2 = { - active: ref(false), - value: 'test2', - }; - - providedFunctions.register(testItem); - providedFunctions.register(testItem2); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - providedFunctions.toggle(testItem2); - expect(result.selection.value).toEqual(['test', 'test2']); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test2']); - }); - }); - - it('Stops adding more items if max value is reached', () => { - mountComposable(() => { - const result: any = useGroupableParent(undefined, { - max: ref(2), - multiple: ref(true), - }); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - const testItem2 = { - active: ref(false), - value: 'test2', - }; - - const testItem3 = { - active: ref(false), - value: 'test3', - }; - - providedFunctions.register(testItem); - providedFunctions.register(testItem2); - providedFunctions.register(testItem3); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - providedFunctions.toggle(testItem2); - expect(result.selection.value).toEqual(['test', 'test2']); - providedFunctions.toggle(testItem3); - expect(result.selection.value).toEqual(['test', 'test2']); - }); - }); - - it('Disregards max option is option is set to -1', () => { - mountComposable(() => { - const result: any = useGroupableParent(undefined, { - multiple: ref(true), - max: ref(-1), - }); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - const testItem2 = { - active: ref(false), - value: 'test2', - }; - - providedFunctions.register(testItem); - providedFunctions.register(testItem2); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - providedFunctions.toggle(testItem2); - expect(result.selection.value).toEqual(['test', 'test2']); - }); - }); - - it('Does not let you remove the last item if multiple and mandatory is set', () => { - mountComposable(() => { - const result: any = useGroupableParent(undefined, { - mandatory: ref(true), - multiple: ref(true), - }); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - const testItem2 = { - active: ref(false), - value: 'test2', - }; - - const testItem3 = { - active: ref(false), - value: 'test3', - }; - - providedFunctions.register(testItem); - providedFunctions.register(testItem2); - providedFunctions.register(testItem3); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - providedFunctions.toggle(testItem2); - expect(result.selection.value).toEqual(['test', 'test2']); - providedFunctions.toggle(testItem3); - expect(result.selection.value).toEqual(['test', 'test2', 'test3']); - providedFunctions.toggle(testItem3); - providedFunctions.toggle(testItem2); - providedFunctions.toggle(testItem); - expect(result.selection.value).toEqual(['test']); - }); - }); - }); - - describe('updateChildren', () => { - it('Sets the children item states based on selection', () => { - mountComposable(async () => { - const result: any = useGroupableParent(); - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - const testItem2 = { - active: ref(false), - value: 'test2', - }; - - const testItem3 = { - active: ref(true), - }; - - providedFunctions.register(testItem); - providedFunctions.register(testItem2); - providedFunctions.register(testItem3); - - result.selection.value = ['test', 2]; - await Vue.nextTick(); // waits for the watch handler to kick in - expect(testItem.active.value).toBe(true); - expect(testItem2.active.value).toBe(false); - expect(testItem3.active.value).toBe(true); - - result.selection.value = []; - await Vue.nextTick(); - expect(testItem.active.value).toBe(false); - expect(testItem2.active.value).toBe(false); - expect(testItem3.active.value).toBe(false); - }); - }); - }); - - it('Extracts the right value for a given item', () => { - mountComposable(() => { - const result: any = useGroupableParent(); - - const providedFunctions: any = inject('item-group'); - - const testItem = { - active: ref(false), - value: 'test', - }; - - const testItem2 = { - active: ref(false), - value: 'test2', - }; - - const testItem3 = { - active: ref(false), - }; - - providedFunctions.register(testItem); - providedFunctions.register(testItem2); - providedFunctions.register(testItem3); - - expect(result.getValueForItem(testItem2)).toBe('test2'); - expect(result.getValueForItem(testItem3)).toBe(2); - }); - }); - }); -}); diff --git a/app/src/composables/groupable/groupable.ts b/app/src/composables/groupable/groupable.ts index 595b18a996..685ee8b26a 100644 --- a/app/src/composables/groupable/groupable.ts +++ b/app/src/composables/groupable/groupable.ts @@ -149,15 +149,15 @@ export function useGroupableParent( // Register a child within the context of this group function register(item: GroupableInstance) { items.value = [...items.value, item]; - const value = getValueForItem(item) + const value = getValueForItem(item); // If you're required to select a value, make sure a value is selected on first render if (selection.value.length === 0 && options?.mandatory?.value === true && items.value.length === 1) { selection.value = [value]; } - if(item.active.value && selection.value.includes(value) === false) { - toggle(item) + if (item.active.value && selection.value.includes(value) === false) { + toggle(item); } } diff --git a/app/src/composables/size-class/size-class.test.ts b/app/src/composables/size-class/size-class.test.ts deleted file mode 100644 index fca1ad03b6..0000000000 --- a/app/src/composables/size-class/size-class.test.ts +++ /dev/null @@ -1,86 +0,0 @@ -import useSizeClass from './size-class'; -import mountComposable from '../../../.jest/mount-composable'; - -describe('Composables / Size Class', () => { - it('Extracts the correct class based on given props', () => { - let props = { - xSmall: false, - small: false, - large: false, - xLarge: false, - ignoredKey: 'test', - }; - - mountComposable(() => { - const className = useSizeClass(props); - expect(className.value).toBe(null); - }).destroy(); - - props = { - xSmall: true, - small: false, - large: false, - xLarge: false, - ignoredKey: 'test', - }; - - mountComposable(() => { - const className = useSizeClass(props); - expect(className.value).toBe('x-small'); - }).destroy(); - - props = { - xSmall: false, - small: true, - large: false, - xLarge: false, - ignoredKey: 'test', - }; - - mountComposable(() => { - const className = useSizeClass(props); - expect(className.value).toBe('small'); - }).destroy(); - - props = { - xSmall: false, - small: false, - large: true, - xLarge: false, - ignoredKey: 'test', - }; - - mountComposable(() => { - const className = useSizeClass(props); - expect(className.value).toBe('large'); - }).destroy(); - - props = { - xSmall: false, - small: false, - large: false, - xLarge: true, - ignoredKey: 'test', - }; - - mountComposable(() => { - const className = useSizeClass(props); - expect(className.value).toBe('x-large'); - }).destroy(); - }); - - it('Defaults to the smallest size if multiple sizes are passed', () => { - const props = { - xSmall: false, - small: true, - large: true, - xLarge: true, - ignoredKey: 'test', - }; - - mountComposable(() => { - const className = useSizeClass(props); - expect(className.value).toBe('small'); - }).destroy(); - }); -}); diff --git a/app/src/composables/use-collection/use-collection.ts b/app/src/composables/use-collection/use-collection.ts index d14374bf1c..ece8090456 100644 --- a/app/src/composables/use-collection/use-collection.ts +++ b/app/src/composables/use-collection/use-collection.ts @@ -16,6 +16,20 @@ export function useCollection(collectionKey: string | Ref) { return fieldsStore.getFieldsForCollection(collection.value); }); + const defaults = computed(() => { + if (!fields.value) return {}; + + const defaults: Record = {}; + + for (const field of fields.value) { + if (field.schema?.default_value) { + defaults[field.field] = field.schema.default_value; + } + } + + return defaults; + }); + const primaryKeyField = computed(() => { // Every collection has a primary key; rules of the land // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -32,5 +46,9 @@ export function useCollection(collectionKey: string | Ref) { return info.value?.meta?.sort_field || null; }); - return { info, fields, primaryKeyField, userCreatedField, sortField }; + const isSingleton = computed(() => { + return info.value?.meta?.singleton === true; + }); + + return { info, fields, defaults, primaryKeyField, userCreatedField, sortField, isSingleton }; } diff --git a/app/src/composables/use-custom-selection/use-custom-selection.ts b/app/src/composables/use-custom-selection/use-custom-selection.ts index 343fa8a40a..726a2d26ef 100644 --- a/app/src/composables/use-custom-selection/use-custom-selection.ts +++ b/app/src/composables/use-custom-selection/use-custom-selection.ts @@ -8,7 +8,7 @@ export function useCustomSelection(currentValue: Ref, items: Ref, const otherValue = computed({ get() { - return localOtherValue.value; + return localOtherValue.value || (usesOtherValue.value ? currentValue.value : ''); }, set(newValue: string | null) { if (newValue === null) { @@ -27,9 +27,7 @@ export function useCustomSelection(currentValue: Ref, items: Ref, // Check if set value is one of the existing keys const values = items.value.map((item) => item.value); return ( - currentValue.value !== null && - currentValue.value.length > 0 && - values.includes(currentValue.value) === false + currentValue.value !== null && currentValue.value.length > 0 && values.includes(currentValue.value) === false ); }); diff --git a/app/src/composables/use-element-size/use-element-size.test.ts b/app/src/composables/use-element-size/use-element-size.test.ts deleted file mode 100644 index 1950fcbc04..0000000000 --- a/app/src/composables/use-element-size/use-element-size.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import mountComposable from '../../../.jest/mount-composable'; -import useElementSize from './use-element-size'; -import { ResizeObserver } from 'resize-observer'; -import { ref } from '@vue/composition-api'; - -jest.mock('resize-observer'); - -const mockResizeObserver = { - observe: jest.fn(), - disconnect: jest.fn(), -}; - -describe('Composables / useElementSize', () => { - beforeEach(() => { - (ResizeObserver as jest.Mock).mockImplementation(() => { - return mockResizeObserver; - }); - }); - - it('Creates a resize observer', () => { - const el = document.createElement('div'); - - mountComposable(() => { - useElementSize(el); - }); - - expect(ResizeObserver).toHaveBeenCalled(); - }); - - it('Calls observe with the passed element on mount', () => { - const el = document.createElement('div'); - - mountComposable(() => { - useElementSize(el); - }); - - expect(mockResizeObserver.observe).toHaveBeenCalledWith(el); - }); - - it('Calls observer with element if ref is passed', () => { - const el = document.createElement('div'); - - mountComposable(() => { - const refEl = ref(el); - useElementSize(refEl); - }); - - expect(mockResizeObserver.observe).toHaveBeenCalledWith(el); - }); - - it('Does not call observe when passed element is null or undefined', () => { - mountComposable(() => { - useElementSize(ref(null)); - }); - - expect(mockResizeObserver.observe).not.toHaveBeenCalled(); - }); - - it('Calls disconnect on unmount', () => { - const el = document.createElement('div'); - - mountComposable(() => { - useElementSize(el); - }).destroy(); - - expect(mockResizeObserver.disconnect).toHaveBeenCalled(); - }); - - it('Sets the returned width and height refs on ResizeObserver handler', () => { - let handler: (_: any) => void; - - (ResizeObserver as jest.Mock).mockImplementation((constructorParam) => { - handler = constructorParam; - return mockResizeObserver; - }); - - const el = document.createElement('div'); - - mountComposable(() => { - const { width, height } = useElementSize(el); - expect(width.value).toBe(0); - expect(height.value).toBe(0); - - handler([ - { - contentRect: { - width: 150, - height: 150, - }, - }, - ]); - - expect(width.value).toBe(150); - expect(height.value).toBe(150); - }); - }); -}); diff --git a/app/src/composables/use-event-listener/use-event-listener.test.ts b/app/src/composables/use-event-listener/use-event-listener.test.ts deleted file mode 100644 index 044756d224..0000000000 --- a/app/src/composables/use-event-listener/use-event-listener.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { ref } from '@vue/composition-api'; -import useEventListener from './use-event-listener'; -import mountComposable from '../../../.jest/mount-composable'; - -describe('Composables / Event Listener', () => { - it('Adds passed event listener onMounted', () => { - const map: any = {}; - - window.addEventListener = jest.fn((event, cb) => { - map[event] = cb; - }); - - window.removeEventListener = jest.fn((event) => { - delete map[event]; - }); - - const handler = () => {}; - - const component = mountComposable(() => { - useEventListener(window, 'keydown', handler); - }); - - expect(map.keydown).toBe(handler); - - component.destroy(); - - expect(map.keydown).toBe(undefined); - }); - - it('Uses the value if the target is a ref', () => { - const target = ref(window); - const map: any = {}; - - window.addEventListener = jest.fn((event, cb) => { - map[event] = cb; - }); - - window.removeEventListener = jest.fn((event) => { - delete map[event]; - }); - - const handler = () => {}; - - const component = mountComposable(() => { - useEventListener(target, 'keydown', handler); - }); - - expect(map.keydown).toBe(handler); - - component.destroy(); - - expect(map.keydown).toBe(undefined); - }); -}); diff --git a/app/src/composables/use-field-tree/types.ts b/app/src/composables/use-field-tree/types.ts index 017198e912..fbadb87503 100644 --- a/app/src/composables/use-field-tree/types.ts +++ b/app/src/composables/use-field-tree/types.ts @@ -3,5 +3,6 @@ import { TranslateResult } from 'vue-i18n'; export type FieldTree = { field: string; name: string | TranslateResult; + key: string; children?: FieldTree[]; }; diff --git a/app/src/composables/use-field-tree/use-field-tree.ts b/app/src/composables/use-field-tree/use-field-tree.ts index 7ebbf7b380..c259b05eca 100644 --- a/app/src/composables/use-field-tree/use-field-tree.ts +++ b/app/src/composables/use-field-tree/use-field-tree.ts @@ -2,66 +2,109 @@ import { Ref, computed } from '@vue/composition-api'; import { FieldTree } from './types'; import { useFieldsStore, useRelationsStore } from '@/stores/'; import { Field, Relation } from '@/types'; +import { cloneDeep } from 'lodash'; +import { getRelationType } from '@/utils/get-relation-type'; export default function useFieldTree(collection: Ref, inject?: { fields: Field[]; relations: Relation[] }) { const fieldsStore = useFieldsStore(); const relationsStore = useRelationsStore(); - const tree = computed(() => { - return [...fieldsStore.getFieldsForCollection(collection.value), ...(inject?.fields || [])] - .filter((field: Field) => { - const shown = - field.meta?.special?.includes('alias') !== true && - field.meta?.special?.includes('no-data') !== true; - return shown; - }) - .map((field: Field) => parseField(field, [])); - - function parseField(field: Field, parents: Field[]) { - const fieldInfo: FieldTree = { - field: field.field, - name: field.name, - }; - - if (parents.length === 2) { - return fieldInfo; - } - - const relations = [ - ...relationsStore.getRelationsForField(field.collection, field.field), - ...(inject?.relations || []).filter( - (relation) => - (relation.many_collection === field.collection && relation.many_field === field.field) || - (relation.one_collection === field.collection && relation.one_field === field.field) - ), - ]; - - if (relations.length > 0) { - const relatedFields = relations - .map((relation: Relation) => { - const relatedCollection = - relation.many_collection === field.collection - ? relation.one_collection - : relation.many_collection; - - if (relation.junction_field === field.field) return []; - - return fieldsStore.getFieldsForCollection(relatedCollection).filter((field: Field) => { - const shown = - field.meta?.special?.includes('alias') !== true && - field.meta?.special?.includes('no-data') !== true; - return shown; - }); - }) - .flat() - .map((childField: Field) => parseField(childField, [...parents, field])); - - fieldInfo.children = relatedFields; - } - - return fieldInfo; - } - }); + const tree = computed(() => parseLevel(collection.value, null)); return { tree }; + + function parseLevel(collection: string, parentPath: string | null, level = 0) { + const fieldsInLevel = cloneDeep(fieldsStore.getFieldsForCollection(collection)) + .filter((field: Field) => { + const shown = + field.meta?.special?.includes('alias') !== true && field.meta?.special?.includes('no-data') !== true; + return shown; + }) + .map((field: Field) => ({ + name: field.name, + field: field.field, + key: parentPath ? `${parentPath}.${field.field}` : field.field, + })); + + if (level >= 3) return fieldsInLevel; + + for (const field of fieldsInLevel) { + const relations = relationsStore.getRelationsForField(collection, field.field); + const relation = relations.find( + (relation: Relation) => + (relation.many_collection === collection && relation.many_field === field.field) || + (relation.one_collection === collection && relation.one_field === field.field) + ); + if (!relation) continue; + const relationType = getRelationType({ relation, collection, field: field.field }); + + if (relationType === 'm2o') { + field.children = parseLevel( + relation.one_collection, + parentPath ? `${parentPath}.${field.field}` : field.field, + level + 1 + ); + } + } + + return fieldsInLevel; + } + + // const tree = computed(() => { + // return [...fieldsStore.getFieldsForCollection(collection.value), ...(inject?.fields || [])] + // .filter((field: Field) => { + // const shown = + // field.meta?.special?.includes('alias') !== true && + // field.meta?.special?.includes('no-data') !== true; + // return shown; + // }) + // .map((field: Field) => parseField(field, [])); + + // function parseField(field: Field, parents: Field[]) { + // const fieldInfo: FieldTree = { + // field: field.field, + // name: field.name, + // }; + + // if (parents.length === 2) { + // return fieldInfo; + // } + + // const relations = [ + // ...relationsStore.getRelationsForField(field.collection, field.field), + // ...(inject?.relations || []).filter( + // (relation) => + // (relation.many_collection === field.collection && relation.many_field === field.field) || + // (relation.one_collection === field.collection && relation.one_field === field.field) + // ), + // ]; + + // if (relations.length > 0) { + // const relatedFields = relations + // .map((relation: Relation) => { + // const relatedCollection = + // relation.many_collection === field.collection + // ? relation.one_collection + // : relation.many_collection; + + // if (relation.junction_field === field.field) return []; + + // return fieldsStore.getFieldsForCollection(relatedCollection).filter((field: Field) => { + // const shown = + // field.meta?.special?.includes('alias') !== true && + // field.meta?.special?.includes('no-data') !== true; + // return shown; + // }); + // }) + // .flat() + // .map((childField: Field) => parseField(childField, [...parents, field])); + + // fieldInfo.children = relatedFields; + // } + + // return fieldInfo; + // } + // }); + + // return { tree }; } diff --git a/app/src/composables/use-item/use-item.ts b/app/src/composables/use-item/use-item.ts index a1f0466456..00ba8c316a 100644 --- a/app/src/composables/use-item/use-item.ts +++ b/app/src/composables/use-item/use-item.ts @@ -1,10 +1,11 @@ import api from '@/api'; import { Ref, ref, watch, computed } from '@vue/composition-api'; -import notify from '@/utils/notify'; import i18n from '@/lang'; import useCollection from '@/composables/use-collection'; import { AxiosResponse } from 'axios'; import { APIError } from '@/types'; +import { notify } from '@/utils/notify'; +import { unexpectedError } from '@/utils/unexpected-error'; export function useItem(collection: Ref, primaryKey: Ref) { const { info: collectionInfo, primaryKeyField } = useCollection(collection); @@ -16,7 +17,7 @@ export function useItem(collection: Ref, primaryKey: Ref>({}); const isNew = computed(() => primaryKey.value === '+'); const isBatch = computed(() => typeof primaryKey.value === 'string' && primaryKey.value.includes(',')); const isSingle = computed(() => !!collectionInfo.value?.meta?.singleton); @@ -108,30 +109,22 @@ export function useItem(collection: Ref, primaryKey: Ref err.extensions.code === 'FAILED_VALIDATION') + .filter((err: APIError) => err?.extensions?.code === 'FAILED_VALIDATION') .map((err: APIError) => { return err.extensions; }); + + const otherErrors = err.response.data.errors.filter( + (err: APIError) => err?.extensions?.code !== 'FAILED_VALIDATION' + ); + + if (otherErrors.length > 0) { + otherErrors.forEach(unexpectedError); + } + } else { + unexpectedError(err); } throw err; @@ -158,28 +151,23 @@ export function useItem(collection: Ref, primaryKey: Ref err.extensions.code === 'FAILED_VALIDATION') + .filter((err: APIError) => err?.extensions?.code === 'FAILED_VALIDATION') .map((err: APIError) => { return err.extensions; }); } else { + unexpectedError(err); throw err; } } finally { @@ -222,15 +210,7 @@ export function useItem(collection: Ref, primaryKey: Ref, primaryKey: Ref, item: Ref, isNew: Ref) { + const userStore = useUserStore(); + const permissionsStore = usePermissionsStore(); + + const { info: collectionInfo, fields: rawFields } = useCollection(collection); + + const deleteAllowed = computed(() => isAllowed(collection.value, 'delete', item.value)); + + const saveAllowed = computed(() => { + if (isNew.value) { + return true; + } + + return isAllowed(collection.value, 'update', item.value); + }); + + const updateAllowed = computed(() => isAllowed(collection.value, 'update', item.value)); + + const archiveAllowed = computed(() => { + if (!collectionInfo.value?.meta?.archive_field) return false; + + return isAllowed( + collection.value, + 'update', + { + [collectionInfo.value.meta.archive_field]: collectionInfo.value.meta.archive_value, + }, + true + ); + }); + + const fields = computed(() => { + if (userStore.state.currentUser?.role?.admin_access === true) return rawFields.value; + + const permissions = permissionsStore.getPermissionsForUser(collection.value, isNew.value ? 'create' : 'update'); + + if (!permissions) return rawFields.value; + + if (permissions?.fields?.includes('*') === true) return rawFields.value; + + return rawFields.value.map((field: Field) => { + field = cloneDeep(field); + + if (permissions.fields.includes(field.field) === false) { + field.meta = { + ...(field.meta || {}), + readonly: true, + } as any; + } + + if (permissions.presets && field.field in permissions.presets) { + field.schema = { + ...(field.schema || {}), + default_value: permissions.presets[field.field], + } as any; + } + + return field; + }); + }); + + return { deleteAllowed, saveAllowed, archiveAllowed, updateAllowed, fields }; +} diff --git a/app/src/composables/use-scroll-distance/use-scroll-distance.test.ts b/app/src/composables/use-scroll-distance/use-scroll-distance.test.ts deleted file mode 100644 index 4997e1cdb6..0000000000 --- a/app/src/composables/use-scroll-distance/use-scroll-distance.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { shallowMount, createLocalVue } from '@vue/test-utils'; -import VueCompositionAPI, { defineComponent, ref, onMounted } from '@vue/composition-api'; -import useScrollDistance from './use-scroll-distance'; -import mountComposable from '../../../.jest/mount-composable'; -import Vue from 'vue'; -import VSheet from '@/components/v-sheet'; - -const localVue = createLocalVue(); -localVue.use(VueCompositionAPI); - -describe('Composables / useScrollDistance', () => { - it('Returns the correct scroll position', () => { - const TestComponent = defineComponent({ - setup() { - const el = ref(null); - - const { top, left } = useScrollDistance(el); - - onMounted(() => { - el.value!.scrollTop = 150; - el.value!.scrollLeft = 200; - el.value!.dispatchEvent(new Event('scroll')); - - expect(top.value).toBe(150); - expect(left.value).toBe(200); - }); - - return { el }; - }, - template: ` -
-
-
- `, - }); - - shallowMount(TestComponent, { localVue }); - }); - - it('Supports elements or refs for param', () => { - mountComposable(() => { - const testEl = null; - const testVal = ref(testEl); - const result = useScrollDistance(testVal); - expect(result.target.value).toBe(null); - }).destroy(); - - mountComposable(() => { - const testEl = document.createElement('div'); - const testVal = testEl; - const result = useScrollDistance(testVal); - expect(result.target.value).toBe(testEl); - }).destroy(); - - mountComposable(() => { - const testEl = document.createElement('div'); - const testVal = ref(testEl); - const result = useScrollDistance(testVal); - expect(result.target.value).toBe(testEl); - }).destroy(); - - const TestComponent = defineComponent({ - components: { VSheet }, - setup() { - const el = ref(null); - const { target } = useScrollDistance(el as any); - - onMounted(() => { - expect(target.value instanceof HTMLElement).toBe(true); - }); - - return { el }; - }, - template: ` - -
- - `, - }); - - shallowMount(TestComponent, { localVue }).destroy(); - }); -}); diff --git a/app/src/composables/use-shortcut/use-shortcut.ts b/app/src/composables/use-shortcut/use-shortcut.ts index 3bfd8c6ca2..a4b34c52c0 100644 --- a/app/src/composables/use-shortcut/use-shortcut.ts +++ b/app/src/composables/use-shortcut/use-shortcut.ts @@ -69,14 +69,7 @@ function mapKeys(key: string) { }; key = map.hasOwnProperty(key) ? map[key] : key; - - if (key.match(/^[a-z]$/) !== null) { - if (keysdown.has('shift')) key = key.toUpperCase(); - } else if (key.match(/^[A-Z]$/) !== null) { - if (keysdown.has('shift')) key = key.toLowerCase(); - } else { - key = key.toLowerCase(); - } + key = key.toLowerCase(); return key; } @@ -88,6 +81,7 @@ function callHandlers(event: KeyboardEvent) { for (key of keysdown) { if (keys.includes(key) === false) return; } + for (key of keys) { if (keysdown.has(key) === false) return; } diff --git a/app/src/composables/use-sync/use-sync.ts b/app/src/composables/use-sync/use-sync.ts index 21bfc436f0..38801968a1 100644 --- a/app/src/composables/use-sync/use-sync.ts +++ b/app/src/composables/use-sync/use-sync.ts @@ -4,7 +4,7 @@ export default function useSync( props: T, key: K, emit: (event: string, ...args: any[]) => void -): Ref> { +): Ref { return computed({ get() { return props[key]; diff --git a/app/src/composables/use-window-size/use-window-size.test.ts b/app/src/composables/use-window-size/use-window-size.test.ts deleted file mode 100644 index 9b80b88319..0000000000 --- a/app/src/composables/use-window-size/use-window-size.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { watch } from '@vue/composition-api'; -import useWindowSize from './use-window-size'; -import mountComposable from '../../../.jest/mount-composable'; - -describe('Composables / Window Size', () => { - it('Adds passed event listener onMounted', async () => { - let testWidth = 0; - - const component = mountComposable(() => { - const { width } = useWindowSize(); - - watch(width, (val: number) => (testWidth = val)); - }); - - expect(testWidth).toBe(0); - - // @ts-ignore - window.innerWidth = 1024; - window.dispatchEvent(new Event('resize')); - - await component.vm.$nextTick(); - - expect(testWidth).toBe(1024); - }); - - it('Adds / removes resize event handler on mount / unmount', async () => { - const map: any = {}; - - window.addEventListener = jest.fn((event, cb) => { - map[event] = cb; - }); - - window.removeEventListener = jest.fn((event) => { - delete map[event]; - }); - - const component = mountComposable(() => { - useWindowSize(); - }); - - expect(map.resize).toBeTruthy(); - - component.destroy(); - - expect(map.keydown).toBe(undefined); - }); -}); diff --git a/app/src/directives/click-outside/click-outside.test.ts b/app/src/directives/click-outside/click-outside.test.ts deleted file mode 100644 index e79535edc7..0000000000 --- a/app/src/directives/click-outside/click-outside.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { processValue } from './click-outside'; - -describe('Directives / Click Outside', () => { - describe('processValue', () => { - it('Uses passed function as handler', () => { - const mockFn = () => {}; - const value = processValue(mockFn); - expect(value.handler).toBe(mockFn); - }); - - it('Uses passed options as value', () => { - const mockHandlerFn = () => {}; - const mockMiddlewareFn = () => true; - const mockOptions = { - handler: mockHandlerFn, - middleware: mockMiddlewareFn, - events: ['test'], - disabled: true, - }; - const value = processValue(mockOptions); - expect(value.handler).toBe(mockHandlerFn); - expect(value.middleware).toBe(mockMiddlewareFn); - expect(value.events).toEqual(['test']); - expect(value.disabled).toBe(true); - }); - - it('Uses default values if options are missing', () => { - const mockOptions = {}; - const value = processValue(mockOptions); - expect(value.handler).toBeInstanceOf(Function); - expect(value.middleware).toBeInstanceOf(Function); - expect(value.events).toEqual(['pointerdown']); - expect(value.disabled).toBe(false); - }); - }); -}); diff --git a/app/src/directives/focus/focus.test.ts b/app/src/directives/focus/focus.test.ts deleted file mode 100644 index 7aca7e8d42..0000000000 --- a/app/src/directives/focus/focus.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Focus from './focus'; - -describe('Directives / Focus', () => { - it('Calls focus() on the element if binding is truthy', () => { - const el = { focus: jest.fn() }; - Focus.inserted!(el as any, { value: true } as any, null as any, null as any); - expect(el.focus).toHaveBeenCalled(); - }); - - it('Calls blur() on the element if binding is false', () => { - const el = { blur: jest.fn() }; - Focus.inserted!(el as any, { value: false } as any, null as any, null as any); - expect(el.blur).toHaveBeenCalled(); - }); -}); diff --git a/app/src/displays/color/color.vue b/app/src/displays/color/color.vue index b37ec1e126..2606536423 100644 --- a/app/src/displays/color/color.vue +++ b/app/src/displays/color/color.vue @@ -38,7 +38,7 @@ export default defineComponent({ const pageColorRGB = Color(pageColorString); const colorRGB = props.value === null ? Color(props.defaultColor) : Color(props.value); - if (colorRGB.contrast(pageColorRGB) < 3) style['border'] = '1px solid var(--border-normal-alt)'; + if (colorRGB.contrast(pageColorRGB) < 1.5) style['border'] = '1px solid var(--border-normal-alt)'; return style; }); @@ -50,7 +50,7 @@ export default defineComponent({ diff --git a/app/src/displays/file/file.vue b/app/src/displays/file/file.vue index a057ddc902..2f893a598b 100644 --- a/app/src/displays/file/file.vue +++ b/app/src/displays/file/file.vue @@ -19,6 +19,7 @@ import { defineComponent, PropType, computed, ref } from '@vue/composition-api'; import readableMimeType from '@/utils/readable-mime-type'; import useElementSize from '@/composables/use-element-size'; import getRootPath from '@/utils/get-root-path'; +import { addTokenToURL } from '@/api'; type File = { id: string; @@ -42,9 +43,9 @@ export default defineComponent({ const imageThumbnail = computed(() => { if (!props.value) return null; - if (props.value.type.includes('svg')) return getRootPath() + `assets/${props.value.id}`; + if (props.value.type.includes('svg')) return addTokenToURL(getRootPath() + `assets/${props.value.id}`); if (props.value.type.includes('image') === false) return null; - return getRootPath() + `assets/${props.value.id}?key=system-small-cover`; + return addTokenToURL(getRootPath() + `assets/${props.value.id}?key=system-small-cover`); }); const { height } = useElementSize(previewEl); diff --git a/app/src/displays/formatted-json-value/formatted-json-value.vue b/app/src/displays/formatted-json-value/formatted-json-value.vue new file mode 100644 index 0000000000..226b13332f --- /dev/null +++ b/app/src/displays/formatted-json-value/formatted-json-value.vue @@ -0,0 +1,37 @@ + + + diff --git a/app/src/displays/formatted-json-value/index.ts b/app/src/displays/formatted-json-value/index.ts new file mode 100644 index 0000000000..6cff4e7280 --- /dev/null +++ b/app/src/displays/formatted-json-value/index.ts @@ -0,0 +1,25 @@ +import { defineDisplay } from '@/displays/define'; +import DisplayJsonValue from './formatted-json-value.vue'; + +export default defineDisplay(({ i18n }) => ({ + id: 'formatted-json-value', + name: i18n.t('displays.formatted-json-value.formatted-json-value'), + description: i18n.t('displays.formatted-json-value.description'), + types: ['json'], + icon: 'settings_ethernet', + handler: DisplayJsonValue, + options: [ + { + field: 'format', + name: i18n.t('display_template'), + type: 'string', + meta: { + width: 'full', + interface: 'text-input', + options: { + placeholder: '{{ field }}', + }, + }, + }, + ], +})); diff --git a/app/src/displays/formatted-value/formatted-value.vue b/app/src/displays/formatted-value/formatted-value.vue index 8d1da01878..7fdcb7cc9d 100644 --- a/app/src/displays/formatted-value/formatted-value.vue +++ b/app/src/displays/formatted-value/formatted-value.vue @@ -18,7 +18,7 @@ export default defineComponent({ }, formatTitle: { type: Boolean, - default: true, + default: false, }, bold: { type: Boolean, diff --git a/app/src/displays/formatted-value/index.ts b/app/src/displays/formatted-value/index.ts index ab0bfb4399..e4f247f8b1 100644 --- a/app/src/displays/formatted-value/index.ts +++ b/app/src/displays/formatted-value/index.ts @@ -21,7 +21,7 @@ export default defineDisplay(({ i18n }) => ({ }, }, schema: { - default_value: true, + default_value: false, }, }, { diff --git a/app/src/displays/image/image.vue b/app/src/displays/image/image.vue index a461ff7f54..6c4b6a7ef4 100644 --- a/app/src/displays/image/image.vue +++ b/app/src/displays/image/image.vue @@ -7,6 +7,7 @@ import { defineComponent, PropType, computed } from '@vue/composition-api'; import ValueNull from '@/views/private/components/value-null'; import getRootPath from '@/utils/get-root-path'; +import { addTokenToURL } from '@/api'; type Image = { id: string; @@ -29,7 +30,9 @@ export default defineComponent({ setup(props) { const src = computed(() => { if (props.value === null) return null; - return getRootPath() + `assets/${props.value.id}?key=system-small-cover`; + const url = getRootPath() + `assets/${props.value.id}?key=system-small-cover`; + + return addTokenToURL(url); }); return { src }; diff --git a/app/src/displays/labels/index.ts b/app/src/displays/labels/index.ts index a2ed5afdb3..131578092d 100644 --- a/app/src/displays/labels/index.ts +++ b/app/src/displays/labels/index.ts @@ -5,7 +5,7 @@ export default defineDisplay(({ i18n }) => ({ id: 'labels', name: i18n.t('displays.labels.labels'), description: i18n.t('displays.labels.description'), - types: ['string', 'json'], + types: ['string', 'json', 'csv'], icon: 'flag', handler: DisplayLabels, options: [ diff --git a/app/src/displays/labels/labels.vue b/app/src/displays/labels/labels.vue index 1738321b12..c5490dbb2c 100644 --- a/app/src/displays/labels/labels.vue +++ b/app/src/displays/labels/labels.vue @@ -1,5 +1,5 @@